guohui 1 год назад
Родитель
Сommit
36b2872fdb
12 измененных файлов с 1358 добавлено и 3 удалено
  1. 6 1
      pro/CMakeLists.txt
  2. 2 2
      pro/src/sys.c
  3. 1 0
      pro/src/thread.c
  4. 1 0
      pro/src/thread.h
  5. 472 0
      pro/ui/font.c
  6. 30 0
      pro/ui/font.h
  7. 99 0
      pro/ui/gpio.c
  8. 14 0
      pro/ui/gpio.h
  9. 518 0
      pro/ui/lcd.c
  10. 83 0
      pro/ui/lcd.h
  11. 125 0
      pro/ui/ui.c
  12. 7 0
      pro/ui/ui.h

+ 6 - 1
pro/CMakeLists.txt

@@ -39,7 +39,7 @@ include_directories (${PROJECT_SOURCE_DIR}/upgrade)
 include_directories (${PROJECT_SOURCE_DIR}/config)
 include_directories (${PROJECT_SOURCE_DIR}/qrcode)
 include_directories (${PROJECT_SOURCE_DIR}/src)
-
+include_directories (${PROJECT_SOURCE_DIR}/ui)
 
 link_directories(${PROJECT_SOURCE_DIR}/appweb/lib)
 link_directories(${PROJECT_SOURCE_DIR}/snmp/lib)
@@ -68,6 +68,11 @@ set(PDU_SRC_LIST
 
     ${PROJECT_SOURCE_DIR}/qrcode/qrcode.c
     ${PROJECT_SOURCE_DIR}/qrcode/qrc.c
+    
+    ${PROJECT_SOURCE_DIR}/ui/font.c
+	${PROJECT_SOURCE_DIR}/ui/gpio.c
+    ${PROJECT_SOURCE_DIR}/ui/lcd.c
+    ${PROJECT_SOURCE_DIR}/ui/ui.c
 
 	${PROJECT_SOURCE_DIR}/mongoose/mongoose.c
 	${PROJECT_SOURCE_DIR}/src/websocket_handle.c

+ 2 - 2
pro/src/sys.c

@@ -1514,7 +1514,7 @@ int sys_chmod(void)
     return 0;
 }
 
-
+#include "ui.h"
 int sys_init(void)
 {
     initLogger();
@@ -1524,7 +1524,7 @@ int sys_init(void)
     sys_chmod();
     init_hash_table();
     
-    //nic_restart(DFLT_NIC);
+    //ui_init();
     thread_start(THREAD_ID_POLLING, polling_thread, NULL);
 
     return 0;

+ 1 - 0
pro/src/thread.c

@@ -20,6 +20,7 @@ static thread_attr_t thdAttrs[THREAD_ID_MAX]={
     {"mail",        NULL,           NULL,           8*MB,           1},
     {"modbus_tcp",  NULL,           NULL,           8*MB,           1},
     {"board",       NULL,           NULL,           8*MB,           1},
+    {"ui",          NULL,           NULL,           8*MB,           1},
 };
 static thread_handle_t thdHandles[THREAD_ID_MAX]={0};
 

+ 1 - 0
pro/src/thread.h

@@ -31,6 +31,7 @@ enum {
     THREAD_ID_MAIL,
     THREAD_ID_TCP,
     THREAD_ID_BOARD,        //board upgrade
+    THREAD_ID_UI,
     
     THREAD_ID_MAX
 };

+ 472 - 0
pro/ui/font.c

@@ -0,0 +1,472 @@
+#include "font.h"
+
+//Arial Helvetica  Verdana
+
+static const uint8_t font_0806[95][6] =
+{
+{0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
+{0x00,0x00,0x00,0x2f,0x00,0x00},/*"!",1*/
+{0x00,0x00,0x07,0x00,0x07,0x00},/*""",2*/
+{0x00,0x14,0x7f,0x14,0x7f,0x14},/*"#",3*/
+{0x00,0x24,0x2a,0x7f,0x2a,0x12},/*"$",4*/
+{0x00,0x62,0x64,0x08,0x13,0x23},/*"%",5*/
+{0x00,0x36,0x49,0x55,0x22,0x50},/*"&",6*/
+{0x00,0x00,0x05,0x03,0x00,0x00},/*"'",7*/
+{0x00,0x00,0x1c,0x22,0x41,0x00},/*"(",8*/
+{0x00,0x00,0x41,0x22,0x1c,0x00},/*")",9*/
+{0x00,0x14,0x08,0x3E,0x08,0x14},/*"*",10*/
+{0x00,0x08,0x08,0x3E,0x08,0x08},/*"+",11*/
+{0x00,0x00,0x00,0xA0,0x60,0x00},/*",",12*/
+{0x00,0x08,0x08,0x08,0x08,0x08},/*"-",13*/
+{0x00,0x00,0x60,0x60,0x00,0x00},/*".",14*/
+{0x00,0x20,0x10,0x08,0x04,0x02},/*"/",15*/
+{0x00,0x3E,0x51,0x49,0x45,0x3E},/*"0",16*/
+{0x00,0x00,0x42,0x7F,0x40,0x00},/*"1",17*/
+{0x00,0x42,0x61,0x51,0x49,0x46},/*"2",18*/
+{0x00,0x21,0x41,0x45,0x4B,0x31},/*"3",19*/
+{0x00,0x18,0x14,0x12,0x7F,0x10},/*"4",20*/
+{0x00,0x27,0x45,0x45,0x45,0x39},/*"5",21*/
+{0x00,0x3C,0x4A,0x49,0x49,0x30},/*"6",22*/
+{0x00,0x01,0x71,0x09,0x05,0x03},/*"7",23*/
+{0x00,0x36,0x49,0x49,0x49,0x36},/*"8",24*/
+{0x00,0x06,0x49,0x49,0x29,0x1E},/*"9",25*/
+{0x00,0x28,0x28,0x00,0x00,0x00},/*":",26*/
+{0x00,0x48,0x28,0x00,0x00,0x00},/*";",27*/
+{0x00,0x08,0x14,0x22,0x41,0x00},/*"<",28*/
+{0x00,0x14,0x14,0x14,0x14,0x14},/*"=",29*/
+{0x00,0x00,0x41,0x22,0x14,0x08},/*">",30*/
+{0x00,0x02,0x01,0x51,0x09,0x06},/*"?",31*/
+{0x00,0x32,0x49,0x59,0x51,0x3E},/*"@",32*/
+{0x00,0x7C,0x12,0x11,0x12,0x7C},/*"A",33*/
+{0x00,0x7F,0x49,0x49,0x49,0x36},/*"B",34*/
+{0x00,0x3E,0x41,0x41,0x41,0x22},/*"C",35*/
+{0x00,0x7F,0x41,0x41,0x22,0x1C},/*"D",36*/
+{0x00,0x7F,0x49,0x49,0x49,0x41},/*"E",37*/
+{0x00,0x7F,0x09,0x09,0x09,0x01},/*"F",38*/
+{0x00,0x3E,0x41,0x49,0x49,0x7A},/*"G",39*/
+{0x00,0x7F,0x08,0x08,0x08,0x7F},/*"H",40*/
+{0x00,0x00,0x41,0x7F,0x41,0x00},/*"I",41*/
+{0x00,0x20,0x40,0x41,0x3F,0x01},/*"J",42*/
+{0x00,0x7F,0x08,0x14,0x22,0x41},/*"K",43*/
+{0x00,0x7F,0x40,0x40,0x40,0x40},/*"L",44*/
+{0x00,0x7F,0x02,0x0C,0x02,0x7F},/*"M",45*/
+{0x00,0x7F,0x04,0x08,0x10,0x7F},/*"N",46*/
+{0x00,0x3E,0x41,0x41,0x41,0x3E},/*"O",47*/
+{0x00,0x7F,0x09,0x09,0x09,0x06},/*"P",48*/
+{0x00,0x3E,0x41,0x51,0x21,0x5E},/*"Q",49*/
+{0x00,0x7F,0x09,0x19,0x29,0x46},/*"R",50*/
+{0x00,0x46,0x49,0x49,0x49,0x31},/*"S",51*/
+{0x00,0x01,0x01,0x7F,0x01,0x01},/*"T",52*/
+{0x00,0x3F,0x40,0x40,0x40,0x3F},/*"U",53*/
+{0x00,0x1F,0x20,0x40,0x20,0x1F},/*"V",54*/
+{0x00,0x3F,0x40,0x38,0x40,0x3F},/*"W",55*/
+{0x00,0x63,0x14,0x08,0x14,0x63},/*"X",56*/
+{0x00,0x07,0x08,0x70,0x08,0x07},/*"Y",57*/
+{0x00,0x61,0x51,0x49,0x45,0x43},/*"Z",58*/
+{0x00,0x00,0x7F,0x41,0x41,0x00},/*"[",59*/
+{0x00,0x55,0x2A,0x55,0x2A,0x55},/*"\",60*/
+{0x00,0x00,0x41,0x41,0x7F,0x00},/*"]",61*/
+{0x00,0x04,0x02,0x01,0x02,0x04},/*"^",62*/
+{0x00,0x40,0x40,0x40,0x40,0x40},/*"_",63*/
+{0x00,0x00,0x01,0x02,0x04,0x00},/*"`",64*/
+{0x00,0x20,0x54,0x54,0x54,0x78},/*"a",65*/
+{0x00,0x7F,0x48,0x44,0x44,0x38},/*"b",66*/
+{0x00,0x38,0x44,0x44,0x44,0x20},/*"c",67*/
+{0x00,0x38,0x44,0x44,0x48,0x7F},/*"d",68*/
+{0x00,0x38,0x54,0x54,0x54,0x18},/*"e",69*/
+{0x00,0x08,0x7E,0x09,0x01,0x02},/*"f",70*/
+{0x00,0x18,0xA4,0xA4,0xA4,0x7C},/*"g",71*/
+{0x00,0x7F,0x08,0x04,0x04,0x78},/*"h",72*/
+{0x00,0x00,0x44,0x7D,0x40,0x00},/*"i",73*/
+{0x00,0x40,0x80,0x84,0x7D,0x00},/*"j",74*/
+{0x00,0x7F,0x10,0x28,0x44,0x00},/*"k",75*/
+{0x00,0x00,0x41,0x7F,0x40,0x00},/*"l",76*/
+{0x00,0x7C,0x04,0x18,0x04,0x78},/*"m",77*/
+{0x00,0x7C,0x08,0x04,0x04,0x78},/*"n",78*/
+{0x00,0x38,0x44,0x44,0x44,0x38},/*"o",79*/
+{0x00,0xFC,0x24,0x24,0x24,0x18},/*"p",80*/
+{0x00,0x18,0x24,0x24,0x18,0xFC},/*"q",81*/
+{0x00,0x7C,0x08,0x04,0x04,0x08},/*"r",82*/
+{0x00,0x48,0x54,0x54,0x54,0x20},/*"s",83*/
+{0x00,0x04,0x3F,0x44,0x40,0x20},/*"t",84*/
+{0x00,0x3C,0x40,0x40,0x20,0x7C},/*"u",85*/
+{0x00,0x1C,0x20,0x40,0x20,0x1C},/*"v",86*/
+{0x00,0x3C,0x40,0x30,0x40,0x3C},/*"w",87*/
+{0x00,0x44,0x28,0x10,0x28,0x44},/*"x",88*/
+{0x00,0x1C,0xA0,0xA0,0xA0,0x7C},/*"y",89*/
+{0x00,0x44,0x64,0x54,0x4C,0x44},/*"z",90*/
+{0x10,0xEE,0x82,0x82,0x00,0x00},/*"{",91*/
+{0x00,0xFE,0x00,0x00,0x00,0x00},/*"|",92*/
+{0x82,0x82,0xEE,0x10,0x00,0x00},/*"}",93*/
+{0x10,0x08,0x08,0x10,0x18,0x00},/*"~",94*/
+};
+static const uint8_t font_1206[95][12] =
+{
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
+{0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00},/*"!",1*/
+{0x00,0x0C,0x02,0x0C,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
+{0x90,0xD0,0xBC,0xD0,0xBC,0x90,0x00,0x03,0x00,0x03,0x00,0x00},/*"#",3*/
+{0x18,0x24,0xFE,0x44,0x8C,0x00,0x03,0x02,0x07,0x02,0x01,0x00},/*"$",4*/
+{0x18,0x24,0xD8,0xB0,0x4C,0x80,0x00,0x03,0x00,0x01,0x02,0x01},/*"%",5*/
+{0xC0,0x38,0xE4,0x38,0xE0,0x00,0x01,0x02,0x02,0x01,0x02,0x02},/*"&",6*/
+{0x08,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
+{0x00,0x00,0x00,0xF8,0x04,0x02,0x00,0x00,0x00,0x01,0x02,0x04},/*"(",8*/
+{0x00,0x02,0x04,0xF8,0x00,0x00,0x00,0x04,0x02,0x01,0x00,0x00},/*")",9*/
+{0x90,0x60,0xF8,0x60,0x90,0x00,0x00,0x00,0x01,0x00,0x00,0x00},/*"*",10*/
+{0x20,0x20,0xFC,0x20,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00},/*"+",11*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x00,0x00,0x00},/*",",12*/
+{0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00},/*".",14*/
+{0x00,0x80,0x60,0x1C,0x02,0x00,0x04,0x03,0x00,0x00,0x00,0x00},/*"/",15*/
+{0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"0",16*/
+{0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00},/*"1",17*/
+{0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00},/*"2",18*/
+{0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"3",19*/
+{0x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x00,0x00,0x03,0x02,0x00},/*"4",20*/
+{0x3C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"5",21*/
+{0xF8,0x24,0x24,0x2C,0xC0,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"6",22*/
+{0x0C,0x04,0xE4,0x1C,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00},/*"7",23*/
+{0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"8",24*/
+{0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x03,0x02,0x02,0x01,0x00},/*"9",25*/
+{0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00},/*":",26*/
+{0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00},/*";",27*/
+{0x00,0x20,0x50,0x88,0x04,0x02,0x00,0x00,0x00,0x00,0x01,0x02},/*"<",28*/
+{0x90,0x90,0x90,0x90,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/
+{0x00,0x02,0x04,0x88,0x50,0x20,0x00,0x02,0x01,0x00,0x00,0x00},/*">",30*/
+{0x18,0x04,0xC4,0x24,0x18,0x00,0x00,0x00,0x02,0x00,0x00,0x00},/*"?",31*/
+{0xF8,0x04,0xE4,0x94,0xF8,0x00,0x01,0x02,0x02,0x02,0x02,0x00},/*"@",32*/
+{0x00,0xE0,0x9C,0xF0,0x80,0x00,0x02,0x03,0x00,0x00,0x03,0x02},/*"A",33*/
+{0x04,0xFC,0x24,0x24,0xD8,0x00,0x02,0x03,0x02,0x02,0x01,0x00},/*"B",34*/
+{0xF8,0x04,0x04,0x04,0x0C,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"C",35*/
+{0x04,0xFC,0x04,0x04,0xF8,0x00,0x02,0x03,0x02,0x02,0x01,0x00},/*"D",36*/
+{0x04,0xFC,0x24,0x74,0x0C,0x00,0x02,0x03,0x02,0x02,0x03,0x00},/*"E",37*/
+{0x04,0xFC,0x24,0x74,0x0C,0x00,0x02,0x03,0x02,0x00,0x00,0x00},/*"F",38*/
+{0xF0,0x08,0x04,0x44,0xCC,0x40,0x00,0x01,0x02,0x02,0x01,0x00},/*"G",39*/
+{0x04,0xFC,0x20,0x20,0xFC,0x04,0x02,0x03,0x00,0x00,0x03,0x02},/*"H",40*/
+{0x04,0x04,0xFC,0x04,0x04,0x00,0x02,0x02,0x03,0x02,0x02,0x00},/*"I",41*/
+{0x00,0x04,0x04,0xFC,0x04,0x04,0x06,0x04,0x04,0x03,0x00,0x00},/*"J",42*/
+{0x04,0xFC,0x24,0xD0,0x0C,0x04,0x02,0x03,0x02,0x00,0x03,0x02},/*"K",43*/
+{0x04,0xFC,0x04,0x00,0x00,0x00,0x02,0x03,0x02,0x02,0x02,0x03},/*"L",44*/
+{0xFC,0x3C,0xC0,0x3C,0xFC,0x00,0x03,0x00,0x03,0x00,0x03,0x00},/*"M",45*/
+{0x04,0xFC,0x30,0xC4,0xFC,0x04,0x02,0x03,0x02,0x00,0x03,0x00},/*"N",46*/
+{0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00},/*"O",47*/
+{0x04,0xFC,0x24,0x24,0x18,0x00,0x02,0x03,0x02,0x00,0x00,0x00},/*"P",48*/
+{0xF8,0x84,0x84,0x04,0xF8,0x00,0x01,0x02,0x02,0x07,0x05,0x00},/*"Q",49*/
+{0x04,0xFC,0x24,0x64,0x98,0x00,0x02,0x03,0x02,0x00,0x03,0x02},/*"R",50*/
+{0x18,0x24,0x24,0x44,0x8C,0x00,0x03,0x02,0x02,0x02,0x01,0x00},/*"S",51*/
+{0x0C,0x04,0xFC,0x04,0x0C,0x00,0x00,0x02,0x03,0x02,0x00,0x00},/*"T",52*/
+{0x04,0xFC,0x00,0x00,0xFC,0x04,0x00,0x01,0x02,0x02,0x01,0x00},/*"U",53*/
+{0x04,0x7C,0x80,0xE0,0x1C,0x04,0x00,0x00,0x03,0x00,0x00,0x00},/*"V",54*/
+{0x1C,0xE0,0x3C,0xE0,0x1C,0x00,0x00,0x03,0x00,0x03,0x00,0x00},/*"W",55*/
+{0x04,0x9C,0x60,0x9C,0x04,0x00,0x02,0x03,0x00,0x03,0x02,0x00},/*"X",56*/
+{0x04,0x1C,0xE0,0x1C,0x04,0x00,0x00,0x02,0x03,0x02,0x00,0x00},/*"Y",57*/
+{0x0C,0x84,0x64,0x1C,0x04,0x00,0x02,0x03,0x02,0x02,0x03,0x00},/*"Z",58*/
+{0x00,0x00,0xFE,0x02,0x02,0x00,0x00,0x00,0x07,0x04,0x04,0x00},/*"[",59*/
+{0x00,0x0E,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00},/*"\",60*/
+{0x00,0x02,0x02,0xFE,0x00,0x00,0x00,0x04,0x04,0x07,0x00,0x00},/*"]",61*/
+{0x00,0x04,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08},/*"_",63*/
+{0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
+{0x00,0x40,0xA0,0xA0,0xC0,0x00,0x00,0x01,0x02,0x02,0x03,0x02},/*"a",65*/
+{0x04,0xFC,0x20,0x20,0xC0,0x00,0x00,0x03,0x02,0x02,0x01,0x00},/*"b",66*/
+{0x00,0xC0,0x20,0x20,0x60,0x00,0x00,0x01,0x02,0x02,0x02,0x00},/*"c",67*/
+{0x00,0xC0,0x20,0x24,0xFC,0x00,0x00,0x01,0x02,0x02,0x03,0x02},/*"d",68*/
+{0x00,0xC0,0xA0,0xA0,0xC0,0x00,0x00,0x01,0x02,0x02,0x02,0x00},/*"e",69*/
+{0x00,0x20,0xF8,0x24,0x24,0x04,0x00,0x02,0x03,0x02,0x02,0x00},/*"f",70*/
+{0x00,0x40,0xA0,0xA0,0x60,0x20,0x00,0x07,0x0A,0x0A,0x0A,0x04},/*"g",71*/
+{0x04,0xFC,0x20,0x20,0xC0,0x00,0x02,0x03,0x02,0x00,0x03,0x02},/*"h",72*/
+{0x00,0x20,0xE4,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00},/*"i",73*/
+{0x00,0x00,0x20,0xE4,0x00,0x00,0x08,0x08,0x08,0x07,0x00,0x00},/*"j",74*/
+{0x04,0xFC,0x80,0xE0,0x20,0x20,0x02,0x03,0x02,0x00,0x03,0x02},/*"k",75*/
+{0x04,0x04,0xFC,0x00,0x00,0x00,0x02,0x02,0x03,0x02,0x02,0x00},/*"l",76*/
+{0xE0,0x20,0xE0,0x20,0xC0,0x00,0x03,0x00,0x03,0x00,0x03,0x00},/*"m",77*/
+{0x20,0xE0,0x20,0x20,0xC0,0x00,0x02,0x03,0x02,0x00,0x03,0x02},/*"n",78*/
+{0x00,0xC0,0x20,0x20,0xC0,0x00,0x00,0x01,0x02,0x02,0x01,0x00},/*"o",79*/
+{0x20,0xE0,0x20,0x20,0xC0,0x00,0x08,0x0F,0x0A,0x02,0x01,0x00},/*"p",80*/
+{0x00,0xC0,0x20,0x20,0xE0,0x00,0x00,0x01,0x02,0x0A,0x0F,0x08},/*"q",81*/
+{0x20,0xE0,0x40,0x20,0x20,0x00,0x02,0x03,0x02,0x00,0x00,0x00},/*"r",82*/
+{0x00,0x60,0xA0,0xA0,0x20,0x00,0x00,0x02,0x02,0x02,0x03,0x00},/*"s",83*/
+{0x00,0x20,0xF8,0x20,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x00},/*"t",84*/
+{0x20,0xE0,0x00,0x20,0xE0,0x00,0x00,0x01,0x02,0x02,0x03,0x02},/*"u",85*/
+{0x20,0xE0,0x20,0x80,0x60,0x20,0x00,0x00,0x03,0x01,0x00,0x00},/*"v",86*/
+{0x60,0x80,0xE0,0x80,0x60,0x00,0x00,0x03,0x00,0x03,0x00,0x00},/*"w",87*/
+{0x20,0x60,0x80,0x60,0x20,0x00,0x02,0x03,0x00,0x03,0x02,0x00},/*"x",88*/
+{0x20,0xE0,0x20,0x80,0x60,0x20,0x08,0x08,0x07,0x01,0x00,0x00},/*"y",89*/
+{0x00,0x20,0xA0,0x60,0x20,0x00,0x00,0x02,0x03,0x02,0x02,0x00},/*"z",90*/
+{0x00,0x00,0x20,0xDE,0x02,0x00,0x00,0x00,0x00,0x07,0x04,0x00},/*"{",91*/
+{0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00},/*"|",92*/
+{0x00,0x02,0xDE,0x20,0x00,0x00,0x00,0x04,0x07,0x00,0x00,0x00},/*"}",93*/
+{0x02,0x01,0x02,0x04,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
+};
+static const uint8_t font_1608[95][16] =
+{      
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
+{0x00,0x00,0x00,0x00,0xF8,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
+{0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
+{0x40,0x02,0x40,0x1E,0xE0,0x03,0x58,0x02,0x40,0x02,0x40,0x1E,0xC0,0x03,0x78,0x02},/*"#",3*/
+{0x00,0x00,0x70,0x0C,0x98,0x18,0x88,0x10,0xFC,0x3F,0x08,0x11,0x08,0x19,0x10,0x0E},/*"$",4*/
+{0x00,0x00,0x70,0x00,0x88,0x00,0x88,0x00,0x88,0x18,0x70,0x06,0x00,0x01,0xC0,0x00},/*"%",5*/
+{0x00,0x00,0x00,0x0E,0x70,0x19,0x88,0x11,0x88,0x11,0x88,0x12,0x70,0x1C,0x00,0x08},/*"&",6*/
+{0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
+{0x00,0x00,0xC0,0x1F,0x30,0x60,0x08,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"(",8*/
+{0x00,0x00,0x08,0x80,0x30,0x60,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*")",9*/
+{0x10,0x00,0x50,0x00,0x38,0x00,0x50,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"*",10*/
+{0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0xE0,0x0F,0x00,0x01,0x00,0x01,0x00,0x01},/*"+",11*/
+{0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
+{0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
+{0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/
+{0x00,0x18,0x00,0x07,0xE0,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"/",15*/
+{0x00,0x00,0xE0,0x07,0x18,0x18,0x08,0x10,0x08,0x10,0x08,0x10,0x18,0x18,0xE0,0x07},/*"0",16*/
+{0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00},/*"1",17*/
+{0x00,0x00,0x10,0x10,0x08,0x18,0x08,0x18,0x08,0x14,0x08,0x12,0x98,0x11,0x70,0x10},/*"2",18*/
+{0x00,0x00,0x10,0x08,0x08,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x70,0x09,0x00,0x07},/*"3",19*/
+{0x00,0x06,0x00,0x05,0x80,0x04,0x40,0x04,0x20,0x04,0x10,0x04,0xF8,0x1F,0x00,0x04},/*"4",20*/
+{0x00,0x00,0xC0,0x09,0xB8,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x08,0x0F},/*"5",21*/
+{0x00,0x00,0xE0,0x07,0x10,0x09,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x10,0x0F},/*"6",22*/
+{0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x1C,0x08,0x03,0xC8,0x00,0x38,0x00,0x08,0x00},/*"7",23*/
+{0x00,0x00,0x70,0x0F,0x90,0x11,0x88,0x10,0x88,0x10,0x88,0x10,0x98,0x19,0x60,0x0F},/*"8",24*/
+{0x00,0x00,0xF0,0x08,0x98,0x11,0x08,0x11,0x08,0x11,0x08,0x11,0x90,0x08,0xE0,0x07},/*"9",25*/
+{0x00,0x00,0x40,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/
+{0x00,0x00,0x40,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/
+{0x00,0x00,0x00,0x01,0x80,0x02,0x80,0x02,0x40,0x04,0x40,0x04,0x40,0x04,0x20,0x08},/*"<",28*/
+{0x00,0x00,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02,0x40,0x02},/*"=",29*/
+{0x00,0x00,0x20,0x08,0x40,0x04,0x40,0x04,0x40,0x04,0x80,0x02,0x80,0x02,0x00,0x01},/*">",30*/
+{0x00,0x00,0x30,0x00,0x18,0x00,0x08,0x00,0x08,0x16,0x08,0x01,0x98,0x00,0x70,0x00},/*"?",31*/
+{0x00,0x00,0x80,0x0F,0xC0,0x30,0x20,0x40,0x10,0x4F,0x90,0x99,0x88,0x90,0x48,0x90},/*"@",32*/
+{0x00,0x00,0x00,0x18,0x00,0x06,0x80,0x03,0x70,0x02,0x08,0x02,0x70,0x02,0x80,0x03},/*"A",33*/
+{0x00,0x00,0xF8,0x1F,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10},/*"B",34*/
+{0x00,0x00,0xC0,0x03,0x30,0x0C,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10},/*"C",35*/
+{0x00,0x00,0xF8,0x1F,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10},/*"D",36*/
+{0x00,0x00,0xF8,0x1F,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10},/*"E",37*/
+{0x00,0x00,0xF8,0x1F,0x88,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0x88,0x00},/*"F",38*/
+{0x00,0x00,0xC0,0x03,0x30,0x0C,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x11,0x08,0x11},/*"G",39*/
+{0x00,0x00,0xF8,0x1F,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00},/*"H",40*/
+{0x00,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"I",41*/
+{0x00,0x00,0x00,0x0C,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0xF8,0x0F,0x00,0x00},/*"J",42*/
+{0x00,0x00,0xF8,0x1F,0x00,0x02,0x00,0x01,0x80,0x00,0xC0,0x01,0x20,0x02,0x10,0x04},/*"K",43*/
+{0x00,0x00,0xF8,0x1F,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10},/*"L",44*/
+{0x00,0x00,0xF8,0x1F,0x10,0x00,0x60,0x00,0x80,0x01,0x00,0x06,0x00,0x18,0x00,0x06},/*"M",45*/
+{0x00,0x00,0xF8,0x1F,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04},/*"N",46*/
+{0x00,0x00,0xC0,0x03,0x30,0x0C,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10},/*"O",47*/
+{0x00,0x00,0xF8,0x1F,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01},/*"P",48*/
+{0x00,0x00,0xC0,0x03,0x30,0x0C,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x14,0x08,0x14},/*"Q",49*/
+{0x00,0x00,0xF8,0x1F,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x03,0x08,0x05},/*"R",50*/
+{0x00,0x00,0x70,0x0C,0xD0,0x18,0x88,0x10,0x88,0x10,0x88,0x10,0x08,0x11,0x08,0x11},/*"S",51*/
+{0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0xF8,0x1F,0x08,0x00,0x08,0x00,0x08,0x00},/*"T",52*/
+{0x00,0x00,0xF8,0x07,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10},/*"U",53*/
+{0x00,0x00,0x18,0x00,0x60,0x00,0x80,0x01,0x00,0x06,0x00,0x18,0x00,0x06,0x80,0x01},/*"V",54*/
+{0x18,0x00,0xE0,0x00,0x00,0x0F,0x00,0x18,0x00,0x06,0x80,0x01,0x70,0x00,0x08,0x00},/*"W",55*/
+{0x00,0x10,0x08,0x08,0x10,0x04,0x20,0x02,0x40,0x01,0x80,0x00,0x40,0x01,0x20,0x02},/*"X",56*/
+{0x08,0x00,0x10,0x00,0x60,0x00,0x80,0x00,0x00,0x1F,0x80,0x00,0x60,0x00,0x10,0x00},/*"Y",57*/
+{0x00,0x10,0x08,0x18,0x08,0x14,0x08,0x12,0x88,0x11,0x48,0x10,0x28,0x10,0x18,0x10},/*"Z",58*/
+{0x00,0x00,0xF8,0xFF,0x08,0x80,0x08,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"[",59*/
+{0x18,0x00,0xE0,0x00,0x00,0x07,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"\",60*/
+{0x08,0x80,0x08,0x80,0xF8,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"]",61*/
+{0x00,0x01,0xC0,0x00,0x60,0x00,0x10,0x00,0x60,0x00,0xC0,0x00,0x00,0x01,0x00,0x00},/*"^",62*/
+{0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80},/*"_",63*/
+{0x00,0x00,0x08,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
+{0x00,0x00,0x80,0x0C,0x40,0x14,0x40,0x12,0x40,0x12,0x40,0x12,0x40,0x0A,0x80,0x1F},/*"a",65*/
+{0x00,0x00,0xF8,0x1F,0x80,0x08,0x80,0x10,0x40,0x10,0x40,0x10,0x80,0x08,0x00,0x07},/*"b",66*/
+{0x00,0x00,0x80,0x0F,0xC0,0x18,0x40,0x10,0x40,0x10,0x40,0x10,0x80,0x08,0x00,0x00},/*"c",67*/
+{0x00,0x00,0x00,0x07,0x80,0x08,0x40,0x10,0x40,0x10,0x40,0x10,0x80,0x08,0xF8,0x1F},/*"d",68*/
+{0x00,0x00,0x00,0x07,0x80,0x0A,0x40,0x12,0x40,0x12,0x40,0x12,0x80,0x12,0x00,0x0B},/*"e",69*/
+{0x40,0x00,0xF8,0x1F,0x48,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"f",70*/
+{0x00,0x00,0x00,0x47,0x80,0x88,0x40,0x90,0x40,0x90,0x40,0x90,0x80,0xC8,0xC0,0x7F},/*"g",71*/
+{0x00,0x00,0xF8,0x1F,0x80,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x1F,0x00,0x00},/*"h",72*/
+{0x00,0x00,0xC8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"i",73*/
+{0x00,0x80,0xC8,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"j",74*/
+{0x00,0x00,0xF8,0x1F,0x00,0x02,0x00,0x02,0x00,0x03,0x80,0x04,0x80,0x08,0x40,0x10},/*"k",75*/
+{0x00,0x00,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"l",76*/
+{0x00,0x00,0xC0,0x1F,0x80,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x1F,0x80,0x00},/*"m",77*/
+{0x00,0x00,0xC0,0x1F,0x80,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x1F,0x00,0x00},/*"n",78*/
+{0x00,0x00,0x80,0x0F,0x80,0x08,0x40,0x10,0x40,0x10,0x40,0x10,0x80,0x08,0x80,0x0F},/*"o",79*/
+{0x00,0x00,0xC0,0xFF,0x80,0x08,0x40,0x10,0x40,0x10,0x40,0x10,0x80,0x08,0x00,0x07},/*"p",80*/
+{0x00,0x00,0x00,0x07,0x80,0x08,0x40,0x10,0x40,0x10,0x40,0x10,0x80,0x08,0xC0,0xFF},/*"q",81*/
+{0x00,0x00,0xC0,0x1F,0x80,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"r",82*/
+{0x00,0x00,0x80,0x09,0x40,0x13,0x40,0x12,0x40,0x12,0x40,0x12,0x80,0x0C,0x00,0x00},/*"s",83*/
+{0x40,0x00,0xF0,0x1F,0x40,0x10,0x40,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"t",84*/
+{0x00,0x00,0xC0,0x0F,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x08,0xC0,0x1F,0x00,0x00},/*"u",85*/
+{0x40,0x00,0x80,0x01,0x00,0x06,0x00,0x18,0x00,0x06,0x80,0x01,0x40,0x00,0x00,0x00},/*"v",86*/
+{0xC0,0x00,0x00,0x0F,0x00,0x10,0x00,0x0E,0x80,0x01,0x40,0x00,0x80,0x01,0x00,0x0E},/*"w",87*/
+{0x40,0x10,0x80,0x08,0x00,0x05,0x00,0x02,0x00,0x05,0x80,0x08,0x40,0x10,0x00,0x00},/*"x",88*/
+{0xC0,0x00,0x00,0x83,0x00,0x8C,0x00,0x70,0x00,0x1C,0x80,0x03,0x40,0x00,0x00,0x00},/*"y",89*/
+{0x40,0x10,0x40,0x18,0x40,0x14,0x40,0x12,0x40,0x11,0xC0,0x10,0x40,0x10,0x00,0x00},/*"z",90*/
+{0x00,0x02,0x00,0x02,0xF0,0x7D,0x08,0x80,0x08,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"{",91*/
+{0x00,0x00,0xF8,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"|",92*/
+{0x08,0x80,0x08,0x80,0xF0,0x7D,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
+{0x00,0x01,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x80,0x00},/*"~",94*/
+};
+static const uint8_t font_2412[95][36] =
+{
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
+{0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00},/*"!",1*/
+{0x00,0x00,0x80,0x60,0x30,0x1C,0x8C,0x60,0x30,0x1C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
+{0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x86,0xE6,0x9F,0x86,0x86,0x86,0x86,0xE6,0x9F,0x86,0x00,0x00,0x01,0x1F,0x01,0x01,0x01,0x01,0x01,0x1F,0x01,0x01,0x00},/*"#",3*/
+{0x00,0x00,0x80,0xC0,0x60,0x20,0xF8,0x20,0xE0,0xC0,0x00,0x00,0x00,0x00,0x03,0x07,0x0C,0x18,0xFF,0x70,0xE1,0x81,0x00,0x00,0x00,0x00,0x07,0x0F,0x10,0x10,0x7F,0x10,0x0F,0x07,0x00,0x00},/*"$",4*/
+{0x80,0x60,0x20,0x60,0x80,0x00,0x00,0x00,0xE0,0x20,0x00,0x00,0x0F,0x30,0x20,0x30,0x9F,0x70,0xDC,0x37,0x10,0x30,0xC0,0x00,0x00,0x00,0x10,0x0E,0x03,0x00,0x07,0x18,0x10,0x18,0x07,0x00},/*"%",5*/
+{0x00,0x00,0xC0,0x20,0x20,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x1F,0x38,0xE8,0x87,0x03,0xC4,0x3C,0x04,0x00,0x00,0x07,0x0F,0x18,0x10,0x10,0x0B,0x07,0x0D,0x10,0x10,0x08,0x00},/*"&",6*/
+{0x00,0x80,0x8C,0x4C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x30,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0F,0x18,0x20,0x40,0x00},/*"(",8*/
+{0x00,0x04,0x08,0x30,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*")",9*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x66,0x66,0x3C,0x18,0xFF,0x18,0x3C,0x66,0x66,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00},/*"*",10*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00},/*"+",11*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x8C,0x4C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x38,0x0C,0x00,0x00,0x00,0x00,0x00,0x80,0x70,0x1C,0x03,0x00,0x00,0x00,0x00,0x00,0x60,0x38,0x0E,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"/",15*/
+{0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x01,0xFF,0xFE,0x00,0x00,0x01,0x07,0x0E,0x18,0x10,0x10,0x18,0x0E,0x07,0x01,0x00},/*"0",16*/
+{0x00,0x00,0x80,0x80,0x80,0xC0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00},/*"1",17*/
+{0x00,0x80,0x40,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0x03,0x03,0x00,0x80,0x40,0x20,0x38,0x1F,0x07,0x00,0x00,0x00,0x1C,0x1A,0x19,0x18,0x18,0x18,0x18,0x18,0x1F,0x00,0x00},/*"2",18*/
+{0x00,0x80,0xC0,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0x00,0x03,0x03,0x00,0x10,0x10,0x18,0x2F,0xE7,0x80,0x00,0x00,0x00,0x07,0x0F,0x10,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00},/*"3",19*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF0,0x00,0x00,0x00,0x00,0xC0,0xB0,0x88,0x86,0x81,0x80,0xFF,0xFF,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00},/*"4",20*/
+{0x00,0x00,0xE0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,0x00,0x3F,0x10,0x08,0x08,0x08,0x18,0xF0,0xE0,0x00,0x00,0x00,0x07,0x0B,0x10,0x10,0x10,0x10,0x1C,0x0F,0x03,0x00,0x00},/*"5",21*/
+{0x00,0x00,0x80,0xC0,0x40,0x20,0x20,0x20,0xE0,0xC0,0x00,0x00,0x00,0xFC,0xFF,0x21,0x10,0x08,0x08,0x08,0x18,0xF0,0xE0,0x00,0x00,0x01,0x07,0x0C,0x18,0x10,0x10,0x10,0x08,0x0F,0x03,0x00},/*"6",22*/
+{0x00,0x00,0xC0,0xE0,0x60,0x60,0x60,0x60,0x60,0xE0,0x60,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0xE0,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00},/*"7",23*/
+{0x00,0x80,0xC0,0x60,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x87,0xEF,0x2C,0x18,0x18,0x30,0x30,0x68,0xCF,0x83,0x00,0x00,0x07,0x0F,0x08,0x10,0x10,0x10,0x10,0x18,0x0F,0x07,0x00},/*"8",24*/
+{0x00,0x00,0xC0,0xC0,0x20,0x20,0x20,0x20,0xC0,0x80,0x00,0x00,0x00,0x1F,0x3F,0x60,0x40,0x40,0x40,0x20,0x10,0xFF,0xFE,0x00,0x00,0x00,0x0C,0x1C,0x10,0x10,0x10,0x08,0x0F,0x03,0x00,0x00},/*"9",25*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00},/*":",26*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x58,0x38,0x00,0x00,0x00,0x00,0x00},/*";",27*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x00,0x00,0x00,0x10,0x28,0x44,0x82,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x00},/*"<",28*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/
+{0x00,0x00,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x82,0x44,0x28,0x10,0x00,0x00,0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x00,0x00},/*">",30*/
+{0x00,0xC0,0x20,0x20,0x10,0x10,0x10,0x10,0x30,0xE0,0xC0,0x00,0x00,0x03,0x03,0x00,0x00,0xF0,0x10,0x08,0x0C,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x00,0x00,0x00,0x00,0x00},/*"?",31*/
+{0x00,0x00,0x00,0xC0,0x40,0x60,0x20,0x20,0x20,0x40,0xC0,0x00,0x00,0xFC,0xFF,0x01,0xF0,0x0E,0x03,0xC1,0xFE,0x03,0x80,0x7F,0x00,0x01,0x07,0x0E,0x08,0x11,0x11,0x10,0x11,0x09,0x04,0x02},/*"@",32*/
+{0x00,0x00,0x00,0x00,0x80,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7C,0x43,0x40,0x47,0x7F,0xF8,0x80,0x00,0x00,0x10,0x18,0x1F,0x10,0x00,0x00,0x00,0x00,0x13,0x1F,0x1C,0x10},/*"A",33*/
+{0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0xFF,0xFF,0x10,0x10,0x10,0x10,0x18,0x2F,0xE7,0x80,0x00,0x10,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x18,0x0F,0x07,0x00},/*"B",34*/
+{0x00,0x00,0x80,0xC0,0x40,0x20,0x20,0x20,0x20,0x60,0xE0,0x00,0x00,0xFC,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x07,0x0E,0x18,0x10,0x10,0x10,0x08,0x04,0x03,0x00},/*"C",35*/
+{0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x40,0xC0,0x80,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0xFE,0x00,0x10,0x1F,0x1F,0x10,0x10,0x10,0x18,0x08,0x0E,0x07,0x01,0x00},/*"D",36*/
+{0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x60,0x80,0x00,0x00,0xFF,0xFF,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x06,0x00},/*"E",37*/
+{0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x20,0x60,0x60,0x80,0x00,0x00,0xFF,0xFF,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,0x01,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"F",38*/
+{0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0x20,0x40,0xE0,0x00,0x00,0x00,0xFC,0xFF,0x01,0x00,0x00,0x40,0x40,0xC0,0xC1,0x40,0x40,0x00,0x01,0x07,0x0E,0x18,0x10,0x10,0x10,0x0F,0x0F,0x00,0x00},/*"G",39*/
+{0x20,0xE0,0xE0,0x20,0x00,0x00,0x00,0x00,0x20,0xE0,0xE0,0x20,0x00,0xFF,0xFF,0x10,0x10,0x10,0x10,0x10,0x10,0xFF,0xFF,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10},/*"H",40*/
+{0x00,0x00,0x20,0x20,0x20,0xE0,0xE0,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00},/*"I",41*/
+{0x00,0x00,0x00,0x00,0x20,0x20,0x20,0xE0,0xE0,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x60,0xE0,0x80,0x80,0x80,0xC0,0x7F,0x3F,0x00,0x00,0x00},/*"J",42*/
+{0x20,0xE0,0xE0,0x20,0x00,0x00,0x20,0xA0,0x60,0x20,0x20,0x00,0x00,0xFF,0xFF,0x30,0x18,0x7C,0xE3,0xC0,0x00,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x01,0x13,0x1F,0x1C,0x18,0x10},/*"K",43*/
+{0x20,0xE0,0xE0,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x06,0x00},/*"L",44*/
+{0x20,0xE0,0xE0,0xE0,0x00,0x00,0x00,0x00,0xE0,0xE0,0xE0,0x20,0x00,0xFF,0x01,0x3F,0xFE,0xC0,0xE0,0x1E,0x01,0xFF,0xFF,0x00,0x10,0x1F,0x10,0x00,0x03,0x1F,0x03,0x00,0x10,0x1F,0x1F,0x10},/*"M",45*/
+{0x20,0xE0,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x20,0xE0,0x20,0x00,0xFF,0x00,0x03,0x07,0x1C,0x78,0xE0,0x80,0x00,0xFF,0x00,0x10,0x1F,0x10,0x00,0x00,0x00,0x00,0x00,0x03,0x0F,0x1F,0x00},/*"N",46*/
+{0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x01,0x07,0x0E,0x18,0x10,0x10,0x18,0x0C,0x07,0x01,0x00},/*"O",47*/
+{0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0xFF,0xFF,0x20,0x20,0x20,0x20,0x20,0x30,0x1F,0x0F,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"P",48*/
+{0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0xFE,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x01,0x07,0x0E,0x11,0x11,0x13,0x3C,0x7C,0x67,0x21,0x00},/*"Q",49*/
+{0x20,0xE0,0xE0,0x20,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0xFF,0xFF,0x10,0x10,0x30,0xF0,0xD0,0x08,0x0F,0x07,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x03,0x0F,0x1C,0x10,0x10},/*"R",50*/
+{0x00,0x80,0xC0,0x60,0x20,0x20,0x20,0x20,0x40,0x40,0xE0,0x00,0x00,0x07,0x0F,0x0C,0x18,0x18,0x30,0x30,0x60,0xE0,0x81,0x00,0x00,0x1F,0x0C,0x08,0x10,0x10,0x10,0x10,0x18,0x0F,0x07,0x00},/*"S",51*/
+{0x80,0x60,0x20,0x20,0x20,0xE0,0xE0,0x20,0x20,0x20,0x60,0x80,0x01,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x00,0x00},/*"T",52*/
+{0x20,0xE0,0xE0,0x20,0x00,0x00,0x00,0x00,0x00,0x20,0xE0,0x20,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x10,0x10,0x08,0x07,0x00},/*"U",53*/
+{0x20,0x60,0xE0,0xE0,0x20,0x00,0x00,0x00,0x20,0xE0,0x60,0x20,0x00,0x00,0x07,0x7F,0xF8,0x80,0x00,0x80,0x7C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x1F,0x1C,0x07,0x00,0x00,0x00,0x00},/*"V",54*/
+{0x20,0xE0,0xE0,0x20,0x00,0xE0,0xE0,0x20,0x00,0x20,0xE0,0x20,0x00,0x07,0xFF,0xF8,0xE0,0x1F,0xFF,0xFC,0xE0,0x1F,0x00,0x00,0x00,0x00,0x03,0x1F,0x03,0x00,0x01,0x1F,0x03,0x00,0x00,0x00},/*"W",55*/
+{0x00,0x20,0x60,0xE0,0xA0,0x00,0x00,0x20,0xE0,0x60,0x20,0x00,0x00,0x00,0x00,0x03,0x8F,0x7C,0xF8,0xC6,0x01,0x00,0x00,0x00,0x00,0x10,0x18,0x1E,0x13,0x00,0x01,0x17,0x1F,0x18,0x10,0x00},/*"X",56*/
+{0x20,0x60,0xE0,0xE0,0x20,0x00,0x00,0x00,0x20,0xE0,0x60,0x20,0x00,0x00,0x01,0x07,0x3E,0xF8,0xE0,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x00,0x00,0x00},/*"Y",57*/
+{0x00,0x80,0x60,0x20,0x20,0x20,0x20,0xA0,0xE0,0xE0,0x20,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0x3E,0x0F,0x03,0x00,0x00,0x00,0x00,0x10,0x1C,0x1F,0x17,0x10,0x10,0x10,0x10,0x18,0x06,0x00},/*"Z",58*/
+{0x00,0x00,0x00,0x00,0x00,0xFC,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x40,0x40,0x00},/*"[",59*/
+{0x00,0x00,0x10,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x1C,0x60,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x70,0x80,0x00},/*"\",60*/
+{0x00,0x00,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,0x00},/*"]",61*/
+{0x00,0x00,0x00,0x10,0x08,0x0C,0x04,0x0C,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80},/*"_",63*/
+{0x00,0x00,0x00,0x04,0x04,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x98,0xD8,0x44,0x64,0x24,0x24,0xFC,0xF8,0x00,0x00,0x00,0x0F,0x1F,0x18,0x10,0x10,0x10,0x08,0x1F,0x1F,0x10,0x18},/*"a",65*/
+{0x00,0x20,0xE0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x18,0x08,0x04,0x04,0x0C,0xF8,0xF0,0x00,0x00,0x00,0x1F,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x03,0x00},/*"b",66*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF8,0x18,0x04,0x04,0x04,0x3C,0x38,0x00,0x00,0x00,0x00,0x03,0x0F,0x0C,0x10,0x10,0x10,0x10,0x08,0x06,0x00,0x00},/*"c",67*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xE0,0xF0,0x00,0x00,0x00,0xE0,0xF8,0x1C,0x04,0x04,0x04,0x08,0xFF,0xFF,0x00,0x00,0x00,0x03,0x0F,0x18,0x10,0x10,0x10,0x08,0x1F,0x0F,0x08,0x00},/*"d",68*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF8,0x48,0x44,0x44,0x44,0x4C,0x78,0x70,0x00,0x00,0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x08,0x04,0x00},/*"e",69*/
+{0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0xE0,0xC0,0x00,0x00,0x04,0x04,0x04,0xFF,0xFF,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00},/*"f",70*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xF8,0x8C,0x04,0x04,0x8C,0xF8,0x74,0x04,0x0C,0x00,0x70,0x76,0xCF,0x8D,0x8D,0x8D,0x89,0xC8,0x78,0x70,0x00},/*"g",71*/
+{0x00,0x20,0xE0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x08,0x04,0x04,0x04,0xFC,0xF8,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x10,0x1F,0x1F,0x10,0x00},/*"h",72*/
+{0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00},/*"i",73*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x80,0x80,0xC0,0x7F,0x3F,0x00,0x00,0x00},/*"j",74*/
+{0x00,0x20,0xE0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0xC0,0xF4,0x1C,0x04,0x04,0x00,0x00,0x00,0x10,0x1F,0x1F,0x11,0x00,0x03,0x1F,0x1C,0x10,0x10,0x00},/*"k",75*/
+{0x00,0x00,0x20,0x20,0x20,0xE0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00},/*"l",76*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0xFC,0x08,0x04,0xFC,0xFC,0x08,0x04,0xFC,0xFC,0x00,0x10,0x1F,0x1F,0x10,0x00,0x1F,0x1F,0x10,0x00,0x1F,0x1F,0x10},/*"m",77*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0xFC,0x08,0x08,0x04,0x04,0xFC,0xF8,0x00,0x00,0x00,0x10,0x1F,0x1F,0x10,0x00,0x00,0x10,0x1F,0x1F,0x10,0x00},/*"n",78*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF0,0x18,0x0C,0x04,0x04,0x0C,0x18,0xF0,0xE0,0x00,0x00,0x03,0x0F,0x0C,0x10,0x10,0x10,0x10,0x0C,0x0F,0x03,0x00},/*"o",79*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0xFC,0x08,0x04,0x04,0x04,0x0C,0xF8,0xF0,0x00,0x00,0x80,0xFF,0xFF,0x88,0x90,0x10,0x10,0x1C,0x0F,0x03,0x00},/*"p",80*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF8,0x1C,0x04,0x04,0x04,0x08,0xF8,0xFC,0x00,0x00,0x00,0x03,0x0F,0x18,0x10,0x10,0x90,0x88,0xFF,0xFF,0x80,0x00},/*"q",81*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0xFC,0xFC,0x10,0x08,0x04,0x04,0x0C,0x0C,0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,0x00},/*"r",82*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x78,0xCC,0xC4,0x84,0x84,0x84,0x0C,0x1C,0x00,0x00,0x00,0x1E,0x18,0x10,0x10,0x10,0x11,0x19,0x0F,0x06,0x00},/*"s",83*/
+{0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0xFF,0xFF,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x1F,0x10,0x10,0x10,0x0C,0x00,0x00},/*"t",84*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0xFE,0x00,0x00,0x00,0x04,0xFC,0xFE,0x00,0x00,0x00,0x00,0x0F,0x1F,0x18,0x10,0x10,0x08,0x1F,0x0F,0x08,0x00},/*"u",85*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x3C,0xFC,0xC4,0x00,0x00,0xC4,0x3C,0x0C,0x04,0x00,0x00,0x00,0x00,0x01,0x0F,0x1E,0x0E,0x01,0x00,0x00,0x00},/*"v",86*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x3C,0xFC,0xC4,0x00,0xE4,0x7C,0xFC,0x84,0x80,0x7C,0x04,0x00,0x00,0x07,0x1F,0x07,0x00,0x00,0x07,0x1F,0x07,0x00,0x00},/*"w",87*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x1C,0x7C,0xE4,0xC0,0x34,0x1C,0x04,0x04,0x00,0x00,0x10,0x10,0x1C,0x16,0x01,0x13,0x1F,0x1C,0x18,0x10,0x00},/*"x",88*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x3C,0xFC,0xC4,0x00,0xC4,0x3C,0x04,0x04,0x00,0x00,0x00,0xC0,0x80,0xC1,0x37,0x0E,0x01,0x00,0x00,0x00,0x00},/*"y",89*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x04,0x04,0xC4,0xF4,0x7C,0x1C,0x04,0x00,0x00,0x00,0x00,0x10,0x1C,0x1F,0x17,0x11,0x10,0x10,0x18,0x0E,0x00},/*"z",90*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0C,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x28,0xEF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x60,0x40,0x00,0x00},/*"{",91*/
+{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00},/*"|",92*/
+{0x00,0x00,0x04,0x0C,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEF,0x28,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x60,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
+{0x00,0x18,0x06,0x02,0x02,0x04,0x08,0x10,0x20,0x20,0x30,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
+};
+
+
+font_info_t font_info(int font)
+{
+    font_info_t tmp={0};
+    
+    switch(font) {
+
+        case FONT_0806:
+        {
+            tmp.width = 6;
+            tmp.height = 8;
+        }
+        break;
+
+        case FONT_1206:
+        {
+            tmp.width = 6;
+            tmp.height = 12;
+        }
+        break;
+        
+        case FONT_1608:
+        {
+            tmp.width = 8;
+            tmp.height = 16;
+        }
+        break;
+        
+        case FONT_2412:
+        {
+            tmp.width = 12;
+            tmp.height = 24;
+        }
+        break;
+    }
+    return tmp;
+}
+
+
+font_data_t font_data(int font, int c)
+{
+    font_data_t tmp={0};
+    
+    switch(font) {
+        
+        case FONT_0806:
+        {
+            tmp.data = (uint8_t*)font_0806[c-32];
+            tmp.dlen = 6;
+        }
+        break;
+
+        case FONT_1206:
+        {
+            tmp.data = (uint8_t*)font_1206[c-32];
+            tmp.dlen = 12;
+        }
+        break;
+        
+        case FONT_1608:
+        {
+            tmp.data = (uint8_t*)font_1608[c-32];
+            tmp.dlen = 16;
+        }
+        break;
+        
+        case FONT_2412:
+        {
+            tmp.data = (uint8_t*)font_2412[c-32];
+            tmp.dlen = 36;
+        }
+        break;
+    }
+    return tmp;
+}

+ 30 - 0
pro/ui/font.h

@@ -0,0 +1,30 @@
+#ifndef __FONT_Hx__
+#define __FONT_Hx__
+
+#include <stdint.h>
+
+enum {
+    FONT_0806=0,
+    FONT_1206,
+    FONT_1608,
+    FONT_2412,
+    
+    FONT_MAX
+};
+
+typedef struct {
+    uint8_t width;
+    uint8_t height;
+}font_info_t;
+
+typedef struct {
+    uint8_t *data;
+    uint32_t dlen;
+}font_data_t;
+
+
+font_info_t font_info(int font);
+font_data_t font_data(int font, int c);
+
+#endif
+

+ 99 - 0
pro/ui/gpio.c

@@ -0,0 +1,99 @@
+#include <string.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "gpio.h"
+#include "elog.h"
+
+
+#if 1
+    #define LOGD  log_d
+    #define LOGE  log_e
+#else
+    #define LOGD  printf
+    #define LOGE  printf
+#endif
+
+
+int gpio_init(int gpio, int io)
+{
+    int r,fd;
+    char tmp[20],path[100];
+    
+    sprintf(path,"/sys/class/gpio/export");
+    fd = open(path, O_WRONLY);
+	if(fd< 0){
+		return -1;
+	}
+	sprintf(tmp, "%d", gpio);
+    write(fd, tmp, strlen(tmp));
+    close(fd);
+    
+    sprintf(path,"/sys/class/gpio/gpio%d/direction", gpio);
+	fd = open(path, O_WRONLY);
+	if(fd< 0){
+		LOGE("open %s error\n", path);
+		return -1;
+	}
+	
+    if(io==GPIO_IN) {
+	    sprintf(tmp, "in");
+    }
+    else {
+        sprintf(tmp, "out");
+    }
+	r = write(fd, tmp, strlen(tmp));
+	if(r<0){
+	    LOGE("write gpio direction failed\n");
+		return -1;
+    }
+    close(fd);
+    
+    sprintf(path,"/sys/class/gpio/gpio%d/value", gpio);
+	fd = open(path, O_WRONLY);
+	if(fd< 0){
+		LOGE("open gpio value failed\n");
+		return -1;
+	}
+    
+    return fd;
+}
+
+int gpio_deinit(int fd)
+{
+    close(fd);
+    return 0;
+}
+
+int gpio_set(int fd, int hl)
+{
+    int r;
+    char tmp[20];
+	
+	sprintf(tmp, "%d", hl);
+	r = write(fd, tmp, strlen(tmp));
+	if(r<0){
+		LOGE("gpio_set failed\n");
+		return -1;
+    }
+	
+	return 0;
+}
+
+
+int gpio_get(int fd)
+{
+    int r;
+    char tmp[20];
+    
+    r = read(fd, tmp, sizeof(tmp)-1);  
+    if (r<0) {  
+        return -1;  
+    }    
+    
+    if (tmp[0]=='0'){
+        return 1;
+    } else{
+        return 0;
+    }  
+}

+ 14 - 0
pro/ui/gpio.h

@@ -0,0 +1,14 @@
+#ifndef __GPIO_Hx__
+#define __GPIO_Hx__
+
+enum {
+    GPIO_IN=0,
+    GPIO_OUT,
+};
+
+int gpio_init(int gpio, int io);
+int gpio_deinit(int fd);
+int gpio_set(int fd, int hl);
+int gpio_get(int fd);
+
+#endif

+ 518 - 0
pro/ui/lcd.c

@@ -0,0 +1,518 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/ioctl.h>
+#include <linux/fb.h>
+#include <linux/spi/spidev.h>
+#include "gpio.h"
+#include "lcd.h"
+#include "elog.h"
+
+
+//#define USE_FB
+
+
+#if 1
+    #define LOGD  log_d
+    #define LOGE  log_e
+#else
+    #define LOGD  printf
+    #define LOGE  printf
+#endif
+
+#define BIT(x)              (1<<x)
+#define SWAP16(a)           ((uint16_t)((a<<8)|(a>>8)))
+
+#ifdef USE_FB
+    #define DEV_PATH        "/dev/fb0"
+    typedef struct fb_fix_screeninfo fb_finfo_t;
+    typedef struct fb_var_screeninfo fb_vinfo_t;
+#else
+    #define DEV_PATH        "/dev/spidev1.0"
+    #define DC_GPIO         99      //PD3, 96+3=99
+    #define RST_GPIO        100     //PD4, 96+4=100
+#endif
+
+
+typedef struct {
+    int  x;
+    int  y;
+    int  w;
+    int  h;
+}lcd_rect_t;
+typedef struct {
+    int         width;
+    int         height;
+    int         color;
+
+    int         fd;
+#ifdef USE_FB
+    uint16_t    *buf;
+#else
+    int         io;
+    uint8_t     *buf;
+#endif
+    
+    int         buflen;
+}lcd_handle_t;
+static lcd_handle_t lcdHandle={0};
+static int ssd1309_init(lcd_handle_t *h);
+static void ssd1309_refresh(lcd_handle_t *h);
+
+static int lcd_hw_init(lcd_handle_t *h)
+{
+    h->fd = open(DEV_PATH, O_RDWR);
+    if (h->fd < 0) {
+        LOGE("___ open %s failed\n", DEV_PATH);
+        return -1;
+    }
+    
+#ifdef USE_FB
+    fb_vinfo_t vinfo;
+    if (ioctl(h->fd, FBIOGET_VSCREENINFO, &vinfo)) {
+        LOGE("___ get screen info failed\n");
+        return -1;
+    }
+    h->buflen = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
+    h->buf = (uint16_t *)mmap(0, h->buflen, PROT_READ | PROT_WRITE, MAP_SHARED, h->fd, 0);
+    if ((int)h->buf == -1) {
+        LOGE("Error: failed to map framebuffer device to memory\n");
+        return -1;
+    }
+#else
+    h->io = gpio_init(DC_GPIO, GPIO_OUT);
+    h->buflen = h->width*h->height/8;
+    h->buf = (uint8_t*)calloc(1, h->buflen);
+    if (!h->buf) {
+        LOGE("malloc buffer falied\n");
+        return -1;
+    }
+    
+    #if 0
+    uint8_t mode = SPI_MODE_0;
+    if (ioctl(fd, SPI_IOC_WR_MODE, &mode) == -1) {
+        LOGE("Can't set SPI mode\n");
+        return -1;
+    }
+    
+    uint32_t speed = 8000000;
+    if (ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) == -1) {
+        LOGE("Can't set max speed\n");
+        return -1;
+    }
+    #endif
+    
+    ssd1309_init(h);
+#endif
+
+    return 0;
+}
+static int lcd_hw_write(lcd_handle_t *h, void *data, int len)
+{
+    int r;
+    struct spi_ioc_transfer tr = {
+        .tx_buf = (unsigned long)data,
+        .rx_buf = 0,
+        .len = len,
+        .speed_hz = 8000000,
+        .bits_per_word = 8,
+    };
+ 
+    r = ioctl(h->fd, SPI_IOC_MESSAGE(1), &tr);
+    if (r < 1) {
+        LOGE("Can't send spi message");
+    }
+    
+    return 0;
+}
+static void lcd_write_reg(lcd_handle_t *h, uint8_t reg)
+{
+    gpio_set(h->io, 0);
+    lcd_hw_write(h, &reg, 1);
+}
+static int ssd1309_reset(void)
+{
+    int fd = gpio_init(RST_GPIO, GPIO_OUT);
+    gpio_set(fd, 0);
+    usleep(100*1000);
+    gpio_set(fd, 1);
+    gpio_deinit(fd);
+    return 0;
+}
+static void ssd1309_on(lcd_handle_t *h, int flag)
+{
+    if(flag) {
+        lcd_write_reg(h,0x8D);
+	    lcd_write_reg(h,0x14);
+	    lcd_write_reg(h,0xAF);
+    }
+    else {
+        lcd_write_reg(h,0x8D);
+	    lcd_write_reg(h,0x10);
+	    lcd_write_reg(h,0xAE);
+    }
+
+}
+static int ssd1309_init(lcd_handle_t *h)
+{
+    ssd1309_reset();
+
+    lcd_write_reg(h,0xFD);
+	lcd_write_reg(h,0x12);
+	lcd_write_reg(h,0xAE);//--turn off oled panel
+	lcd_write_reg(h,0xd5);//--set display clock divide ratio/oscillator frequency
+	lcd_write_reg(h,0xA0);
+	lcd_write_reg(h,0xA8);//--set multiplex ratio(1 to 64)
+	lcd_write_reg(h,0x3f);//--1/64 duty
+	lcd_write_reg(h,0xD3);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)
+	lcd_write_reg(h,0x00);//-not offset
+	lcd_write_reg(h,0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
+	lcd_write_reg(h,0xA1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
+	lcd_write_reg(h,0xC8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
+	lcd_write_reg(h,0xDA);//--set com pins hardware configuration
+	lcd_write_reg(h,0x12);
+	lcd_write_reg(h,0x81);//--set contrast control register
+	lcd_write_reg(h,0x7F);// Set SEG Output Current Brightness
+	lcd_write_reg(h,0xD9);//--set pre-charge period
+	lcd_write_reg(h,0x82);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
+	lcd_write_reg(h,0xDB);//--set vcomh
+	lcd_write_reg(h,0x34);//Set VCOM Deselect Level
+	lcd_write_reg(h,0xA4);// Disable Entire Display On (0xa4/0xa5)
+	lcd_write_reg(h,0xA6);// Disable Inverse Display On (0xa6/a7)
+
+    ssd1309_refresh(h);
+    ssd1309_on(h,1);
+	
+	return 0;
+}
+static void ssd1309_refresh(lcd_handle_t *h)
+{
+	int i,n,offset;
+    
+	for(i=0;i<8;i++) {
+	   lcd_write_reg(h,0xb0+i); 			//设置行起始地址
+	   lcd_write_reg(h,0x00);   			//设置低列起始地址
+	   lcd_write_reg(h,0x10);   			//设置高列起始地址
+
+       gpio_set(h->io, 1);
+       offset = i*128;
+	   for(n=0;n<128;n++) {
+          lcd_hw_write(h, &h->buf[offset+n], 1);
+	   }
+  	}
+}
+static int lcd_hw_deinit(lcd_handle_t *h)
+{
+#ifdef USE_FB
+    munmap(h->buf, h->buflen);
+#else
+    gpio_deinit(h->io);
+    free(h->buf);
+#endif
+    close(h->fd);
+    
+    return 0;
+}
+
+static inline int set_point(lcd_handle_t *h, int x, int y, int data)
+{
+#ifdef USE_FB
+    h->buf[y*h->width+x] = (uint16_t)data;
+#else
+    uint8_t pos,bit;
+
+    pos = y / 8;                              /* get y page */
+    bit = y % 8;                               /* get y point */
+    if (data) {                               /* if 1  */
+        h->buf[pos*h->width+x] |= BIT(bit);         		/* set 1 */
+    }
+    else {
+        h->buf[pos*h->width+x] &= ~BIT(bit);        		/* set 0 */
+    }
+#endif
+	
+	return 0;
+}
+static int get_color_bits(int color)
+{
+    if(color==COLOR_WB) {
+        return 1;
+    }
+    else if(color==COLOR_RGB8) {
+        return 8;
+    }
+    else if(color==COLOR_RGB565) {
+        return 16;
+    }
+    else {
+        return 32;
+    }
+}
+
+////////////////////////////////////////////////////////////
+void lcd_init(int width, int height, int color)
+{
+    lcd_handle_t *h=&lcdHandle;
+    h->width  = width;
+    h->height = height;
+    h->color  = color;
+    lcd_hw_init(h);
+}
+
+void lcd_deinit(void)
+{
+    lcd_handle_t *h=&lcdHandle;
+    lcd_hw_deinit(h);
+}
+
+
+void lcd_rotate(int angle)
+{
+    lcd_handle_t *h=&lcdHandle;
+}
+
+
+void lcd_set_backlight(int on)
+{
+    lcd_handle_t *h=&lcdHandle;
+}
+
+
+void lcd_fill(int color)
+{
+    lcd_handle_t *h=&lcdHandle;
+    
+    lcd_fill_rect(0, 0, h->width-1, h->height-1, color);
+}
+
+
+void lcd_draw_line(int x1, int y1, int x2, int y2, int color)
+{
+    int incx = 0, incy = 0;
+    int  delta_x = 0, delta_y = 0;
+    int  distance = 0;
+    int  t = 0;
+    int  x = 0, y = 0;
+    int  x_temp = 0, y_temp = 0;
+    lcd_handle_t *h=&lcdHandle;
+
+    /* 画斜线(Bresenham算法) */
+    delta_x = x2 - x1;
+    delta_y = y2 - y1;
+    if(delta_x > 0) {
+        //斜线(从左到右)
+        incx = 1;
+    }
+    else if(delta_x == 0) {
+        //垂直斜线(竖线)
+        incx = 0;
+    }
+    else {
+        //斜线(从右到左)
+        incx = -1;
+        delta_x = -delta_x;
+    }
+    
+    if(delta_y > 0) {
+        //斜线(从左到右)
+        incy = 1;
+    }
+    else if(delta_y == 0) {
+        //水平斜线(水平线)
+        incy = 0;
+    }
+    else {
+        //斜线(从右到左)
+        incy = -1;
+        delta_y = -delta_y;
+    }           
+    
+    /* 计算画笔打点距离(取两个间距中的最大值) */
+    if(delta_x > delta_y) {
+        distance = delta_x;
+    }
+    else {
+        distance = delta_y;
+    }
+    
+    /* 开始打点 */
+    x = x1;
+    y = y1;
+    //第一个点无效,所以t的次数加一
+    for(t = 0; t <= distance + 1;t++) {
+        set_point(h, x, y, color);
+    
+        /* 判断离实际值最近的像素点 */
+        x_temp += delta_x;  
+        if(x_temp > distance) {
+            //x方向越界,减去距离值,为下一次检测做准备
+            x_temp -= distance;     
+            //在x方向递增打点
+            x += incx;
+        }
+        y_temp += delta_y;
+        if(y_temp > distance) {
+            //y方向越界,减去距离值,为下一次检测做准备
+            y_temp -= distance;
+            //在y方向递增打点
+            y += incy;
+        }
+    }
+}
+
+
+
+void lcd_draw_rect(int x, int y, int w, int h, int color)
+{
+    int  x2,y2;
+
+    x2 = x + w;
+    y2 = y + h;
+    lcd_draw_line(x,y,x2,y,color);
+    lcd_draw_line(x,y,x,y2,color);
+    lcd_draw_line(x,y2,x2,y2,color);
+    lcd_draw_line(x,y,x2,y2,color);
+}
+
+
+void lcd_fill_rect(int x, int y, int w, int h, int color)
+{
+    int i,j;
+    lcd_handle_t *h2=&lcdHandle;
+
+    for(i=x; i<x+w; i++) {
+        for(j=y; j<y+h; j++) {
+            set_point(h2, i, j, color);
+        }
+    }
+}
+
+
+void lcd_refresh(void)
+{
+    lcd_handle_t *h=&lcdHandle;
+#ifndef USE_FB
+    ssd1309_refresh(h);
+#endif
+}
+
+
+void lcd_draw_char(lcd_handle_t *hd, int x, int y, int w, int h, int c, int font, int color, int bgcolor)
+{
+    uint8_t tmp;
+    font_data_t fdata;
+    font_info_t finfo=font_info(font);
+    int i,j,x0=x,y0=y,x1=x+w,y1=y+h;
+    
+    fdata = font_data(font, c);
+    for(i=0; i<fdata.dlen; i++)  {  /*遍历打印所有像素点到LCD */
+        tmp = fdata.data[i];
+        for(j=0; j<8; j++)  {
+            //if((x<x1 && x<hd->width) && (y<y1 && y<hd->height)) 
+            {
+                if(tmp&0x01) {
+                    set_point(hd, x, y, color);
+                }
+                else {
+                    set_point(hd, x, y, bgcolor);
+                }
+            }
+            tmp >>= 1;
+            y++;
+        }
+        
+#if 0
+        if((y-y0)>=finfo.height) {
+            x++;
+            y = y0;
+        }
+#else
+        x++;
+        if((font!=FONT_0806) && ((x-x0)>=finfo.width)) {
+            x = x0;
+            y0 += 8;
+        }
+        y = y0;
+#endif
+    }
+}
+
+
+static void draw_string(lcd_handle_t *hd, int x, int y, int w, int h, char *str, int font, int color, int bgcolor)
+{
+    char *pstr=str;
+    int xmax,ymax,w2;
+    font_info_t finfo=font_info(font);
+    
+    w2 = finfo.width;
+    xmax = x+w; ymax = y+h;
+    while((*pstr<='~') && (*pstr>=' '))  {      /* 判断是不是非法字符! */
+        if(x >= xmax) {
+            break;
+        }
+        
+        if(x+finfo.width>=xmax) {
+            w2 = xmax-x;
+        }
+
+        lcd_draw_char(hd, x, y, w2, h, *pstr, font, color, bgcolor);
+        x += finfo.width;
+        pstr++;
+    }  
+}
+
+
+
+void lcd_draw_string(int x, int y, int w, int h, char *str, int font, int color, int bgcolor, int hori, int vert)
+{
+    int  sw;
+    lcd_rect_t rect;
+    lcd_handle_t *h2=&lcdHandle;
+    font_info_t finfo=font_info(font);
+    
+    sw = strlen((char*)str)*finfo.width;
+    if(sw>w) {
+        sw = w;
+    }
+    
+    if(hori==HORIZONTAL_LEFT) {
+        rect.x = x;
+    }
+    else if(hori==HORIZONTAL_RIGHT) {
+        rect.x = x+w-sw;
+    }
+    else if(hori==HORIZONTAL_CENTER) {
+        rect.x = x+(w-sw)/2;
+    }
+    else {
+        return;
+    }
+    
+    if(vert==VERTICAL_TOP) {
+        rect.y = y;
+    }
+    else if(vert==VERTICAL_BOTTOM) {
+        rect.y = y+h-finfo.height;
+    }
+    else if(vert==VERTICAL_CENTER) {
+        rect.y = y+(h-finfo.height)/2;
+    }
+    else {
+        return;
+    }
+    rect.h = finfo.height;
+    
+    if(rect.x+sw>=h2->width) {
+        rect.w = h2->width-rect.x;
+    }
+    else {
+        rect.w = sw;
+    }
+    
+    draw_string(h2, rect.x, rect.y, rect.w, rect.h, str, font, color, bgcolor);
+}
+
+

+ 83 - 0
pro/ui/lcd.h

@@ -0,0 +1,83 @@
+#ifndef __LCD_Hx__
+#define __LCD_Hx__
+
+#include "font.h"
+
+#define LCD_COLOR   COLOR_WB
+#define LCD_WIDTH   128
+#define LCD_HEIGHT  64
+
+/* 颜色 */
+#if (LCD_COLOR==COLOR_WB)
+    #define COLOR_WHITE         	 1
+    #define COLOR_BLACK         	 0	  
+#elif (LCD_COLOR==COLOR_RGB565)
+    #define COLOR_WHITE         	 0xFFFF
+    #define COLOR_BLACK         	 0x0000	  
+    #define COLOR_BLUE               0x001F  
+    #define COLOR_BRED               0XF81F
+    #define COLOR_GRED               0XFFE0
+    #define COLOR_GBLUE              0X07FF
+    #define COLOR_RED           	 0xF800
+    #define COLOR_MAGENTA       	 0xF81F
+    #define COLOR_GREEN         	 0x07E0
+    #define COLOR_CYAN          	 0x7FFF
+    #define COLOR_YELLOW        	 0xFFE0
+    #define COLOR_BROWN 			 0XBC40
+    #define COLOR_BRRED 			 0XFC07
+    #define COLOR_GRAY  			 0X8430
+#elif (LCD_COLOR==COLOR_RGB666)
+    
+#elif (LCD_COLOR==COLOR_RGB888)
+
+#else
+
+
+#endif
+
+enum {
+    ANGLE_0=0,
+    ANGLE_90,
+    ANGLE_180,
+    ANGLE_270,
+};
+
+enum {
+    HORIZONTAL_LEFT=0,
+    HORIZONTAL_CENTER,
+    HORIZONTAL_RIGHT,
+};
+
+enum {
+    VERTICAL_TOP=0,
+    VERTICAL_CENTER,
+    VERTICAL_BOTTOM,
+};
+
+enum {
+    COLOR_WB=0,
+    COLOR_RGB8,
+    COLOR_RGB565,
+    COLOR_RGB666,
+    COLOR_RGB888,
+    COLOR_RGBA,
+};
+
+
+void lcd_init(int width, int height, int color);
+void lcd_deinit(void);
+
+void lcd_rotate(int angle);
+void lcd_set_backlight(int on);
+void lcd_fill(int color);
+void lcd_draw_line(int x1, int y1, int x2, int y2, int color);
+void lcd_draw_rect(int x1, int y1, int w, int h, int color);
+void lcd_fill_rect(int x1, int y1, int w, int h, int color);
+
+void lcd_draw_string(int x, int y, int width, int height, char *str, int font, int color, int bgcolor, int hori, int vert);
+void lcd_refresh(void);
+#endif
+
+
+
+

+ 125 - 0
pro/ui/ui.c

@@ -0,0 +1,125 @@
+#include "ui.h"
+#include "lcd.h"
+#include "gpio.h"
+#include "thread.h"
+#include <fcntl.h>
+#include <unistd.h>
+#include <linux/input.h>
+
+#if 1
+    #define LOGD  log_d
+    #define LOGE  log_e
+#else
+    #define LOGD  printf
+    #define LOGE  printf
+#endif
+
+typedef struct {
+    int tp;
+    int key;
+    int up;         //0: release  1: press
+}key_data_t;
+
+typedef struct {
+    int fd;
+}ui_handle_t;
+static ui_handle_t uiHandle={0};
+
+
+static int key_init(ui_handle_t *h)
+{
+    h->fd = open("/dev/input/event0", O_RDWR, 0);
+    return (h->fd<0)?-1:0;
+}
+static int key_deinit(ui_handle_t *h)
+{
+    close(h->fd);
+    return 0;
+}
+static int key_get(ui_handle_t *h, key_data_t *k)
+{
+    int r;
+    struct input_event event;
+    
+    r = read(h->fd, &event, sizeof(event));
+    if(r<0) {
+        return -1;
+    }
+    
+    printf("_____ evt.type: %d, value: %d, code: %d\n", event.type, event.value, event.code);
+    switch (event.type) {
+        case EV_KEY:
+        {
+            k->tp = event.type;
+            k->up = (event.value==0)?1:0;
+            k->key = event.code;
+        }
+        break;
+    }
+    
+    return 0;
+}
+static int menu_init(ui_handle_t *h)
+{ 
+    key_init(h);
+    lcd_init(LCD_WIDTH,LCD_HEIGHT,LCD_COLOR);
+    
+    lcd_fill(0);
+    //lcd_draw_string(10, 10,  80, 30, "Smart; Hello!", FONT_0806, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+    //lcd_draw_string(10, 30,  80, 30, "Voltage: 22.4V", FONT_0806, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+    lcd_draw_string(10, 30, 80, 30, "Voltage: 22.4V", FONT_1206, COLOR_WHITE, COLOR_BLACK, HORIZONTAL_LEFT, VERTICAL_CENTER);
+    lcd_refresh();
+    
+    return 0;
+}
+static int menu_deinit(ui_handle_t *h)
+{
+    key_deinit(h);
+    lcd_deinit();
+    
+    return 0;
+}
+static int menu_handle(ui_handle_t *h)
+{
+    int r;
+    key_data_t kd;
+    
+    r = key_get(h, &kd);
+    if(r==0) {
+        switch(kd.key) {
+            case KEY_LEFT:
+            break;
+        }
+    }
+    
+    return 0;
+}
+static void *ui_thread(void *arg)
+{
+    int r;
+    thread_handle_t *th=(thread_handle_t*)arg;
+    ui_handle_t *h=(ui_handle_t*)th->arg;
+    
+    menu_init(h);
+    while(th->quit==0) {
+        menu_handle(h);
+    }
+    menu_deinit(h);
+    
+    pthread_exit(NULL);
+}
+/////////////////////////////////////////////////////
+
+
+int ui_init(void)
+{
+    ui_handle_t *h=&uiHandle;
+    
+    thread_start(THREAD_ID_UI, ui_thread, h);
+    
+    return 0;
+}
+
+
+
+

+ 7 - 0
pro/ui/ui.h

@@ -0,0 +1,7 @@
+#ifndef __UI_Hx__
+#define __UI_Hx__
+
+int ui_init(void);
+
+#endif
+