diff --git a/README.md b/README.md index 24260357dce1b46b36b866b77a91297c6cc76935..0c25012ff4ea256d9dff9db499c5abe81a32b223 100644 --- a/README.md +++ b/README.md @@ -78,9 +78,10 @@ | TW105 | I2C | i2c_sht30 | [I2C温湿度传感器采集](applications/app/TW105_I2C_sht30/README.md) | 核心板 + 马达扩展板| | TW106 | UART | uart | [UART串口自发自收](applications/app/TW106_UART/README.md) | 核心板 | | TW201 | Module | oled | [OLED显示屏驱动](applications/app/TW201_Module_oled/README.md) | 核心板 + OLED扩展板| -| TW203 | Module | tricolor_light| [人体感应联动三色灯](TW203_Module_tricolor_light/README.md) | 核心板 + 人体感应板| +| TW203 | Module | tricolor_light| [人体感应联动三色灯](applications/app/TW203_Module_tricolor_light/README.md) | 核心板 + 人体感应扩展板| | TW205 | Module | motor | [马达开发板演示](applications/app/TW205_Module_motor/README.md) | 核心板 + 马达板| | TW207 | Module | gyro | [GYRO驱动](applications/app/TW207_Module_gyro/README.md) | 核心板 + GYRO扩展板| +| TW210 | Module | battery | [电池电源管理](applications/app/TW210_Module_battery/README.md) | 核心板 + NFC扩展板 + OLED扩展板| | TW301 | Network | wifista | [WiFi-STA联网演示](applications/app/TW301_Network_wifista/README.md) | 核心板 | | TW302 | Network | wifiap | [WiFi-AP热点演示](applications/app/TW302_Network_wifiap/README.md) | 核心板 | | TW303 | Network | mqtt | [MQTT演示](applications/app/TW303_Network_mqttclient/README.md) | 核心板 | diff --git a/applications/app/BUILD.gn b/applications/app/BUILD.gn index bb9a18347f1e92f0130f32b4560a109d511a1636..f06af7055d3d609c1d82831731212267adfb262d 100644 --- a/applications/app/BUILD.gn +++ b/applications/app/BUILD.gn @@ -33,6 +33,7 @@ lite_component("app") { # "TW204_Module_enviroment:module_enviroment_example", # "TW205_Module_motor:module_motor_example", # "TW207_Module_gyro:module_gyro_example", + # "TW210_Module_battery:module_battery_example", # "TW301_Network_wifista:network_wifista_example", # "TW302_Network_wifiap:network_wifiap_example", # "TW303_Network_mqttclient:network_mqttclient_example", diff --git a/applications/app/README.md b/applications/app/README.md index 1f89c929e344cc81f1e8ab2f12bd20fbe991b23c..761485835255c12fd0af7eacbb2285c3c3f77c3e 100644 --- a/applications/app/README.md +++ b/applications/app/README.md @@ -31,6 +31,7 @@ | TW203 | Module | tricolor_light| [人体感应联动三色灯](TW203_Module_tricolor_light/README.md) | 核心板 + 人体感应板| | TW205 | Module | motor | [马达开发板演示](TW205_Module_motor/README.md) | 核心板 + 马达板| | TW207 | Module | gyro | [GYRO驱动](TW207_Module_gyro/README.md) | 核心板 + GYRO扩展板| +| TW210 | Module | battery | [电池电源管理](TW210_Module_battery/README.md) | 核心板 + NFC扩展板 + OLED扩展板| | TW301 | Network | wifista | [WiFi-STA联网演示](TW301_Network_wifista/README.md) | 核心板 | | TW302 | Network | wifiap | [WiFi-AP热点演示](TW302_Network_wifiap/README.md) | 核心板 | | TW303 | Network | mqtt | [MQTT演示](TW303_Network_mqttclient/README.md) | 核心板 | diff --git a/applications/app/TW210_Module_battery/BUILD.gn b/applications/app/TW210_Module_battery/BUILD.gn new file mode 100644 index 0000000000000000000000000000000000000000..64444a77c38407197ad227435d2ad0ac8a47e397 --- /dev/null +++ b/applications/app/TW210_Module_battery/BUILD.gn @@ -0,0 +1,25 @@ +# Copyright (c) 2021 Talkweb Co.,ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +static_library("module_battery_example") { + sources = [ + "battery_example.c", + "battery_oled.c" + ] + + include_dirs = [ + "//utils/native/lite/include", + "//kernel/liteos_m/kal/cmsis", + "//base/iot_hardware/peripheral/interfaces/kits", + ] +} \ No newline at end of file diff --git a/applications/app/TW210_Module_battery/README.md b/applications/app/TW210_Module_battery/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2857d3b48e3ef1b051b5945b02f2db80dca83f04 --- /dev/null +++ b/applications/app/TW210_Module_battery/README.md @@ -0,0 +1,19 @@ +# OpenHarmony模组开发-电池充电管理 + +本案例通过采集供电反馈电压,对电池充放电进行保护管理 + +# 引脚相关定义 +GPIO6 | 充电控制引脚 | 低电平时使能充电 +GPIO9 | AD电压采集引脚 | 采集电池供电电压分压后的电压值 + +# AD采集值与实际Vbat电压值的对应关系 + 1.假设通过芯片ad采集的值为x + 2.通过 IOTAdcConvertToVoltage(x)函数可以将采集到的ad值转换成采集点的电压值,假设为y + 3.通过电阻分压原理可反推出Vbat处的供电电压,本实现分压电阻为 1M/510K,则 x/y = 510/(510+1000), + 得 y = 1510x/510; + +# 实现现象 + 1. OLED屏上实时显示当前adc采集电压adcVol、电池电压batVol及充电开关状态charge + 2. 当Vbat电压值大于4.2V时关闭充电功能 + 3. 当Vbat电压值2.8~4.2V之间时,电池正常充电 + 4. 当Vbat电压值小于2.8V时提示低电压报警 diff --git a/applications/app/TW210_Module_battery/battery_example.c b/applications/app/TW210_Module_battery/battery_example.c new file mode 100644 index 0000000000000000000000000000000000000000..b6f0187214685619fb05fe02b30f8fa0fb50dfa2 --- /dev/null +++ b/applications/app/TW210_Module_battery/battery_example.c @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2021 Talkweb Information System Co.,ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "ohos_init.h" +#include "cmsis_os2.h" + +#include "iot_gpio.h" +#include "iot_adc.h" + +#define TASK_STACK_SIZE 1024 +#define TASK_PRIO 25 + +#define BATTERYCHARGEMAX 4.2 //电池充电过压阈值 +#define BATTERYCHARGEMIN 2.8 //电池低电压报警阈值 + +//申明相关oled API函数 +extern void OledIICInit(void); +extern void OledRefresh(void); +extern void OledShowString(unsigned char x, unsigned char y, char *chr, unsigned char size1); + +//开启电池充电 +static void BatteryChargeStart(void) +{ + IoTGpioSetOutputVal(IOT_GPIO_IO_GPIO_6, IOT_GPIO_VALUE0); +} + +//停止电池充电 +static void BatteryChargeStop(void) +{ + IoTGpioSetOutputVal(IOT_GPIO_IO_GPIO_6, IOT_GPIO_VALUE1); +} + +static void BatteryTask(void) +{ + int ret = 0; + char pbuf[10] = {0}; + unsigned short adVal = 0; + unsigned char chargeState = 0; + float voltage = 0, vBat = 0; + + //充电控制脚 + IoTGpioInit(IOT_GPIO_IO_GPIO_6); + IotIoSetFunc(IOT_GPIO_IO_GPIO_6, HI_IO_FUNC_GPIO_6_GPIO); + IoTGpioSetDir(IOT_GPIO_IO_GPIO_6, IOT_GPIO_DIR_OUT); + IoTGpioSetOutputVal(IOT_GPIO_IO_GPIO_6, IOT_GPIO_VALUE0); + + //AD检测引脚初始化为浮夸模式 + IoTGpioInit(IOT_GPIO_IO_GPIO_9); + IotIoSetPull(IOT_GPIO_IO_GPIO_9, IOT_IO_PULL_NONE); + + //OLED初始化 + OledIICInit(); + + //Oled显示初始固定字符 + OledShowString(3, 3, "adcVol: V", 16); + OledShowString(3, 23, "batVol: V", 16); + OledShowString(3, 43, "charge:", 16); + OledRefresh(); + + for (;;) + { + //获取电压采集值 + ret = IoTAdcRead(WIFI_IOT_ADC_CHANNEL_4, &adVal, WIFI_IOT_ADC_EQU_MODEL_8, WIFI_IOT_ADC_CUR_BAIS_DEFAULT, 256); + if (ret != HI_ERR_SUCCESS) + { + printf("Failed to read adc! Err code = %d\r\n", ret); + continue; + } + + //将AD值转换成电压值 + voltage = IOTAdcConvertToVoltage(adVal); + + //根据采集的电压值,推算出VBat目前的供电电压 + vBat = (voltage * 1510) / 510; + + printf("state = %u, adVal = %u, adVol = %.02f, batVol = %.02f \r\n", chargeState, adVal, voltage, vBat); + + //当供电电压大于保护电压阈值时,断开充电 + if (vBat >= BATTERYCHARGEMAX) + { + BatteryChargeStop(); + chargeState = 0; + } + + //当供电电压小于低电压报警阈值时,提示报警并做一些其它紧急的事情 + else if (vBat <= BATTERYCHARGEMIN) + { + printf("the voltage is too low!!!\r\n"); + BatteryChargeStart(); + chargeState = 1; + //do something + } + + //正常充电范围内进行充电处理 + else + { + BatteryChargeStart(); + chargeState = 1; + } + + //Oled显示adc采集电压 + sprintf((char *)pbuf, "%0.2f", voltage); + OledShowString(60, 3, (char *)pbuf, 16); + + //Oled显示电池电压 + sprintf((char *)pbuf, "%0.2f", vBat); + OledShowString(60, 23, (char *)pbuf, 16); + + //Oled显示充电状态 + if (chargeState == 1) + { + OledShowString(60, 43, (char *)"ON ", 16); + } + else + { + OledShowString(60, 43, (char *)"OFF", 16); + } + OledRefresh(); + + usleep(1000 * 1000); + } +} + +static void BatteryExampleEntry(void) +{ + osThreadAttr_t attr; + + attr.name = "Battey_Task"; + attr.attr_bits = 0U; + attr.cb_mem = NULL; + attr.cb_size = 0U; + attr.stack_mem = NULL; + attr.stack_size = TASK_STACK_SIZE; + attr.priority = TASK_PRIO; + + if (osThreadNew((osThreadFunc_t)BatteryTask, NULL, &attr) == NULL) + { + printf("Falied to create Battery Task!\n"); + } +} +APP_FEATURE_INIT(BatteryExampleEntry); diff --git a/applications/app/TW210_Module_battery/battery_oled.c b/applications/app/TW210_Module_battery/battery_oled.c new file mode 100644 index 0000000000000000000000000000000000000000..a865fffb886d79bf067e324b9ed8102851492aeb --- /dev/null +++ b/applications/app/TW210_Module_battery/battery_oled.c @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2021 Talkweb Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include "stdio.h" +#include "ohos_init.h" +#include "cmsis_os2.h" + +#include "hi_i2c.h" +#include "hi_io.h" +#include "hi_errno.h" +#include "iot_gpio.h" +#include "iot_i2c.h" +#include "iot_adc.h" +#include "battery_oledfont.h" + +#define OLED_CMD 0 //写命令 +#define OLED_DATA 1 //写数据 + +osThreadId_t g_oledTaskID = NULL; +unsigned char OLED_GRAM[144][8]; +unsigned char g_send_data[2] = {0}; + +/** + * @brief IIC写入1个字节 + * @param id: 对应的I2C组 + * @param device_addr: Oled的设备地址,这里默认是0X78 + * @param send_len: 写入的数据长度 + */ +unsigned int IICWrite(hi_i2c_idx id, unsigned short device_addr, unsigned int send_len) +{ + int status = 0; + hi_i2c_data es8311_i2c_data = {0}; + + es8311_i2c_data.send_buf = g_send_data; + es8311_i2c_data.send_len = send_len; + status = hi_i2c_write(id, device_addr, &es8311_i2c_data); + if (status != HI_ERR_SUCCESS) + { + printf("===== Error: I2C write status = %d! =====\r\n", status); + return status; + } + return HI_ERR_SUCCESS; +} + +/** + * @brief IIC写1字节命令 + * @param IIC_Command: 写入的命令值 + */ +void IICWriteCommand(unsigned char IIC_Command) +{ + g_send_data[0] = 0x00; + g_send_data[1] = IIC_Command; + + IICWrite(HI_I2C_IDX_0, 0x78, 2); +} + +/** + * @brief IIC写1字节数据 + * @param IIC_Command: 写入的数据值 + */ +void IICWriteData(unsigned char IIC_Data) +{ + g_send_data[0] = 0x40; + g_send_data[1] = IIC_Data; + + IICWrite(HI_I2C_IDX_0, 0x78, 2); +} + +/** + * @brief IIC写Oled函数,包括写命令和写数据 + * @param val: 写入的数值 + * @param type: 写入的类型:数据/命令 + */ +void OledSendByte(unsigned char val, unsigned char type) +{ + if (type == OLED_DATA) + { + IICWriteData(val); + } + else + { + IICWriteCommand(val); + } +} + +/** + * @brief 设置写入Oled的起始地址 + * @param x: 设置竖起始地址 + * @param y: 设置行起始地址 + */ +void OledSendBP(unsigned char x, unsigned char y) +{ + OledSendByte(0xb0 + y, OLED_CMD); //设置行起始地址 + OledSendByte(((x & 0xf0) >> 4) | 0x10, OLED_CMD); + OledSendByte((x & 0x0f), OLED_CMD); +} + +/** + * @brief 开启Oled显示 + */ +void OledShowON(void) +{ + OledSendByte(0x8D, OLED_CMD); //电荷泵使能 + OledSendByte(0x14, OLED_CMD); //开启电荷泵 + OledSendByte(0xAF, OLED_CMD); //点亮屏幕 +} + +/** + * @brief 关闭Oled显示 + */ +void OledShowOFF(void) +{ + OledSendByte(0x8D, OLED_CMD); //电荷泵使能 + OledSendByte(0x10, OLED_CMD); //关闭电荷泵 + OledSendByte(0xAF, OLED_CMD); //关闭屏幕 +} + +/** + * @brief 更新Oled显示的屏 + */ +void OledRefresh(void) +{ + unsigned char i = 0, n = 0; + + for (i = 0; i < 8; i++) + { + OledSendByte(0xb0 + i, OLED_CMD); //设置行起始地址 + OledSendByte(0x00, OLED_CMD); //设置低列起始地址 + OledSendByte(0x10, OLED_CMD); //设置高列起始地址 + for (n = 0; n < 128; n++) + { + OledSendByte(OLED_GRAM[n][i], OLED_DATA); + } + } +} + +/** + * @brief 清除Oled屏幕 + */ +void OledClear(void) +{ + unsigned char i = 0, n = 0; + for (i = 0; i < 8; i++) + { + for (n = 0; n < 128; n++) + { + OLED_GRAM[n][i] = 0; //清除所有数据 + } + } + OledRefresh(); //更新显示 +} + +/** + * @brief Oled画点函数 + * @param x: 画点的竖地址,0~127 + * @param y: 画点的行地址,0~63 + */ +void OledDrawPoint(unsigned char x, unsigned char y) +{ + unsigned char i = 0, m = 0, n = 0; + + i = y / 8; + m = y % 8; + n = 1 << m; + OLED_GRAM[x][i] |= n; +} + +/** + * @brief Oled清除一个点 + * @param x: 点的竖地址,0~127 + * @param y: 点的行地址,0~63 + */ +void OledClearPoint(unsigned char x, unsigned char y) +{ + unsigned char i = 0, m = 0, n = 0; + + i = y / 8; + m = y % 8; + n = 1 << m; + OLED_GRAM[x][i] = ~OLED_GRAM[x][i]; + OLED_GRAM[x][i] |= n; + OLED_GRAM[x][i] = ~OLED_GRAM[x][i]; +} + +/** + * @brief 在指定位置显示一个字符,包括部分字符(取模方式 逐列式) + * @param x: 字符的竖地址,0~127 + * @param y: 字符的行地址,0~63 + * @param chr: 显示的字符值 + * @param size1: 字符显示字体:12/16/24 + */ +void OledShowChar(unsigned char x, unsigned char y, unsigned char chr, unsigned char size1) +{ + unsigned char i = 0, m = 0; + unsigned char temp = 0, size2 = 0, chr1 = 0; + unsigned char y0 = y; + size2 = (size1 / 8 + ((size1 % 8) ? 1 : 0)) * (size1 / 2); //得到字体一个字符对应点阵集所占的字节数 + chr1 = chr - ' '; //计算偏移后的值 + + for (i = 0; i < size2; i++) + { + if (size1 == 12) //调用1206字体 + { + temp = asc2_1206[chr1][i]; + } + else if (size1 == 16) //调用1608字体 + { + temp = asc2_1608[chr1][i]; + } + else + { + return; + } + + for (m = 0; m < 8; m++) //写入数据 + { + if (temp & 0x80) + { + OledDrawPoint(x, y); + } + else + { + OledClearPoint(x, y); + } + temp <<= 1; + y++; + if ((y - y0) == size1) + { + y = y0; + x++; + break; + } + } + } +} + +/** + * @brief 在指定位置显示字符串 + * @param x: 字符的竖地址,0~127 + * @param y: 字符的行地址,0~63 + * @param chr: 显示的字符串 + * @param size1: 字符显示字体:12/16/24 + */ +void OledShowString(unsigned char x, unsigned char y, char *chr, unsigned char size1) +{ + while ((*chr >= ' ') && (*chr <= '~')) //判断是不是非法字符! + { + OledShowChar(x, y, *chr, size1); + x += size1 / 2; + if (x > 128 - size1) //换行 + { + x = 0; + y += 2; + } + chr++; + } +} + +/** + * @brief Oled初始化函数 + */ +void OledInit(void) +{ + OledSendByte(0xAE, OLED_CMD); //--turn off oled panel # + OledSendByte(0x00, OLED_CMD); //---set low column address # + OledSendByte(0x10, OLED_CMD); //---set high column address # + OledSendByte(0x40, OLED_CMD); //--set start line address Set Mapping RAM Display Start Line (0x00~0x3F) # + OledSendByte(0x81, OLED_CMD); //--set contrast control register # + OledSendByte(0xCF, OLED_CMD); // Set SEG Output Current Brightness # + OledSendByte(0xA1, OLED_CMD); //--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 # + OledSendByte(0xC8, OLED_CMD); //Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 # + OledSendByte(0xA6, OLED_CMD); //--set normal display + OledSendByte(0xA8, OLED_CMD); //--set multiplex ratio(1 to 64) # + OledSendByte(0x3f, OLED_CMD); //--1/64 duty # + OledSendByte(0xD3, OLED_CMD); //-set display offset Shift Mapping RAM Counter (0x00~0x3F) # + OledSendByte(0x00, OLED_CMD); //-not offset # + OledSendByte(0xd5, OLED_CMD); //--set display clock divide ratio/oscillator frequency # + OledSendByte(0x80, OLED_CMD); //--set divide ratio, Set Clock as 100 Frames/Sec # + OledSendByte(0xD9, OLED_CMD); //--set pre-charge period # + OledSendByte(0xF1, OLED_CMD); //Set Pre-Charge as 15 Clocks & Discharge as 1 Clock # + OledSendByte(0xDA, OLED_CMD); //--set com pins hardware configuration # + OledSendByte(0x12, OLED_CMD); // # + OledSendByte(0xDB, OLED_CMD); //--set vcomh # + OledSendByte(0x40, OLED_CMD); //Set VCOM Deselect Level # + OledSendByte(0x20, OLED_CMD); //-Set Page Addressing Mode (0x00/0x01/0x02) # + OledSendByte(0x02, OLED_CMD); // + OledSendByte(0x8D, OLED_CMD); //--set Charge Pump enable/disable # + OledSendByte(0x14, OLED_CMD); //--set(0x10) disable # + OledSendByte(0xA4, OLED_CMD); // Disable Entire Display On (0xa4/0xa5) # + OledSendByte(0xA6, OLED_CMD); // Disable Inverse Display On (0xa6/a7) # + OledSendByte(0xAF, OLED_CMD); // # + OledClear(); +} + +/** + * @brief IIC配置及Oled初始化函数 + */ +void OledIICInit(void) +{ + //初始化I2C0 配置,速率为400K + IoTGpioInit(IOT_GPIO_IO_GPIO_13); + IoTGpioInit(IOT_GPIO_IO_GPIO_14); + + IotIoSetPull(IOT_GPIO_IO_GPIO_13, IOT_IO_PULL_UP); + IotIoSetPull(IOT_GPIO_IO_GPIO_14, IOT_IO_PULL_UP); + + IotIoSetFunc(IOT_GPIO_IO_GPIO_13, HI_IO_FUNC_GPIO_13_I2C0_SDA); + IotIoSetFunc(IOT_GPIO_IO_GPIO_14, HI_IO_FUNC_GPIO_14_I2C0_SCL); + + hi_i2c_init(HI_I2C_IDX_0, 400 * 1000); + + OledInit(); +} diff --git a/applications/app/TW210_Module_battery/battery_oledfont.h b/applications/app/TW210_Module_battery/battery_oledfont.h new file mode 100644 index 0000000000000000000000000000000000000000..88d1f4428f770bd4a66cde03ec5d657b2b27a3c8 --- /dev/null +++ b/applications/app/TW210_Module_battery/battery_oledfont.h @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2021 Talkweb Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef __OLEDFONT_H +#define __OLEDFONT_H + +const unsigned char asc2_1206[95][12] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*" ",0*/ + {0x00, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"!",1*/ + {0x00, 0x00, 0x30, 0x00, 0x40, 0x00, 0x30, 0x00, 0x40, 0x00, 0x00, 0x00}, /*""",2*/ + {0x09, 0x00, 0x0B, 0xC0, 0x3D, 0x00, 0x0B, 0xC0, 0x3D, 0x00, 0x09, 0x00}, /*"#",3*/ + {0x18, 0xC0, 0x24, 0x40, 0x7F, 0xE0, 0x22, 0x40, 0x31, 0x80, 0x00, 0x00}, /*"$",4*/ + {0x18, 0x00, 0x24, 0xC0, 0x1B, 0x00, 0x0D, 0x80, 0x32, 0x40, 0x01, 0x80}, /*"%",5*/ + {0x03, 0x80, 0x1C, 0x40, 0x27, 0x40, 0x1C, 0x80, 0x07, 0x40, 0x00, 0x40}, /*"&",6*/ + {0x10, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"'",7*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x20, 0x40, 0x40, 0x20}, /*"(",8*/ + {0x00, 0x00, 0x40, 0x20, 0x20, 0x40, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00}, /*")",9*/ + {0x09, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x06, 0x00, 0x09, 0x00, 0x00, 0x00}, /*"*",10*/ + {0x04, 0x00, 0x04, 0x00, 0x3F, 0x80, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00}, /*"+",11*/ + {0x00, 0x10, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*",",12*/ + {0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00}, /*"-",13*/ + {0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*".",14*/ + {0x00, 0x20, 0x01, 0xC0, 0x06, 0x00, 0x38, 0x00, 0x40, 0x00, 0x00, 0x00}, /*"/",15*/ + {0x1F, 0x80, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x1F, 0x80, 0x00, 0x00}, /*"0",16*/ + {0x00, 0x00, 0x10, 0x40, 0x3F, 0xC0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00}, /*"1",17*/ + {0x18, 0xC0, 0x21, 0x40, 0x22, 0x40, 0x24, 0x40, 0x18, 0x40, 0x00, 0x00}, /*"2",18*/ + {0x10, 0x80, 0x20, 0x40, 0x24, 0x40, 0x24, 0x40, 0x1B, 0x80, 0x00, 0x00}, /*"3",19*/ + {0x02, 0x00, 0x0D, 0x00, 0x11, 0x00, 0x3F, 0xC0, 0x01, 0x40, 0x00, 0x00}, /*"4",20*/ + {0x3C, 0x80, 0x24, 0x40, 0x24, 0x40, 0x24, 0x40, 0x23, 0x80, 0x00, 0x00}, /*"5",21*/ + {0x1F, 0x80, 0x24, 0x40, 0x24, 0x40, 0x34, 0x40, 0x03, 0x80, 0x00, 0x00}, /*"6",22*/ + {0x30, 0x00, 0x20, 0x00, 0x27, 0xC0, 0x38, 0x00, 0x20, 0x00, 0x00, 0x00}, /*"7",23*/ + {0x1B, 0x80, 0x24, 0x40, 0x24, 0x40, 0x24, 0x40, 0x1B, 0x80, 0x00, 0x00}, /*"8",24*/ + {0x1C, 0x00, 0x22, 0xC0, 0x22, 0x40, 0x22, 0x40, 0x1F, 0x80, 0x00, 0x00}, /*"9",25*/ + {0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*":",26*/ + {0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*";",27*/ + {0x00, 0x00, 0x04, 0x00, 0x0A, 0x00, 0x11, 0x00, 0x20, 0x80, 0x40, 0x40}, /*"<",28*/ + {0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x00, 0x00}, /*"=",29*/ + {0x00, 0x00, 0x40, 0x40, 0x20, 0x80, 0x11, 0x00, 0x0A, 0x00, 0x04, 0x00}, /*">",30*/ + {0x18, 0x00, 0x20, 0x00, 0x23, 0x40, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00}, /*"?",31*/ + {0x1F, 0x80, 0x20, 0x40, 0x27, 0x40, 0x29, 0x40, 0x1F, 0x40, 0x00, 0x00}, /*"@",32*/ + {0x00, 0x40, 0x07, 0xC0, 0x39, 0x00, 0x0F, 0x00, 0x01, 0xC0, 0x00, 0x40}, /*"A",33*/ + {0x20, 0x40, 0x3F, 0xC0, 0x24, 0x40, 0x24, 0x40, 0x1B, 0x80, 0x00, 0x00}, /*"B",34*/ + {0x1F, 0x80, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x30, 0x80, 0x00, 0x00}, /*"C",35*/ + {0x20, 0x40, 0x3F, 0xC0, 0x20, 0x40, 0x20, 0x40, 0x1F, 0x80, 0x00, 0x00}, /*"D",36*/ + {0x20, 0x40, 0x3F, 0xC0, 0x24, 0x40, 0x2E, 0x40, 0x30, 0xC0, 0x00, 0x00}, /*"E",37*/ + {0x20, 0x40, 0x3F, 0xC0, 0x24, 0x40, 0x2E, 0x00, 0x30, 0x00, 0x00, 0x00}, /*"F",38*/ + {0x0F, 0x00, 0x10, 0x80, 0x20, 0x40, 0x22, 0x40, 0x33, 0x80, 0x02, 0x00}, /*"G",39*/ + {0x20, 0x40, 0x3F, 0xC0, 0x04, 0x00, 0x04, 0x00, 0x3F, 0xC0, 0x20, 0x40}, /*"H",40*/ + {0x20, 0x40, 0x20, 0x40, 0x3F, 0xC0, 0x20, 0x40, 0x20, 0x40, 0x00, 0x00}, /*"I",41*/ + {0x00, 0x60, 0x20, 0x20, 0x20, 0x20, 0x3F, 0xC0, 0x20, 0x00, 0x20, 0x00}, /*"J",42*/ + {0x20, 0x40, 0x3F, 0xC0, 0x24, 0x40, 0x0B, 0x00, 0x30, 0xC0, 0x20, 0x40}, /*"K",43*/ + {0x20, 0x40, 0x3F, 0xC0, 0x20, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xC0}, /*"L",44*/ + {0x3F, 0xC0, 0x3C, 0x00, 0x03, 0xC0, 0x3C, 0x00, 0x3F, 0xC0, 0x00, 0x00}, /*"M",45*/ + {0x20, 0x40, 0x3F, 0xC0, 0x0C, 0x40, 0x23, 0x00, 0x3F, 0xC0, 0x20, 0x00}, /*"N",46*/ + {0x1F, 0x80, 0x20, 0x40, 0x20, 0x40, 0x20, 0x40, 0x1F, 0x80, 0x00, 0x00}, /*"O",47*/ + {0x20, 0x40, 0x3F, 0xC0, 0x24, 0x40, 0x24, 0x00, 0x18, 0x00, 0x00, 0x00}, /*"P",48*/ + {0x1F, 0x80, 0x21, 0x40, 0x21, 0x40, 0x20, 0xE0, 0x1F, 0xA0, 0x00, 0x00}, /*"Q",49*/ + {0x20, 0x40, 0x3F, 0xC0, 0x24, 0x40, 0x26, 0x00, 0x19, 0xC0, 0x00, 0x40}, /*"R",50*/ + {0x18, 0xC0, 0x24, 0x40, 0x24, 0x40, 0x22, 0x40, 0x31, 0x80, 0x00, 0x00}, /*"S",51*/ + {0x30, 0x00, 0x20, 0x40, 0x3F, 0xC0, 0x20, 0x40, 0x30, 0x00, 0x00, 0x00}, /*"T",52*/ + {0x20, 0x00, 0x3F, 0x80, 0x00, 0x40, 0x00, 0x40, 0x3F, 0x80, 0x20, 0x00}, /*"U",53*/ + {0x20, 0x00, 0x3E, 0x00, 0x01, 0xC0, 0x07, 0x00, 0x38, 0x00, 0x20, 0x00}, /*"V",54*/ + {0x38, 0x00, 0x07, 0xC0, 0x3C, 0x00, 0x07, 0xC0, 0x38, 0x00, 0x00, 0x00}, /*"W",55*/ + {0x20, 0x40, 0x39, 0xC0, 0x06, 0x00, 0x39, 0xC0, 0x20, 0x40, 0x00, 0x00}, /*"X",56*/ + {0x20, 0x00, 0x38, 0x40, 0x07, 0xC0, 0x38, 0x40, 0x20, 0x00, 0x00, 0x00}, /*"Y",57*/ + {0x30, 0x40, 0x21, 0xC0, 0x26, 0x40, 0x38, 0x40, 0x20, 0xC0, 0x00, 0x00}, /*"Z",58*/ + {0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x40, 0x20, 0x40, 0x20, 0x00, 0x00}, /*"[",59*/ + {0x00, 0x00, 0x70, 0x00, 0x0C, 0x00, 0x03, 0x80, 0x00, 0x40, 0x00, 0x00}, /*"\",60*/ + {0x00, 0x00, 0x40, 0x20, 0x40, 0x20, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00}, /*"]",61*/ + {0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"^",62*/ + {0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10}, /*"_",63*/ + {0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"`",64*/ + {0x00, 0x00, 0x02, 0x80, 0x05, 0x40, 0x05, 0x40, 0x03, 0xC0, 0x00, 0x40}, /*"a",65*/ + {0x20, 0x00, 0x3F, 0xC0, 0x04, 0x40, 0x04, 0x40, 0x03, 0x80, 0x00, 0x00}, /*"b",66*/ + {0x00, 0x00, 0x03, 0x80, 0x04, 0x40, 0x04, 0x40, 0x06, 0x40, 0x00, 0x00}, /*"c",67*/ + {0x00, 0x00, 0x03, 0x80, 0x04, 0x40, 0x24, 0x40, 0x3F, 0xC0, 0x00, 0x40}, /*"d",68*/ + {0x00, 0x00, 0x03, 0x80, 0x05, 0x40, 0x05, 0x40, 0x03, 0x40, 0x00, 0x00}, /*"e",69*/ + {0x00, 0x00, 0x04, 0x40, 0x1F, 0xC0, 0x24, 0x40, 0x24, 0x40, 0x20, 0x00}, /*"f",70*/ + {0x00, 0x00, 0x02, 0xE0, 0x05, 0x50, 0x05, 0x50, 0x06, 0x50, 0x04, 0x20}, /*"g",71*/ + {0x20, 0x40, 0x3F, 0xC0, 0x04, 0x40, 0x04, 0x00, 0x03, 0xC0, 0x00, 0x40}, /*"h",72*/ + {0x00, 0x00, 0x04, 0x40, 0x27, 0xC0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00}, /*"i",73*/ + {0x00, 0x10, 0x00, 0x10, 0x04, 0x10, 0x27, 0xE0, 0x00, 0x00, 0x00, 0x00}, /*"j",74*/ + {0x20, 0x40, 0x3F, 0xC0, 0x01, 0x40, 0x07, 0x00, 0x04, 0xC0, 0x04, 0x40}, /*"k",75*/ + {0x20, 0x40, 0x20, 0x40, 0x3F, 0xC0, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00}, /*"l",76*/ + {0x07, 0xC0, 0x04, 0x00, 0x07, 0xC0, 0x04, 0x00, 0x03, 0xC0, 0x00, 0x00}, /*"m",77*/ + {0x04, 0x40, 0x07, 0xC0, 0x04, 0x40, 0x04, 0x00, 0x03, 0xC0, 0x00, 0x40}, /*"n",78*/ + {0x00, 0x00, 0x03, 0x80, 0x04, 0x40, 0x04, 0x40, 0x03, 0x80, 0x00, 0x00}, /*"o",79*/ + {0x04, 0x10, 0x07, 0xF0, 0x04, 0x50, 0x04, 0x40, 0x03, 0x80, 0x00, 0x00}, /*"p",80*/ + {0x00, 0x00, 0x03, 0x80, 0x04, 0x40, 0x04, 0x50, 0x07, 0xF0, 0x00, 0x10}, /*"q",81*/ + {0x04, 0x40, 0x07, 0xC0, 0x02, 0x40, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00}, /*"r",82*/ + {0x00, 0x00, 0x06, 0x40, 0x05, 0x40, 0x05, 0x40, 0x04, 0xC0, 0x00, 0x00}, /*"s",83*/ + {0x00, 0x00, 0x04, 0x00, 0x1F, 0x80, 0x04, 0x40, 0x00, 0x40, 0x00, 0x00}, /*"t",84*/ + {0x04, 0x00, 0x07, 0x80, 0x00, 0x40, 0x04, 0x40, 0x07, 0xC0, 0x00, 0x40}, /*"u",85*/ + {0x04, 0x00, 0x07, 0x00, 0x04, 0xC0, 0x01, 0x80, 0x06, 0x00, 0x04, 0x00}, /*"v",86*/ + {0x06, 0x00, 0x01, 0xC0, 0x07, 0x00, 0x01, 0xC0, 0x06, 0x00, 0x00, 0x00}, /*"w",87*/ + {0x04, 0x40, 0x06, 0xC0, 0x01, 0x00, 0x06, 0xC0, 0x04, 0x40, 0x00, 0x00}, /*"x",88*/ + {0x04, 0x10, 0x07, 0x10, 0x04, 0xE0, 0x01, 0x80, 0x06, 0x00, 0x04, 0x00}, /*"y",89*/ + {0x00, 0x00, 0x04, 0x40, 0x05, 0xC0, 0x06, 0x40, 0x04, 0x40, 0x00, 0x00}, /*"z",90*/ + {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7B, 0xE0, 0x40, 0x20, 0x00, 0x00}, /*"{",91*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00}, /*"|",92*/ + {0x00, 0x00, 0x40, 0x20, 0x7B, 0xE0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"}",93*/ + {0x40, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00}, /*"~",94*/ +}; + +//16*16 +const unsigned char asc2_1608[95][16] = { + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*" ",0*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xCC, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"!",1*/ + {0x00, 0x00, 0x08, 0x00, 0x30, 0x00, 0x60, 0x00, 0x08, 0x00, 0x30, 0x00, 0x60, 0x00, 0x00, 0x00}, /*""",2*/ + {0x02, 0x20, 0x03, 0xFC, 0x1E, 0x20, 0x02, 0x20, 0x03, 0xFC, 0x1E, 0x20, 0x02, 0x20, 0x00, 0x00}, /*"#",3*/ + {0x00, 0x00, 0x0E, 0x18, 0x11, 0x04, 0x3F, 0xFF, 0x10, 0x84, 0x0C, 0x78, 0x00, 0x00, 0x00, 0x00}, /*"$",4*/ + {0x0F, 0x00, 0x10, 0x84, 0x0F, 0x38, 0x00, 0xC0, 0x07, 0x78, 0x18, 0x84, 0x00, 0x78, 0x00, 0x00}, /*"%",5*/ + {0x00, 0x78, 0x0F, 0x84, 0x10, 0xC4, 0x11, 0x24, 0x0E, 0x98, 0x00, 0xE4, 0x00, 0x84, 0x00, 0x08}, /*"&",6*/ + {0x08, 0x00, 0x68, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"'",7*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x18, 0x18, 0x20, 0x04, 0x40, 0x02, 0x00, 0x00}, /*"(",8*/ + {0x00, 0x00, 0x40, 0x02, 0x20, 0x04, 0x18, 0x18, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*")",9*/ + {0x02, 0x40, 0x02, 0x40, 0x01, 0x80, 0x0F, 0xF0, 0x01, 0x80, 0x02, 0x40, 0x02, 0x40, 0x00, 0x00}, /*"*",10*/ + {0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x0F, 0xF8, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00}, /*"+",11*/ + {0x00, 0x01, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*",",12*/ + {0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80}, /*"-",13*/ + {0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*".",14*/ + {0x00, 0x00, 0x00, 0x06, 0x00, 0x18, 0x00, 0x60, 0x01, 0x80, 0x06, 0x00, 0x18, 0x00, 0x20, 0x00}, /*"/",15*/ + {0x00, 0x00, 0x07, 0xF0, 0x08, 0x08, 0x10, 0x04, 0x10, 0x04, 0x08, 0x08, 0x07, 0xF0, 0x00, 0x00}, /*"0",16*/ + {0x00, 0x00, 0x08, 0x04, 0x08, 0x04, 0x1F, 0xFC, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}, /*"1",17*/ + {0x00, 0x00, 0x0E, 0x0C, 0x10, 0x14, 0x10, 0x24, 0x10, 0x44, 0x11, 0x84, 0x0E, 0x0C, 0x00, 0x00}, /*"2",18*/ + {0x00, 0x00, 0x0C, 0x18, 0x10, 0x04, 0x11, 0x04, 0x11, 0x04, 0x12, 0x88, 0x0C, 0x70, 0x00, 0x00}, /*"3",19*/ + {0x00, 0x00, 0x00, 0xE0, 0x03, 0x20, 0x04, 0x24, 0x08, 0x24, 0x1F, 0xFC, 0x00, 0x24, 0x00, 0x00}, /*"4",20*/ + {0x00, 0x00, 0x1F, 0x98, 0x10, 0x84, 0x11, 0x04, 0x11, 0x04, 0x10, 0x88, 0x10, 0x70, 0x00, 0x00}, /*"5",21*/ + {0x00, 0x00, 0x07, 0xF0, 0x08, 0x88, 0x11, 0x04, 0x11, 0x04, 0x18, 0x88, 0x00, 0x70, 0x00, 0x00}, /*"6",22*/ + {0x00, 0x00, 0x1C, 0x00, 0x10, 0x00, 0x10, 0xFC, 0x13, 0x00, 0x1C, 0x00, 0x10, 0x00, 0x00, 0x00}, /*"7",23*/ + {0x00, 0x00, 0x0E, 0x38, 0x11, 0x44, 0x10, 0x84, 0x10, 0x84, 0x11, 0x44, 0x0E, 0x38, 0x00, 0x00}, /*"8",24*/ + {0x00, 0x00, 0x07, 0x00, 0x08, 0x8C, 0x10, 0x44, 0x10, 0x44, 0x08, 0x88, 0x07, 0xF0, 0x00, 0x00}, /*"9",25*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0C, 0x03, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*":",26*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*";",27*/ + {0x00, 0x00, 0x00, 0x80, 0x01, 0x40, 0x02, 0x20, 0x04, 0x10, 0x08, 0x08, 0x10, 0x04, 0x00, 0x00}, /*"<",28*/ + {0x02, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0x20, 0x00, 0x00}, /*"=",29*/ + {0x00, 0x00, 0x10, 0x04, 0x08, 0x08, 0x04, 0x10, 0x02, 0x20, 0x01, 0x40, 0x00, 0x80, 0x00, 0x00}, /*">",30*/ + {0x00, 0x00, 0x0E, 0x00, 0x12, 0x00, 0x10, 0x0C, 0x10, 0x6C, 0x10, 0x80, 0x0F, 0x00, 0x00, 0x00}, /*"?",31*/ + {0x03, 0xE0, 0x0C, 0x18, 0x13, 0xE4, 0x14, 0x24, 0x17, 0xC4, 0x08, 0x28, 0x07, 0xD0, 0x00, 0x00}, /*"@",32*/ + {0x00, 0x04, 0x00, 0x3C, 0x03, 0xC4, 0x1C, 0x40, 0x07, 0x40, 0x00, 0xE4, 0x00, 0x1C, 0x00, 0x04}, /*"A",33*/ + {0x10, 0x04, 0x1F, 0xFC, 0x11, 0x04, 0x11, 0x04, 0x11, 0x04, 0x0E, 0x88, 0x00, 0x70, 0x00, 0x00}, /*"B",34*/ + {0x03, 0xE0, 0x0C, 0x18, 0x10, 0x04, 0x10, 0x04, 0x10, 0x04, 0x10, 0x08, 0x1C, 0x10, 0x00, 0x00}, /*"C",35*/ + {0x10, 0x04, 0x1F, 0xFC, 0x10, 0x04, 0x10, 0x04, 0x10, 0x04, 0x08, 0x08, 0x07, 0xF0, 0x00, 0x00}, /*"D",36*/ + {0x10, 0x04, 0x1F, 0xFC, 0x11, 0x04, 0x11, 0x04, 0x17, 0xC4, 0x10, 0x04, 0x08, 0x18, 0x00, 0x00}, /*"E",37*/ + {0x10, 0x04, 0x1F, 0xFC, 0x11, 0x04, 0x11, 0x00, 0x17, 0xC0, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00}, /*"F",38*/ + {0x03, 0xE0, 0x0C, 0x18, 0x10, 0x04, 0x10, 0x04, 0x10, 0x44, 0x1C, 0x78, 0x00, 0x40, 0x00, 0x00}, /*"G",39*/ + {0x10, 0x04, 0x1F, 0xFC, 0x10, 0x84, 0x00, 0x80, 0x00, 0x80, 0x10, 0x84, 0x1F, 0xFC, 0x10, 0x04}, /*"H",40*/ + {0x00, 0x00, 0x10, 0x04, 0x10, 0x04, 0x1F, 0xFC, 0x10, 0x04, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00}, /*"I",41*/ + {0x00, 0x03, 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x1F, 0xFE, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00}, /*"J",42*/ + {0x10, 0x04, 0x1F, 0xFC, 0x11, 0x04, 0x03, 0x80, 0x14, 0x64, 0x18, 0x1C, 0x10, 0x04, 0x00, 0x00}, /*"K",43*/ + {0x10, 0x04, 0x1F, 0xFC, 0x10, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x00}, /*"L",44*/ + {0x10, 0x04, 0x1F, 0xFC, 0x1F, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x1F, 0xFC, 0x10, 0x04, 0x00, 0x00}, /*"M",45*/ + {0x10, 0x04, 0x1F, 0xFC, 0x0C, 0x04, 0x03, 0x00, 0x00, 0xE0, 0x10, 0x18, 0x1F, 0xFC, 0x10, 0x00}, /*"N",46*/ + {0x07, 0xF0, 0x08, 0x08, 0x10, 0x04, 0x10, 0x04, 0x10, 0x04, 0x08, 0x08, 0x07, 0xF0, 0x00, 0x00}, /*"O",47*/ + {0x10, 0x04, 0x1F, 0xFC, 0x10, 0x84, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x0F, 0x00, 0x00, 0x00}, /*"P",48*/ + {0x07, 0xF0, 0x08, 0x18, 0x10, 0x24, 0x10, 0x24, 0x10, 0x1C, 0x08, 0x0A, 0x07, 0xF2, 0x00, 0x00}, /*"Q",49*/ + {0x10, 0x04, 0x1F, 0xFC, 0x11, 0x04, 0x11, 0x00, 0x11, 0xC0, 0x11, 0x30, 0x0E, 0x0C, 0x00, 0x04}, /*"R",50*/ + {0x00, 0x00, 0x0E, 0x1C, 0x11, 0x04, 0x10, 0x84, 0x10, 0x84, 0x10, 0x44, 0x1C, 0x38, 0x00, 0x00}, /*"S",51*/ + {0x18, 0x00, 0x10, 0x00, 0x10, 0x04, 0x1F, 0xFC, 0x10, 0x04, 0x10, 0x00, 0x18, 0x00, 0x00, 0x00}, /*"T",52*/ + {0x10, 0x00, 0x1F, 0xF8, 0x10, 0x04, 0x00, 0x04, 0x00, 0x04, 0x10, 0x04, 0x1F, 0xF8, 0x10, 0x00}, /*"U",53*/ + {0x10, 0x00, 0x1E, 0x00, 0x11, 0xE0, 0x00, 0x1C, 0x00, 0x70, 0x13, 0x80, 0x1C, 0x00, 0x10, 0x00}, /*"V",54*/ + {0x1F, 0xC0, 0x10, 0x3C, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0xE0, 0x10, 0x3C, 0x1F, 0xC0, 0x00, 0x00}, /*"W",55*/ + {0x10, 0x04, 0x18, 0x0C, 0x16, 0x34, 0x01, 0xC0, 0x01, 0xC0, 0x16, 0x34, 0x18, 0x0C, 0x10, 0x04}, /*"X",56*/ + {0x10, 0x00, 0x1C, 0x00, 0x13, 0x04, 0x00, 0xFC, 0x13, 0x04, 0x1C, 0x00, 0x10, 0x00, 0x00, 0x00}, /*"Y",57*/ + {0x08, 0x04, 0x10, 0x1C, 0x10, 0x64, 0x10, 0x84, 0x13, 0x04, 0x1C, 0x04, 0x10, 0x18, 0x00, 0x00}, /*"Z",58*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x00, 0x00}, /*"[",59*/ + {0x00, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x03, 0x80, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00}, /*"\",60*/ + {0x00, 0x00, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"]",61*/ + {0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00}, /*"^",62*/ + {0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01}, /*"_",63*/ + {0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"`",64*/ + {0x00, 0x00, 0x00, 0x98, 0x01, 0x24, 0x01, 0x44, 0x01, 0x44, 0x01, 0x44, 0x00, 0xFC, 0x00, 0x04}, /*"a",65*/ + {0x10, 0x00, 0x1F, 0xFC, 0x00, 0x88, 0x01, 0x04, 0x01, 0x04, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00}, /*"b",66*/ + {0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x00, 0x88, 0x00, 0x00}, /*"c",67*/ + {0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x01, 0x04, 0x01, 0x04, 0x11, 0x08, 0x1F, 0xFC, 0x00, 0x04}, /*"d",68*/ + {0x00, 0x00, 0x00, 0xF8, 0x01, 0x44, 0x01, 0x44, 0x01, 0x44, 0x01, 0x44, 0x00, 0xC8, 0x00, 0x00}, /*"e",69*/ + {0x00, 0x00, 0x01, 0x04, 0x01, 0x04, 0x0F, 0xFC, 0x11, 0x04, 0x11, 0x04, 0x11, 0x00, 0x18, 0x00}, /*"f",70*/ + {0x00, 0x00, 0x00, 0xD6, 0x01, 0x29, 0x01, 0x29, 0x01, 0x29, 0x01, 0xC9, 0x01, 0x06, 0x00, 0x00}, /*"g",71*/ + {0x10, 0x04, 0x1F, 0xFC, 0x00, 0x84, 0x01, 0x00, 0x01, 0x00, 0x01, 0x04, 0x00, 0xFC, 0x00, 0x04}, /*"h",72*/ + {0x00, 0x00, 0x01, 0x04, 0x19, 0x04, 0x19, 0xFC, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}, /*"i",73*/ + {0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x01, 0x01, 0x19, 0x01, 0x19, 0xFE, 0x00, 0x00, 0x00, 0x00}, /*"j",74*/ + {0x10, 0x04, 0x1F, 0xFC, 0x00, 0x24, 0x00, 0x40, 0x01, 0xB4, 0x01, 0x0C, 0x01, 0x04, 0x00, 0x00}, /*"k",75*/ + {0x00, 0x00, 0x10, 0x04, 0x10, 0x04, 0x1F, 0xFC, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00}, /*"l",76*/ + {0x01, 0x04, 0x01, 0xFC, 0x01, 0x04, 0x01, 0x00, 0x01, 0xFC, 0x01, 0x04, 0x01, 0x00, 0x00, 0xFC}, /*"m",77*/ + {0x01, 0x04, 0x01, 0xFC, 0x00, 0x84, 0x01, 0x00, 0x01, 0x00, 0x01, 0x04, 0x00, 0xFC, 0x00, 0x04}, /*"n",78*/ + {0x00, 0x00, 0x00, 0xF8, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x01, 0x04, 0x00, 0xF8, 0x00, 0x00}, /*"o",79*/ + {0x01, 0x01, 0x01, 0xFF, 0x00, 0x85, 0x01, 0x04, 0x01, 0x04, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00}, /*"p",80*/ + {0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x01, 0x04, 0x01, 0x04, 0x01, 0x05, 0x01, 0xFF, 0x00, 0x01}, /*"q",81*/ + {0x01, 0x04, 0x01, 0x04, 0x01, 0xFC, 0x00, 0x84, 0x01, 0x04, 0x01, 0x00, 0x01, 0x80, 0x00, 0x00}, /*"r",82*/ + {0x00, 0x00, 0x00, 0xCC, 0x01, 0x24, 0x01, 0x24, 0x01, 0x24, 0x01, 0x24, 0x01, 0x98, 0x00, 0x00}, /*"s",83*/ + {0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x07, 0xF8, 0x01, 0x04, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00}, /*"t",84*/ + {0x01, 0x00, 0x01, 0xF8, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x01, 0x08, 0x01, 0xFC, 0x00, 0x04}, /*"u",85*/ + {0x01, 0x00, 0x01, 0x80, 0x01, 0x70, 0x00, 0x0C, 0x00, 0x10, 0x01, 0x60, 0x01, 0x80, 0x01, 0x00}, /*"v",86*/ + {0x01, 0xF0, 0x01, 0x0C, 0x00, 0x30, 0x01, 0xC0, 0x00, 0x30, 0x01, 0x0C, 0x01, 0xF0, 0x01, 0x00}, /*"w",87*/ + {0x00, 0x00, 0x01, 0x04, 0x01, 0x8C, 0x00, 0x74, 0x01, 0x70, 0x01, 0x8C, 0x01, 0x04, 0x00, 0x00}, /*"x",88*/ + {0x01, 0x01, 0x01, 0x81, 0x01, 0x71, 0x00, 0x0E, 0x00, 0x18, 0x01, 0x60, 0x01, 0x80, 0x01, 0x00}, /*"y",89*/ + {0x00, 0x00, 0x01, 0x84, 0x01, 0x0C, 0x01, 0x34, 0x01, 0x44, 0x01, 0x84, 0x01, 0x0C, 0x00, 0x00}, /*"z",90*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3E, 0xFC, 0x40, 0x02, 0x40, 0x02}, /*"{",91*/ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"|",92*/ + {0x00, 0x00, 0x40, 0x02, 0x40, 0x02, 0x3E, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*"}",93*/ + {0x00, 0x00, 0x60, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00}, /*"~",94*/ +}; + +#endif