目录
1.LCD介绍:
视频链接:【硬核科普】全网最简洁易懂的OLED与LCD屏幕工作原理与优劣科普_哔哩哔哩_bilibili
液晶层发生偏转,就可以调节亮度,通过比例大小的改变导致输出的颜色不同
目前LCD是用一整个背光板
工作原理
LCD本身并不发光,而是需要背光层(通常是LED或CCFL)来提供光源。液晶分子被夹在两片玻璃基板之间,这些液晶分子在电场的作用下会发生排列变化,从而改变光线的透过率。通过控制每个像素点上的电场强度,可以精确控制该像素点的亮度,进而形成图像。
显示特性
- 色彩:LCD通过彩色滤光片(Color Filter)来实现彩色显示。每个像素点由红、绿、蓝三个子像素组成,通过控制这三个子像素的亮度,可以混合出各种颜色。
- 对比度:LCD的对比度受到背光层亮度和液晶分子透光率的影响。虽然现代LCD技术已经大大提高了对比度,但与OLED相比,其黑色表现仍然不够深沉。
- 视角:LCD的可视角度相对较大,但随着观看角度的偏离,色彩和亮度可能会有所变化。不过,现代IPS(In-Plane Switching)和VA(Vertical Alignment)等技术的LCD屏幕已经大大改善了这一问题。
优缺点
优点:
- 技术成熟,制造成本相对较低。
- 色彩表现稳定,适合长时间观看。
- 分辨率和尺寸灵活,可以满足不同设备和应用场景的需求。
缺点:
- 依赖背光层,能耗相对较高。
- 黑色表现不够深沉,对比度相对较低。
- 在极端温度下,液晶分子的性能可能会受到影响
2.LCD与OLED的区别:
oled:有机自放光二极管organic - light emitting diode
oled没有背光层,可以独立控制每一个LED的开关
1. 工作原理
- LCD:LCD不具备自发光特性,需要背光层来提供光源。液晶分子在特定电场作用下会发生排列变化,从而控制光线的穿透程度,进而显示出不同的颜色和亮度。
- OLED:OLED则采用了自发光技术,当电流通过时,有机材料会直接发光。每个像素点都可以独立控制发光,因此在显示黑色时能做到几乎完全不发光。
2. 显示效果
- 色彩与对比度:OLED屏幕能够显示出更加鲜艳的色彩和更深的黑色,因为每个像素点都可以独立发光,且黑色表现几乎不发光,所以对比度更高。而LCD屏幕的色彩表现相对稳定,但受限于背光层的影响,黑色表现不够深沉,对比度相对较低。
- 视角:OLED屏幕的可视角度更大,观众从不同角度观看时仍能保持图像清晰可见。LCD屏幕虽然也有较好的可视角度,但相比OLED略有逊色。
3. 屏幕厚度与重量
- OLED:由于无需背光层,OLED屏幕可以做到更薄更轻,这为未来可弯曲屏、折叠屏的出现提供了可能。
- LCD:由于有背光层和液晶层的存在,LCD屏幕的厚度相对较大,重量也较重。
4. 能耗
- OLED:OLED屏幕在显示黑色或深色内容时几乎不耗电,因此整体能耗较低。
- LCD:由于需要持续的背光照明,LCD屏幕在能耗方面相对较高。
5. 寿命与稳定性
- OLED:OLED屏幕的寿命可能会受到屏幕亮度和使用时间的影响。长时间显示同一内容可能会导致像素点老化,出现“烧屏”现象。然而,随着技术的进步,OLED屏幕的寿命已经得到了显著提升。
- LCD:LCD屏幕的技术相对成熟,制造成本较低,且老化速度相对较慢。因此,在寿命和稳定性方面表现较好。
6. 应用场景
- OLED:因其卓越的色彩表现和对比度而逐渐受到高端市场的青睐。在高端电视、手机和平板电脑等领域的应用越来越广泛。
- LCD:由于技术成熟、制造成本相对较低,LCD屏幕在中低端电子产品中仍有广泛应用。此外,LCD屏幕在尺寸和分辨率方面具有较大的灵活性,可以满足不同设备和应用场景的需求。
未来的发展方向microLCD
实验所用模块:ATK-4.3’ TFTLCD
ATK-4.3’ TFTLCD 模块是 ALIENTEK 推出的一款高性能 TFTLCD 显示模块,外观漂亮、 性能优异、结构紧凑。模块通过 1 个 2*17P 的 2.54mm 间距排针与外部连接
原理图模块与数据手册介绍:
ATK-4.3’ TFTLCD 电容触摸屏模块通过 2*17 的排针(2.54mm 间距)同外部连接,模块可以与 ALIENTEK 的 STM32 开发板直接对接。模块通过 34(2*17)个引脚同外部连接,对外接口 原理图
、
从上表可以看出,LCD 控制器总共需要 21 个 IO 口,背光控制需要 1 个 IO 口,电容触 摸屏需要 4 个 IO 口,这样整个模块需要 26 个 IO 口驱动
LCD驱动:
ATK-4.3’ TFTLCD 模块采用 NT35510 作为 LCD 驱动器,该驱动器自带 LCD GRAM, 无需外加独立驱动器,并且,在指令上,基本兼容 ILI9341,使用非常方便。模块采用 16 位 8080 并口与外部连接(不支持其他接口方式,仅支持 16 位 8080 并口),在 8080 并口模 式下,
LCD 驱动需要用到的信号线如下: CS:LCD 片选信号。 WR:向 LCD 写入数据。 RD:从 LCD 读取数据。 D[15:0]:16 位双向数据线。 RST:硬复位 LCD。 RS:命令/数据标志(0,读写命令;1,读写数据)。
除了以上信号,我们一般还需要用到这 2 个信号:RST 和 BL_CTR,其中 RST 是液晶 的硬复位脚,低电平有效,用于复位 NT35510 芯片,实现液晶复位,在每次初始化之前, 我们强烈建议大家先执行硬复位,再做初始化。BL_CTR 则是背光控制引脚,高电平有效, BL_CTR 自带了 100K 下拉电阻,所以如果这个引脚悬空,背光是不会亮的。必须接高电平, 背光才会亮,另外可以用 PWM 控制 BL_CTR 脚,从而控制背光的亮度。
NT35510 自带 LCD GRAM(480*864*3 字节),并且最高支持 24 位颜色深度(1600 万 色),不过,我们一般使用 16 位颜色深度(65K 色),RGB565 格式,这样,在 16 位模式下, 可以达到最快的速度。 在 16 位模式下,NT35510 采用 RGB565 格式存储颜色数据,此时 NT35510 的低 16 位 数据总线(高 8 位没有用到)与 MCU 的 16 位数据线以及 24 位 LCD GRAM 的对应关系如 表
Cubemx移植:
教程视频:使用CubeMX移植正点原子STM32LCD屏幕教程_哔哩哔哩_bilibili
移植代码链接:4.3寸TFTLCD电容触摸屏800*480 — 正点原子资料下载中心 1.0.0 文档 (openedv.com)
(找对应芯片代码或则找开发板资料代码)
只用把lcd.c添加入工程,lcd_ex.添加在.h文件中,不用添加入.c中,不然会文件冲突报错
注意:在调试过程中会发生一部分报错
1.正点的delay_us.delay_ms函数是正点自定义函数,可选择添加,或则自己编写延时函数,可循环递减也可调用滴答定时器,本次实验调用了滴答定时器参数
2.在新建工程中,有些配置文件未使能,在#include "stm32f4xx_hal_conf.h"中要去掉注释,使能
报错:未使能
使能:
3.不同芯片记得修改引脚,文件引脚未在Cubemx中配置
4..h文件因为路径需要修改名称
5.要手动引入两个库文件:
颜色:
/* 常用画笔颜色 */
#define WHITE 0xFFFF /* 白色 */
#define BLACK 0x0000 /* 黑色 */
#define RED 0xF800 /* 红色 */
#define GREEN 0x07E0 /* 绿色 */
#define BLUE 0x001F /* 蓝色 */
#define MAGENTA 0xF81F /* 品红色/紫红色 = BLUE + RED */
#define YELLOW 0xFFE0 /* 黄色 = GREEN + RED */
#define CYAN 0x07FF /* 青色 = GREEN + BLUE *//* 非常用颜色 */
#define BROWN 0xBC40 /* 棕色 */
#define BRRED 0xFC07 /* 棕红色 */
#define GRAY 0x8430 /* 灰色 */
#define DARKBLUE 0x01CF /* 深蓝色 */
#define LIGHTBLUE 0x7D7C /* 浅蓝色 */
#define GRAYBLUE 0x5458 /* 灰蓝色 */
#define LIGHTGREEN 0x841F /* 浅绿色 */
#define LGRAY 0xC618 /* 浅灰色(PANNEL),窗体背景色 */
#define LGRAYBLUE 0xA651 /* 浅灰蓝色(中间层颜色) */
#define LBBLUE 0x2B12 /* 浅棕蓝色(选择条目的反色) */
扫描方向:
/* 扫描方向定义 */
#define L2R_U2D 0 /* 从左到右,从上到下 */
#define L2R_D2U 1 /* 从左到右,从下到上 */
#define R2L_U2D 2 /* 从右到左,从上到下 */
#define R2L_D2U 3 /* 从右到左,从下到上 */#define U2D_L2R 4 /* 从上到下,从左到右 */
#define U2D_R2L 5 /* 从上到下,从右到左 */
#define D2U_L2R 6 /* 从下到上,从左到右 */
#define D2U_R2L 7 /* 从下到上,从右到左 */#define DFT_SCAN_DIR L2R_U2D /* 默认的扫描方向 */
函数声明:
void lcd_wr_data(volatile uint16_t data); /* LCD写数据 */
void lcd_wr_regno(volatile uint16_t regno); /* LCD写寄存器编号/地址 */
void lcd_write_reg(uint16_t regno, uint16_t data); /* LCD写寄存器的值 */void lcd_init(void); /* 初始化LCD */
void lcd_display_on(void); /* 开显示 */
void lcd_display_off(void); /* 关显示 */
void lcd_scan_dir(uint8_t dir); /* 设置屏扫描方向 */
void lcd_display_dir(uint8_t dir); /* 设置屏幕显示方向 */
void lcd_ssd_backlight_set(uint8_t pwm); /* SSD1963 背光控制 */void lcd_write_ram_prepare(void); /* 准备写GRAM */
void lcd_set_cursor(uint16_t x, uint16_t y); /* 设置光标 */
uint32_t lcd_read_point(uint16_t x, uint16_t y); /* 读点(32位颜色,兼容LTDC) */
void lcd_draw_point(uint16_t x, uint16_t y, uint32_t color);/* 画点(32位颜色,兼容LTDC) */void lcd_clear(uint16_t color); /* LCD清屏 */
void lcd_fill_circle(uint16_t x, uint16_t y, uint16_t r, uint16_t color); /* 填充实心圆 */
void lcd_draw_circle(uint16_t x0, uint16_t y0, uint8_t r, uint16_t color); /* 画圆 */
void lcd_draw_hline(uint16_t x, uint16_t y, uint16_t len, uint16_t color); /* 画水平线 */
void lcd_set_window(uint16_t sx, uint16_t sy, uint16_t width, uint16_t height); /* 设置窗口 */
void lcd_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint32_t color); /* 纯色填充矩形(32位颜色,兼容LTDC) */
void lcd_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *color); /* 彩色填充矩形 */
void lcd_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color); /* 画直线 */
void lcd_draw_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);/* 画矩形 */void lcd_show_char(uint16_t x, uint16_t y, char chr, uint8_t size, uint8_t mode, uint16_t color); /* 显示一个字符 */
void lcd_show_num(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size, uint16_t color); /* 显示数字 */
void lcd_show_xnum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size, uint8_t mode, uint16_t color); /* 扩展显示数字 */
void lcd_show_string(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, char *p, uint16_t color); /* 显示字符串 */
main.c
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 144;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
void delay_ms(uint32_t ms)
{
uint32_t ms_uwRick=uwTick;
while(uwTick-uwTick<ms)
{
}
}
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
lcd.c
/**
****************************************************************************************************
* @file lcd.c
* @author 正点原子团队(ALIENTEK)
* @version V1.1
* @date 2023-05-29
* @brief 2.8寸/3.5寸/4.3寸/7寸 TFTLCD(MCU屏) 驱动代码
* 支持驱动IC型号包括:ILI9341/NT35310/NT35510/SSD1963/ST7789/ST7796/ILI9806等
*
* @license Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
****************************************************************************************************
* @attention
*
* 实验平台:正点原子 探索者 F407开发板
* 在线视频:www.yuanzige.com
* 技术论坛:www.openedv.com
* 公司网址:www.alientek.com
* 购买地址:openedv.taobao.com
*
* 修改说明
* V1.0 20211016
* 第一次发布
* V1.1 20230529
* 1,新增对ST7796和ILI9806 IC支持
* 2,简化部分代码,避免长判定
****************************************************************************************************
*/
#include "LCD/lcd.h"
#include "LCD/lcdfont.h"
#include "LCD/lcd_ex.c"
SRAM_HandleTypeDef g_sram_handle; /* SRAM句柄(用于控制LCD) */
/* LCD的画笔颜色和背景色 */
uint32_t g_point_color = 0xF800; /* 画笔颜色 */
uint32_t g_back_color = 0xFFFF; /* 背景色 */
/* 管理LCD重要参数 */
_lcd_dev lcddev;
/**
* @brief LCD写数据
* @param data: 要写入的数据
* @retval 无
*/
void lcd_wr_data(volatile uint16_t data)
{
data = data; /* 使用-O2优化的时候,必须插入的延时 */
LCD->LCD_RAM = data;
}
/**
* @brief LCD写寄存器编号/地址函数
* @param regno: 寄存器编号/地址
* @retval 无
*/
void lcd_wr_regno(volatile uint16_t regno)
{
regno = regno; /* 使用-O2优化的时候,必须插入的延时 */
LCD->LCD_REG = regno; /* 写入要写的寄存器序号 */
}
/**
* @brief LCD写寄存器
* @param regno:寄存器编号/地址
* @param data:要写入的数据
* @retval 无
*/
void lcd_write_reg(uint16_t regno, uint16_t data)
{
LCD->LCD_REG = regno; /* 写入要写的寄存器序号 */
LCD->LCD_RAM = data; /* 写入数据 */
}
/**
* @brief LCD延时函数,仅用于部分在mdk -O1时间优化时需要设置的地方
* @param t:延时的数值
* @retval 无
*/
static void lcd_opt_delay(uint32_t i)
{
while (i--); /* 使用AC6时空循环可能被优化,可使用while(1) __asm volatile(""); */
}
/**
* @brief LCD读数据
* @param 无
* @retval 读取到的数据
*/
static uint16_t lcd_rd_data(void)
{
volatile uint16_t ram; /* 防止被优化 */
lcd_opt_delay(2);
ram = LCD->LCD_RAM;
return ram;
}
/**
* @brief 准备写GRAM
* @param 无
* @retval 无
*/
void lcd_write_ram_prepare(void)
{
LCD->LCD_REG = lcddev.wramcmd;
}
/**
* @brief 读取个某点的颜色值
* @param x,y:坐标
* @retval 此点的颜色(32位颜色,方便兼容LTDC)
*/
uint32_t lcd_read_point(uint16_t x, uint16_t y)
{
uint16_t r = 0, g = 0, b = 0;
if (x >= lcddev.width || y >= lcddev.height)
{
return 0; /* 超过了范围,直接返回 */
}
lcd_set_cursor(x, y); /* 设置坐标 */
if (lcddev.id == 0x5510)
{
lcd_wr_regno(0x2E00); /* 5510 发送读GRAM指令 */
}
else
{
lcd_wr_regno(0x2E); /* 9341/5310/1963/7789/7796/9806 等发送读GRAM指令 */
}
r = lcd_rd_data(); /* 假读(dummy read) */
if (lcddev.id == 0x1963)
{
return r; /* 1963直接读就可以 */
}
r = lcd_rd_data(); /* 实际坐标颜色 */
if (lcddev.id == 0x7796) /* 7796 一次读取一个像素值 */
{
return r;
}
/* 9341/5310/5510/7789/9806要分2次读出 */
b = lcd_rd_data();
g = r & 0xFF; /* 对于9341/5310/5510/7789/9806,第一次读取的是RG的值,R在前,G在后,各占8位 */
g <<= 8;
return (((r >> 11) << 11) | ((g >> 10) << 5) | (b >> 11)); /* ILI9341/NT35310/NT35510/ST7789/ILI9806需要公式转换一下 */
}
/**
* @brief LCD开启显示
* @param 无
* @retval 无
*/
void lcd_display_on(void)
{
if (lcddev.id == 0x5510)
{
lcd_wr_regno(0x2900); /* 开启显示 */
}
else /* 9341/5310/1963/7789/7796/9806 等发送开启显示指令 */
{
lcd_wr_regno(0x29); /* 开启显示 */
}
}
/**
* @brief LCD关闭显示
* @param 无
* @retval 无
*/
void lcd_display_off(void)
{
if (lcddev.id == 0x5510)
{
lcd_wr_regno(0x2800); /* 关闭显示 */
}
else /* 9341/5310/1963/7789/7796/9806 等发送关闭显示指令 */
{
lcd_wr_regno(0x28); /* 关闭显示 */
}
}
/**
* @brief 设置光标位置(对RGB屏无效)
* @param x,y: 坐标
* @retval 无
*/
void lcd_set_cursor(uint16_t x, uint16_t y)
{
if (lcddev.id == 0x1963)
{
if (lcddev.dir == 0) /* 竖屏模式, x坐标需要变换 */
{
x = lcddev.width - 1 - x;
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(0);
lcd_wr_data(0);
lcd_wr_data(x >> 8);
lcd_wr_data(x & 0xFF);
}
else /* 横屏模式 */
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(x >> 8);
lcd_wr_data(x & 0xFF);
lcd_wr_data((lcddev.width - 1) >> 8);
lcd_wr_data((lcddev.width - 1) & 0xFF);
}
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(y >> 8);
lcd_wr_data(y & 0xFF);
lcd_wr_data((lcddev.height - 1) >> 8);
lcd_wr_data((lcddev.height - 1) & 0xFF);
}
else if (lcddev.id == 0x5510)
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(x >> 8);
lcd_wr_regno(lcddev.setxcmd + 1);
lcd_wr_data(x & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(y >> 8);
lcd_wr_regno(lcddev.setycmd + 1);
lcd_wr_data(y & 0xFF);
}
else /* 9341/5310/7789/7796/9806 等 设置坐标 */
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(x >> 8);
lcd_wr_data(x & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(y >> 8);
lcd_wr_data(y & 0xFF);
}
}
/**
* @brief 设置LCD的自动扫描方向(对RGB屏无效)
* @note
* 9341/5310/5510/1963/7789/7796/9806等IC已经实际测试
* 注意:其他函数可能会受到此函数设置的影响(尤其是9341),
* 所以,一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常.
*
* @param dir:0~7,代表8个方向(具体定义见lcd.h)
* @retval 无
*/
void lcd_scan_dir(uint8_t dir)
{
uint16_t regval = 0;
uint16_t dirreg = 0;
uint16_t temp;
/* 横屏时,对1963不改变扫描方向!竖屏时1963改变方向(这里仅用于1963的特殊处理,对其他驱动IC无效) */
if ((lcddev.dir == 1 && lcddev.id != 0x1963) || (lcddev.dir == 0 && lcddev.id == 0x1963))
{
switch (dir) /* 方向转换 */
{
case 0:
dir = 6;
break;
case 1:
dir = 7;
break;
case 2:
dir = 4;
break;
case 3:
dir = 5;
break;
case 4:
dir = 1;
break;
case 5:
dir = 0;
break;
case 6:
dir = 3;
break;
case 7:
dir = 2;
break;
}
}
/* 根据扫描方式 设置 0x36/0x3600 寄存器 bit 5,6,7 位的值 */
switch (dir)
{
case L2R_U2D: /* 从左到右,从上到下 */
regval |= (0 << 7) | (0 << 6) | (0 << 5);
break;
case L2R_D2U: /* 从左到右,从下到上 */
regval |= (1 << 7) | (0 << 6) | (0 << 5);
break;
case R2L_U2D: /* 从右到左,从上到下 */
regval |= (0 << 7) | (1 << 6) | (0 << 5);
break;
case R2L_D2U: /* 从右到左,从下到上 */
regval |= (1 << 7) | (1 << 6) | (0 << 5);
break;
case U2D_L2R: /* 从上到下,从左到右 */
regval |= (0 << 7) | (0 << 6) | (1 << 5);
break;
case U2D_R2L: /* 从上到下,从右到左 */
regval |= (0 << 7) | (1 << 6) | (1 << 5);
break;
case D2U_L2R: /* 从下到上,从左到右 */
regval |= (1 << 7) | (0 << 6) | (1 << 5);
break;
case D2U_R2L: /* 从下到上,从右到左 */
regval |= (1 << 7) | (1 << 6) | (1 << 5);
break;
}
dirreg = 0x36; /* 对绝大部分驱动IC, 由0x36寄存器控制 */
if (lcddev.id == 0x5510)
{
dirreg = 0x3600; /* 对于5510, 和其他驱动ic的寄存器有差异 */
}
/* 9341 & 7789 & 7796 要设置BGR位 */
if (lcddev.id == 0x9341 || lcddev.id == 0x7789 || lcddev.id == 0x7796)
{
regval |= 0x08;
}
lcd_write_reg(dirreg, regval);
if (lcddev.id != 0x1963) /* 1963不做坐标处理 */
{
if (regval & 0x20)
{
if (lcddev.width < lcddev.height) /* 交换X,Y */
{
temp = lcddev.width;
lcddev.width = lcddev.height;
lcddev.height = temp;
}
}
else
{
if (lcddev.width > lcddev.height) /* 交换X,Y */
{
temp = lcddev.width;
lcddev.width = lcddev.height;
lcddev.height = temp;
}
}
}
/* 设置显示区域(开窗)大小 */
if (lcddev.id == 0x5510)
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(0);
lcd_wr_regno(lcddev.setxcmd + 1);
lcd_wr_data(0);
lcd_wr_regno(lcddev.setxcmd + 2);
lcd_wr_data((lcddev.width - 1) >> 8);
lcd_wr_regno(lcddev.setxcmd + 3);
lcd_wr_data((lcddev.width - 1) & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(0);
lcd_wr_regno(lcddev.setycmd + 1);
lcd_wr_data(0);
lcd_wr_regno(lcddev.setycmd + 2);
lcd_wr_data((lcddev.height - 1) >> 8);
lcd_wr_regno(lcddev.setycmd + 3);
lcd_wr_data((lcddev.height - 1) & 0xFF);
}
else
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(0);
lcd_wr_data(0);
lcd_wr_data((lcddev.width - 1) >> 8);
lcd_wr_data((lcddev.width - 1) & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(0);
lcd_wr_data(0);
lcd_wr_data((lcddev.height - 1) >> 8);
lcd_wr_data((lcddev.height - 1) & 0xFF);
}
}
/**
* @brief 画点
* @param x,y: 坐标
* @param color: 点的颜色(32位颜色,方便兼容LTDC)
* @retval 无
*/
void lcd_draw_point(uint16_t x, uint16_t y, uint32_t color)
{
lcd_set_cursor(x, y); /* 设置光标位置 */
lcd_write_ram_prepare(); /* 开始写入GRAM */
LCD->LCD_RAM = color;
}
/**
* @brief SSD1963背光亮度设置函数
* @param pwm: 背光等级,0~100.越大越亮.
* @retval 无
*/
void lcd_ssd_backlight_set(uint8_t pwm)
{
lcd_wr_regno(0xBE); /* 配置PWM输出 */
lcd_wr_data(0x05); /* 1设置PWM频率 */
lcd_wr_data(pwm * 2.55); /* 2设置PWM占空比 */
lcd_wr_data(0x01); /* 3设置C */
lcd_wr_data(0xFF); /* 4设置D */
lcd_wr_data(0x00); /* 5设置E */
lcd_wr_data(0x00); /* 6设置F */
}
/**
* @brief 设置LCD显示方向
* @param dir:0,竖屏; 1,横屏
* @retval 无
*/
void lcd_display_dir(uint8_t dir)
{
lcddev.dir = dir; /* 竖屏/横屏 */
if (dir == 0) /* 竖屏 */
{
lcddev.width = 240;
lcddev.height = 320;
if (lcddev.id == 0x5510)
{
lcddev.wramcmd = 0x2C00;
lcddev.setxcmd = 0x2A00;
lcddev.setycmd = 0x2B00;
lcddev.width = 480;
lcddev.height = 800;
}
else if (lcddev.id == 0x1963)
{
lcddev.wramcmd = 0x2C; /* 设置写入GRAM的指令 */
lcddev.setxcmd = 0x2B; /* 设置写X坐标指令 */
lcddev.setycmd = 0x2A; /* 设置写Y坐标指令 */
lcddev.width = 480; /* 设置宽度480 */
lcddev.height = 800; /* 设置高度800 */
}
else /* 其他IC, 包括: 9341/5310/7789/7796/9806等IC */
{
lcddev.wramcmd = 0x2C;
lcddev.setxcmd = 0x2A;
lcddev.setycmd = 0x2B;
}
if (lcddev.id == 0x5310 || lcddev.id == 0x7796) /* 如果是5310/7796 则表示是 320*480分辨率 */
{
lcddev.width = 320;
lcddev.height = 480;
}
if (lcddev.id == 0X9806) /* 如果是9806 则表示是 480*800 分辨率 */
{
lcddev.width = 480;
lcddev.height = 800;
}
}
else /* 横屏 */
{
lcddev.width = 320; /* 默认宽度 */
lcddev.height = 240; /* 默认高度 */
if (lcddev.id == 0x5510)
{
lcddev.wramcmd = 0x2C00;
lcddev.setxcmd = 0x2A00;
lcddev.setycmd = 0x2B00;
lcddev.width = 800;
lcddev.height = 480;
}
else if (lcddev.id == 0x1963 || lcddev.id == 0x9806)
{
lcddev.wramcmd = 0x2C; /* 设置写入GRAM的指令 */
lcddev.setxcmd = 0x2A; /* 设置写X坐标指令 */
lcddev.setycmd = 0x2B; /* 设置写Y坐标指令 */
lcddev.width = 800; /* 设置宽度800 */
lcddev.height = 480; /* 设置高度480 */
}
else /* 其他IC, 包括:9341/5310/7789/7796等IC */
{
lcddev.wramcmd = 0x2C;
lcddev.setxcmd = 0x2A;
lcddev.setycmd = 0x2B;
}
if (lcddev.id == 0x5310 || lcddev.id == 0x7796) /* 如果是5310/7796 则表示是 320*480分辨率 */
{
lcddev.width = 480;
lcddev.height = 320;
}
}
lcd_scan_dir(DFT_SCAN_DIR); /* 默认扫描方向 */
}
/**
* @brief 设置窗口(对RGB屏无效), 并自动设置画点坐标到窗口左上角(sx,sy).
* @param sx,sy:窗口起始坐标(左上角)
* @param width,height:窗口宽度和高度,必须大于0!!
* @note 窗体大小:width*height.
*
* @retval 无
*/
void lcd_set_window(uint16_t sx, uint16_t sy, uint16_t width, uint16_t height)
{
uint16_t twidth, theight;
twidth = sx + width - 1;
theight = sy + height - 1;
if (lcddev.id == 0x1963 && lcddev.dir != 1) /* 1963竖屏特殊处理 */
{
sx = lcddev.width - width - sx;
height = sy + height - 1;
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(sx >> 8);
lcd_wr_data(sx & 0xFF);
lcd_wr_data((sx + width - 1) >> 8);
lcd_wr_data((sx + width - 1) & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(sy >> 8);
lcd_wr_data(sy & 0xFF);
lcd_wr_data(height >> 8);
lcd_wr_data(height & 0xFF);
}
else if (lcddev.id == 0x5510)
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(sx >> 8);
lcd_wr_regno(lcddev.setxcmd + 1);
lcd_wr_data(sx & 0xFF);
lcd_wr_regno(lcddev.setxcmd + 2);
lcd_wr_data(twidth >> 8);
lcd_wr_regno(lcddev.setxcmd + 3);
lcd_wr_data(twidth & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(sy >> 8);
lcd_wr_regno(lcddev.setycmd + 1);
lcd_wr_data(sy & 0xFF);
lcd_wr_regno(lcddev.setycmd + 2);
lcd_wr_data(theight >> 8);
lcd_wr_regno(lcddev.setycmd + 3);
lcd_wr_data(theight & 0xFF);
}
else /* 9341/5310/7789/1963/7796/9806横屏 等 设置窗口 */
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(sx >> 8);
lcd_wr_data(sx & 0xFF);
lcd_wr_data(twidth >> 8);
lcd_wr_data(twidth & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(sy >> 8);
lcd_wr_data(sy & 0xFF);
lcd_wr_data(theight >> 8);
lcd_wr_data(theight & 0xFF);
}
}
/**
* @brief SRAM底层驱动,时钟使能,引脚分配
* @note 此函数会被HAL_SRAM_Init()调用,初始化读写总线引脚
* @param hsram:SRAM句柄
* @retval 无
*/
void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram)
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_FSMC_CLK_ENABLE(); /* 使能FSMC时钟 */
__HAL_RCC_GPIOD_CLK_ENABLE(); /* 使能GPIOD时钟 */
__HAL_RCC_GPIOE_CLK_ENABLE(); /* 使能GPIOE时钟 */
/* 初始化PD0,1, 8,9,10,14,15 */
gpio_init_struct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 \
| GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15;
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 推挽复用 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
gpio_init_struct.Alternate = GPIO_AF12_FSMC; /* 复用为FSMC */
HAL_GPIO_Init(GPIOD, &gpio_init_struct); /* 初始化 */
/* 初始化PE7,8,9,10,11,12,13,14,15 */
gpio_init_struct.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 \
| GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
HAL_GPIO_Init(GPIOE, &gpio_init_struct);
}
/**
* @brief 初始化LCD
* @note 该初始化函数可以初始化各种型号的LCD(详见本.c文件最前面的描述)
*
* @param 无
* @retval 无
*/
void lcd_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
FSMC_NORSRAM_TimingTypeDef fsmc_read_handle;
FSMC_NORSRAM_TimingTypeDef fsmc_write_handle;
LCD_CS_GPIO_CLK_ENABLE(); /* LCD_CS脚时钟使能 */
LCD_WR_GPIO_CLK_ENABLE(); /* LCD_WR脚时钟使能 */
LCD_RD_GPIO_CLK_ENABLE(); /* LCD_RD脚时钟使能 */
LCD_RS_GPIO_CLK_ENABLE(); /* LCD_RS脚时钟使能 */
LCD_BL_GPIO_CLK_ENABLE(); /* LCD_BL脚时钟使能 */
gpio_init_struct.Pin = LCD_CS_GPIO_PIN;
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 推挽复用 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
gpio_init_struct.Alternate = GPIO_AF12_FSMC; /* 复用为FSMC */
HAL_GPIO_Init(LCD_CS_GPIO_PORT, &gpio_init_struct); /* 初始化LCD_CS引脚 */
gpio_init_struct.Pin = LCD_WR_GPIO_PIN;
HAL_GPIO_Init(LCD_WR_GPIO_PORT, &gpio_init_struct); /* 初始化LCD_WR引脚 */
gpio_init_struct.Pin = LCD_RD_GPIO_PIN;
HAL_GPIO_Init(LCD_RD_GPIO_PORT, &gpio_init_struct); /* 初始化LCD_RD引脚 */
gpio_init_struct.Pin = LCD_RS_GPIO_PIN;
HAL_GPIO_Init(LCD_RS_GPIO_PORT, &gpio_init_struct); /* 初始化LCD_RS引脚 */
gpio_init_struct.Pin = LCD_BL_GPIO_PIN;
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */
HAL_GPIO_Init(LCD_BL_GPIO_PORT, &gpio_init_struct); /* LCD_BL引脚模式设置(推挽输出) */
g_sram_handle.Instance = FSMC_NORSRAM_DEVICE;
g_sram_handle.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
g_sram_handle.Init.NSBank = FSMC_NORSRAM_BANK4; /* 使用NE4 */
g_sram_handle.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; /* 地址/数据线不复用 */
g_sram_handle.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16; /* 16位数据宽度 */
g_sram_handle.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE; /* 是否使能突发访问,仅对同步突发存储器有效,此处未用到 */
g_sram_handle.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW; /* 等待信号的极性,仅在突发模式访问下有用 */
g_sram_handle.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS; /* 存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT */
g_sram_handle.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE; /* 存储器写使能 */
g_sram_handle.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE; /* 等待使能位,此处未用到 */
g_sram_handle.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE; /* 读写使用不同的时序 */
g_sram_handle.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE; /* 是否使能同步传输模式下的等待信号,此处未用到 */
g_sram_handle.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE; /* 禁止突发写 */
/* FSMC读时序控制寄存器 */
fsmc_read_handle.AddressSetupTime = 0x0F; /* 地址建立时间(ADDSET)为15个fsmc_ker_ck(1/168=6)即6*15=90ns */
fsmc_read_handle.AddressHoldTime = 0x00; /* 地址保持时间(ADDHLD) 模式A是没有用到 */
fsmc_read_handle.DataSetupTime = 60; /* 数据保存时间(DATAST)为60个fsmc_ker_ck=6*60=360ns */
/* 因为液晶驱动IC的读数据的时候,速度不能太快,尤其是个别奇葩芯片 */
fsmc_read_handle.AccessMode = FSMC_ACCESS_MODE_A; /* 模式A */
/* FSMC写时序控制寄存器 */
fsmc_write_handle.AddressSetupTime = 9; /* 地址建立时间(ADDSET)为9个fsmc_ker_ck=6*9=54ns */
fsmc_write_handle.AddressHoldTime = 0x00; /* 地址保持时间(ADDHLD) 模式A是没有用到 */
fsmc_write_handle.DataSetupTime = 9; /* 数据保存时间(DATAST)为9个fsmc_ker_ck=6*9=54ns */
/* 注意:某些液晶驱动IC的写信号脉宽,最少也得50ns */
fsmc_write_handle.AccessMode = FSMC_ACCESS_MODE_A; /* 模式A */
HAL_SRAM_Init(&g_sram_handle, &fsmc_read_handle, &fsmc_write_handle);
delay_ms(50);
/* 尝试9341 ID的读取 */
lcd_wr_regno(0xD3);
lcddev.id = lcd_rd_data(); /* dummy read */
lcddev.id = lcd_rd_data(); /* 读到0x00 */
lcddev.id = lcd_rd_data(); /* 读取93 */
lcddev.id <<= 8;
lcddev.id |= lcd_rd_data(); /* 读取41 */
if (lcddev.id != 0x9341) /* 不是 9341 , 尝试看看是不是 ST7789 */
{
lcd_wr_regno(0x04);
lcddev.id = lcd_rd_data(); /* dummy read */
lcddev.id = lcd_rd_data(); /* 读到0x85 */
lcddev.id = lcd_rd_data(); /* 读取0x85 */
lcddev.id <<= 8;
lcddev.id |= lcd_rd_data(); /* 读取0x52 */
if (lcddev.id == 0x8552) /* 将8552的ID转换成7789 */
{
lcddev.id = 0x7789;
}
if (lcddev.id != 0x7789) /* 也不是ST7789, 尝试是不是 NT35310 */
{
lcd_wr_regno(0xD4);
lcddev.id = lcd_rd_data(); /* dummy read */
lcddev.id = lcd_rd_data(); /* 读回0x01 */
lcddev.id = lcd_rd_data(); /* 读回0x53 */
lcddev.id <<= 8;
lcddev.id |= lcd_rd_data(); /* 这里读回0x10 */
if (lcddev.id != 0x5310) /* 也不是NT35310,尝试看看是不是ST7796 */
{
lcd_wr_regno(0XD3);
lcddev.id = lcd_rd_data(); /* dummy read */
lcddev.id = lcd_rd_data(); /* 读到0X00 */
lcddev.id = lcd_rd_data(); /* 读取0X77 */
lcddev.id <<= 8;
lcddev.id |= lcd_rd_data(); /* 读取0X96 */
if (lcddev.id != 0x7796) /* 也不是ST7796,尝试看看是不是NT35510 */
{
/* 发送密钥(厂家提供) */
lcd_write_reg(0xF000, 0x0055);
lcd_write_reg(0xF001, 0x00AA);
lcd_write_reg(0xF002, 0x0052);
lcd_write_reg(0xF003, 0x0008);
lcd_write_reg(0xF004, 0x0001);
lcd_wr_regno(0xC500); /* 读取ID低八位 */
lcddev.id = lcd_rd_data(); /* 读回0x80 */
lcddev.id <<= 8;
lcd_wr_regno(0xC501); /* 读取ID高八位 */
lcddev.id |= lcd_rd_data(); /* 读回0x00 */
delay_ms(5); /* 等待5ms, 因为0XC501指令对1963来说就是软件复位指令, 等待5ms让1963复位完成再操作 */
if (lcddev.id != 0x5510) /* 也不是NT5510,尝试看看是不是ILI9806 */
{
lcd_wr_regno(0XD3);
lcddev.id = lcd_rd_data(); /* dummy read */
lcddev.id = lcd_rd_data(); /* 读回0X00 */
lcddev.id = lcd_rd_data(); /* 读回0X98 */
lcddev.id <<= 8;
lcddev.id |= lcd_rd_data(); /* 读回0X06 */
if (lcddev.id != 0x9806) /* 也不是ILI9806,尝试看看是不是SSD1963 */
{
lcd_wr_regno(0xA1);
lcddev.id = lcd_rd_data();
lcddev.id = lcd_rd_data(); /* 读回0x57 */
lcddev.id <<= 8;
lcddev.id |= lcd_rd_data(); /* 读回0x61 */
if (lcddev.id == 0x5761) lcddev.id = 0x1963; /* SSD1963读回的ID是5761H,为方便区分,我们强制设置为1963 */
}
}
}
}
}
}
/* 特别注意, 如果在main函数里面屏蔽串口1初始化, 则会卡死在printf
* 里面(卡死在f_putc函数), 所以, 必须初始化串口1, 或者屏蔽掉下面
* 这行 printf 语句 !!!!!!!
*/
if (lcddev.id == 0x7789)
{
lcd_ex_st7789_reginit(); /* 执行ST7789初始化 */
}
else if (lcddev.id == 0x9341)
{
lcd_ex_ili9341_reginit(); /* 执行ILI9341初始化 */
}
else if (lcddev.id == 0x5310)
{
lcd_ex_nt35310_reginit(); /* 执行NT35310初始化 */
}
else if (lcddev.id == 0x7796)
{
lcd_ex_st7796_reginit(); /* 执行ST7796初始化 */
}
else if (lcddev.id == 0x5510)
{
lcd_ex_nt35510_reginit(); /* 执行NT35510初始化 */
}
else if (lcddev.id == 0x9806)
{
lcd_ex_ili9806_reginit(); /* 执行ILI9806初始化 */
}
else if (lcddev.id == 0x1963)
{
lcd_ex_ssd1963_reginit(); /* 执行SSD1963初始化 */
lcd_ssd_backlight_set(100); /* 背光设置为最亮 */
}
/* 由于不同屏幕的写时序不同,这里的时序可以根据自己的屏幕进行修改
(若插上长排线对时序也会有影响,需要自己根据情况修改) */
/* 初始化完成以后,提速 */
if (lcddev.id == 0x7789)
{
/* 重新配置写时序控制寄存器的时序 */
fsmc_write_handle.AddressSetupTime = 3; /* 地址建立时间(ADDSET)为3个fsmc_ker_ck=6*3=18ns */
fsmc_write_handle.DataSetupTime = 3; /* 数据保持时间(DATAST)为3个fsmc_ker_ck=6*3=18ns */
FSMC_NORSRAM_Extended_Timing_Init(g_sram_handle.Extended, &fsmc_write_handle, g_sram_handle.Init.NSBank, g_sram_handle.Init.ExtendedMode);
}
else if (lcddev.id == 0x9806 || lcddev.id == 0x9341 || lcddev.id == 0x5510)
{
/* 重新配置写时序控制寄存器的时序 */
fsmc_write_handle.AddressSetupTime = 2; /* 地址建立时间(ADDSET)为2个fsmc_ker_ck=6*2=12ns */
fsmc_write_handle.DataSetupTime = 2; /* 数据保持时间(DATAST)为2个fsmc_ker_ck=6*2=12ns */
FSMC_NORSRAM_Extended_Timing_Init(g_sram_handle.Extended, &fsmc_write_handle, g_sram_handle.Init.NSBank, g_sram_handle.Init.ExtendedMode);
}
else if (lcddev.id == 0x5310 || lcddev.id == 0x7796 || lcddev.id == 0x1963)
{
/* 重新配置写时序控制寄存器的时序 */
fsmc_write_handle.AddressSetupTime = 1; /* 地址建立时间(ADDSET)为1个fsmc_ker_ck=6*1=6ns */
fsmc_write_handle.DataSetupTime = 1; /* 数据保持时间(DATAST)为1个fsmc_ker_ck=6*1=6ns */
FSMC_NORSRAM_Extended_Timing_Init(g_sram_handle.Extended, &fsmc_write_handle, g_sram_handle.Init.NSBank, g_sram_handle.Init.ExtendedMode);
}
lcd_display_dir(0); /* 默认为竖屏 */
LCD_BL(1); /* 点亮背光 */
lcd_clear(WHITE);
}
/**
* @brief 清屏函数
* @param color: 要清屏的颜色
* @retval 无
*/
void lcd_clear(uint16_t color)
{
uint32_t index = 0;
uint32_t totalpoint = lcddev.width;
totalpoint *= lcddev.height; /* 得到总点数 */
lcd_set_cursor(0x00, 0x0000); /* 设置光标位置 */
lcd_write_ram_prepare(); /* 开始写入GRAM */
for (index = 0; index < totalpoint; index++)
{
LCD->LCD_RAM = color;
}
}
/**
* @brief 在指定区域内填充单个颜色
* @param (sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex - sx + 1) * (ey - sy + 1)
* @param color: 要填充的颜色(32位颜色,方便兼容LTDC)
* @retval 无
*/
void lcd_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint32_t color)
{
uint16_t i, j;
uint16_t xlen = 0;
xlen = ex - sx + 1;
for (i = sy; i <= ey; i++)
{
lcd_set_cursor(sx, i); /* 设置光标位置 */
lcd_write_ram_prepare(); /* 开始写入GRAM */
for (j = 0; j < xlen; j++)
{
LCD->LCD_RAM = color; /* 显示颜色 */
}
}
}
/**
* @brief 在指定区域内填充指定颜色块
* @param (sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex - sx + 1) * (ey - sy + 1)
* @param color: 要填充的颜色数组首地址
* @retval 无
*/
void lcd_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *color)
{
uint16_t height, width;
uint16_t i, j;
width = ex - sx + 1; /* 得到填充的宽度 */
height = ey - sy + 1; /* 高度 */
for (i = 0; i < height; i++)
{
lcd_set_cursor(sx, sy + i); /* 设置光标位置 */
lcd_write_ram_prepare(); /* 开始写入GRAM */
for (j = 0; j < width; j++)
{
LCD->LCD_RAM = color[i * width + j]; /* 写入数据 */
}
}
}
/**
* @brief 画线
* @param x1,y1: 起点坐标
* @param x2,y2: 终点坐标
* @param color: 线的颜色
* @retval 无
*/
void lcd_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color)
{
uint16_t t;
int xerr = 0, yerr = 0, delta_x, delta_y, distance;
int incx, incy, row, col;
delta_x = x2 - x1; /* 计算坐标增量 */
delta_y = y2 - y1;
row = x1;
col = 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;
}
for (t = 0; t <= distance + 1; t++) /* 画线输出 */
{
lcd_draw_point(row, col, color); /* 画点 */
xerr += delta_x;
yerr += delta_y;
if (xerr > distance)
{
xerr -= distance;
row += incx;
}
if (yerr > distance)
{
yerr -= distance;
col += incy;
}
}
}
/**
* @brief 画水平线
* @param x,y : 起点坐标
* @param len : 线长度
* @param color : 矩形的颜色
* @retval 无
*/
void lcd_draw_hline(uint16_t x, uint16_t y, uint16_t len, uint16_t color)
{
if ((len == 0) || (x > lcddev.width) || (y > lcddev.height))
{
return;
}
lcd_fill(x, y, x + len - 1, y, color);
}
/**
* @brief 画矩形
* @param x1,y1: 起点坐标
* @param x2,y2: 终点坐标
* @param color: 矩形的颜色
* @retval 无
*/
void lcd_draw_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color)
{
lcd_draw_line(x1, y1, x2, y1, color);
lcd_draw_line(x1, y1, x1, y2, color);
lcd_draw_line(x1, y2, x2, y2, color);
lcd_draw_line(x2, y1, x2, y2, color);
}
/**
* @brief 画圆
* @param x0,y0 : 圆中心坐标
* @param r : 半径
* @param color : 圆的颜色
* @retval 无
*/
void lcd_draw_circle(uint16_t x0, uint16_t y0, uint8_t r, uint16_t color)
{
int a, b;
int di;
a = 0;
b = r;
di = 3 - (r << 1); /* 判断下个点位置的标志 */
while (a <= b)
{
lcd_draw_point(x0 + a, y0 - b, color); /* 5 */
lcd_draw_point(x0 + b, y0 - a, color); /* 0 */
lcd_draw_point(x0 + b, y0 + a, color); /* 4 */
lcd_draw_point(x0 + a, y0 + b, color); /* 6 */
lcd_draw_point(x0 - a, y0 + b, color); /* 1 */
lcd_draw_point(x0 - b, y0 + a, color);
lcd_draw_point(x0 - a, y0 - b, color); /* 2 */
lcd_draw_point(x0 - b, y0 - a, color); /* 7 */
a++;
/* 使用Bresenham算法画圆 */
if (di < 0)
{
di += 4 * a + 6;
}
else
{
di += 10 + 4 * (a - b);
b--;
}
}
}
/**
* @brief 填充实心圆
* @param x,y : 圆中心坐标
* @param r : 半径
* @param color: 圆的颜色
* @retval 无
*/
void lcd_fill_circle(uint16_t x, uint16_t y, uint16_t r, uint16_t color)
{
uint32_t i;
uint32_t imax = ((uint32_t)r * 707) / 1000 + 1;
uint32_t sqmax = (uint32_t)r * (uint32_t)r + (uint32_t)r / 2;
uint32_t xr = r;
lcd_draw_hline(x - r, y, 2 * r, color);
for (i = 1; i <= imax; i++)
{
if ((i * i + xr * xr) > sqmax)
{
/* draw lines from outside */
if (xr > imax)
{
lcd_draw_hline (x - i + 1, y + xr, 2 * (i - 1), color);
lcd_draw_hline (x - i + 1, y - xr, 2 * (i - 1), color);
}
xr--;
}
/* draw lines from inside (center) */
lcd_draw_hline(x - xr, y + i, 2 * xr, color);
lcd_draw_hline(x - xr, y - i, 2 * xr, color);
}
}
/**
* @brief 在指定位置显示一个字符
* @param x,y : 坐标
* @param chr : 要显示的字符:" "--->"~"
* @param size : 字体大小 12/16/24/32
* @param mode : 叠加方式(1); 非叠加方式(0);
* @param color : 字符的颜色;
* @retval 无
*/
void lcd_show_char(uint16_t x, uint16_t y, char chr, uint8_t size, uint8_t mode, uint16_t color)
{
uint8_t temp, t1, t;
uint16_t y0 = y;
uint8_t csize = 0;
uint8_t *pfont = 0;
csize = (size / 8 + ((size % 8) ? 1 : 0)) * (size / 2); /* 得到字体一个字符对应点阵集所占的字节数 */
chr = chr - ' '; /* 得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库) */
switch (size)
{
case 12:
pfont = (uint8_t *)asc2_1206[chr]; /* 调用1206字体 */
break;
case 16:
pfont = (uint8_t *)asc2_1608[chr]; /* 调用1608字体 */
break;
case 24:
pfont = (uint8_t *)asc2_2412[chr]; /* 调用2412字体 */
break;
case 32:
pfont = (uint8_t *)asc2_3216[chr]; /* 调用3216字体 */
break;
default:
return ;
}
for (t = 0; t < csize; t++)
{
temp = pfont[t]; /* 获取字符的点阵数据 */
for (t1 = 0; t1 < 8; t1++) /* 一个字节8个点 */
{
if (temp & 0x80) /* 有效点,需要显示 */
{
lcd_draw_point(x, y, color); /* 画点出来,要显示这个点 */
}
else if (mode == 0) /* 无效点,不显示 */
{
lcd_draw_point(x, y, g_back_color); /* 画背景色,相当于这个点不显示(注意背景色由全局变量控制) */
}
temp <<= 1; /* 移位, 以便获取下一个位的状态 */
y++;
if (y >= lcddev.height)return; /* 超区域了 */
if ((y - y0) == size) /* 显示完一列了? */
{
y = y0; /* y坐标复位 */
x++; /* x坐标递增 */
if (x >= lcddev.width)
{
return; /* x坐标超区域了 */
}
break;
}
}
}
}
/**
* @brief 平方函数, m^n
* @param m: 底数
* @param n: 指数
* @retval m的n次方
*/
static uint32_t lcd_pow(uint8_t m, uint8_t n)
{
uint32_t result = 1;
while (n--)
{
result *= m;
}
return result;
}
/**
* @brief 显示len个数字
* @param x,y : 起始坐标
* @param num : 数值(0 ~ 2^32)
* @param len : 显示数字的位数
* @param size: 选择字体 12/16/24/32
* @param color : 数字的颜色;
* @retval 无
*/
void lcd_show_num(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size, uint16_t color)
{
uint8_t t, temp;
uint8_t enshow = 0;
for (t = 0; t < len; t++) /* 按总显示位数循环 */
{
temp = (num / lcd_pow(10, len - t - 1)) % 10; /* 获取对应位的数字 */
if (enshow == 0 && t < (len - 1)) /* 没有使能显示,且还有位要显示 */
{
if (temp == 0)
{
lcd_show_char(x + (size / 2) * t, y, ' ', size, 0, color); /* 显示空格,占位 */
continue; /* 继续下个一位 */
}
else
{
enshow = 1; /* 使能显示 */
}
}
lcd_show_char(x + (size / 2) * t, y, temp + '0', size, 0, color); /* 显示字符 */
}
}
/**
* @brief 扩展显示len个数字(高位是0也显示)
* @param x,y : 起始坐标
* @param num : 数值(0 ~ 2^32)
* @param len : 显示数字的位数
* @param size: 选择字体 12/16/24/32
* @param mode: 显示模式
* [7]:0,不填充;1,填充0.
* [6:1]:保留
* [0]:0,非叠加显示;1,叠加显示.
* @param color : 数字的颜色;
* @retval 无
*/
void lcd_show_xnum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size, uint8_t mode, uint16_t color)
{
uint8_t t, temp;
uint8_t enshow = 0;
for (t = 0; t < len; t++) /* 按总显示位数循环 */
{
temp = (num / lcd_pow(10, len - t - 1)) % 10; /* 获取对应位的数字 */
if (enshow == 0 && t < (len - 1)) /* 没有使能显示,且还有位要显示 */
{
if (temp == 0)
{
if (mode & 0x80) /* 高位需要填充0 */
{
lcd_show_char(x + (size / 2) * t, y, '0', size, mode & 0x01, color); /* 用0占位 */
}
else
{
lcd_show_char(x + (size / 2) * t, y, ' ', size, mode & 0x01, color); /* 用空格占位 */
}
continue;
}
else
{
enshow = 1; /* 使能显示 */
}
}
lcd_show_char(x + (size / 2) * t, y, temp + '0', size, mode & 0x01, color);
}
}
/**
* @brief 显示字符串
* @param x,y : 起始坐标
* @param width,height: 区域大小
* @param size : 选择字体 12/16/24/32
* @param p : 字符串首地址
* @param color : 字符串的颜色;
* @retval 无
*/
void lcd_show_string(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, char *p, uint16_t color)
{
uint8_t x0 = x;
width += x;
height += y;
while ((*p <= '~') && (*p >= ' ')) /* 判断是不是非法字符! */
{
if (x >= width)
{
x = x0;
y += size;
}
if (y >= height)
{
break; /* 退出 */
}
lcd_show_char(x, y, *p, size, 0, color);
x += size / 2;
p++;
}
}
lcd.h
/**
****************************************************************************************************
* @file lcd.c
* @author 正点原子团队(ALIENTEK)
* @version V1.1
* @date 2023-05-29
* @brief 2.8寸/3.5寸/4.3寸/7寸 TFTLCD(MCU屏) 驱动代码
* 支持驱动IC型号包括:ILI9341/NT35310/NT35510/SSD1963/ST7789/ST7796/ILI9806等
*
* @license Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
****************************************************************************************************
* @attention
*
* 实验平台:正点原子 探索者 F407开发板
* 在线视频:www.yuanzige.com
* 技术论坛:www.openedv.com
* 公司网址:www.alientek.com
* 购买地址:openedv.taobao.com
*
* 修改说明
* V1.0 20211016
* 第一次发布
* V1.1 20230529
* 1,新增对ST7796和ILI9806 IC支持
* 2,简化部分代码,避免长判定
****************************************************************************************************
*/
#include "LCD/lcd.h"
#include "LCD/lcdfont.h"
#include "LCD/lcd_ex.c"
SRAM_HandleTypeDef g_sram_handle; /* SRAM句柄(用于控制LCD) */
/* LCD的画笔颜色和背景色 */
uint32_t g_point_color = 0xF800; /* 画笔颜色 */
uint32_t g_back_color = 0xFFFF; /* 背景色 */
/* 管理LCD重要参数 */
_lcd_dev lcddev;
/**
* @brief LCD写数据
* @param data: 要写入的数据
* @retval 无
*/
void lcd_wr_data(volatile uint16_t data)
{
data = data; /* 使用-O2优化的时候,必须插入的延时 */
LCD->LCD_RAM = data;
}
/**
* @brief LCD写寄存器编号/地址函数
* @param regno: 寄存器编号/地址
* @retval 无
*/
void lcd_wr_regno(volatile uint16_t regno)
{
regno = regno; /* 使用-O2优化的时候,必须插入的延时 */
LCD->LCD_REG = regno; /* 写入要写的寄存器序号 */
}
/**
* @brief LCD写寄存器
* @param regno:寄存器编号/地址
* @param data:要写入的数据
* @retval 无
*/
void lcd_write_reg(uint16_t regno, uint16_t data)
{
LCD->LCD_REG = regno; /* 写入要写的寄存器序号 */
LCD->LCD_RAM = data; /* 写入数据 */
}
/**
* @brief LCD延时函数,仅用于部分在mdk -O1时间优化时需要设置的地方
* @param t:延时的数值
* @retval 无
*/
static void lcd_opt_delay(uint32_t i)
{
while (i--); /* 使用AC6时空循环可能被优化,可使用while(1) __asm volatile(""); */
}
/**
* @brief LCD读数据
* @param 无
* @retval 读取到的数据
*/
static uint16_t lcd_rd_data(void)
{
volatile uint16_t ram; /* 防止被优化 */
lcd_opt_delay(2);
ram = LCD->LCD_RAM;
return ram;
}
/**
* @brief 准备写GRAM
* @param 无
* @retval 无
*/
void lcd_write_ram_prepare(void)
{
LCD->LCD_REG = lcddev.wramcmd;
}
/**
* @brief 读取个某点的颜色值
* @param x,y:坐标
* @retval 此点的颜色(32位颜色,方便兼容LTDC)
*/
uint32_t lcd_read_point(uint16_t x, uint16_t y)
{
uint16_t r = 0, g = 0, b = 0;
if (x >= lcddev.width || y >= lcddev.height)
{
return 0; /* 超过了范围,直接返回 */
}
lcd_set_cursor(x, y); /* 设置坐标 */
if (lcddev.id == 0x5510)
{
lcd_wr_regno(0x2E00); /* 5510 发送读GRAM指令 */
}
else
{
lcd_wr_regno(0x2E); /* 9341/5310/1963/7789/7796/9806 等发送读GRAM指令 */
}
r = lcd_rd_data(); /* 假读(dummy read) */
if (lcddev.id == 0x1963)
{
return r; /* 1963直接读就可以 */
}
r = lcd_rd_data(); /* 实际坐标颜色 */
if (lcddev.id == 0x7796) /* 7796 一次读取一个像素值 */
{
return r;
}
/* 9341/5310/5510/7789/9806要分2次读出 */
b = lcd_rd_data();
g = r & 0xFF; /* 对于9341/5310/5510/7789/9806,第一次读取的是RG的值,R在前,G在后,各占8位 */
g <<= 8;
return (((r >> 11) << 11) | ((g >> 10) << 5) | (b >> 11)); /* ILI9341/NT35310/NT35510/ST7789/ILI9806需要公式转换一下 */
}
/**
* @brief LCD开启显示
* @param 无
* @retval 无
*/
void lcd_display_on(void)
{
if (lcddev.id == 0x5510)
{
lcd_wr_regno(0x2900); /* 开启显示 */
}
else /* 9341/5310/1963/7789/7796/9806 等发送开启显示指令 */
{
lcd_wr_regno(0x29); /* 开启显示 */
}
}
/**
* @brief LCD关闭显示
* @param 无
* @retval 无
*/
void lcd_display_off(void)
{
if (lcddev.id == 0x5510)
{
lcd_wr_regno(0x2800); /* 关闭显示 */
}
else /* 9341/5310/1963/7789/7796/9806 等发送关闭显示指令 */
{
lcd_wr_regno(0x28); /* 关闭显示 */
}
}
/**
* @brief 设置光标位置(对RGB屏无效)
* @param x,y: 坐标
* @retval 无
*/
void lcd_set_cursor(uint16_t x, uint16_t y)
{
if (lcddev.id == 0x1963)
{
if (lcddev.dir == 0) /* 竖屏模式, x坐标需要变换 */
{
x = lcddev.width - 1 - x;
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(0);
lcd_wr_data(0);
lcd_wr_data(x >> 8);
lcd_wr_data(x & 0xFF);
}
else /* 横屏模式 */
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(x >> 8);
lcd_wr_data(x & 0xFF);
lcd_wr_data((lcddev.width - 1) >> 8);
lcd_wr_data((lcddev.width - 1) & 0xFF);
}
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(y >> 8);
lcd_wr_data(y & 0xFF);
lcd_wr_data((lcddev.height - 1) >> 8);
lcd_wr_data((lcddev.height - 1) & 0xFF);
}
else if (lcddev.id == 0x5510)
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(x >> 8);
lcd_wr_regno(lcddev.setxcmd + 1);
lcd_wr_data(x & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(y >> 8);
lcd_wr_regno(lcddev.setycmd + 1);
lcd_wr_data(y & 0xFF);
}
else /* 9341/5310/7789/7796/9806 等 设置坐标 */
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(x >> 8);
lcd_wr_data(x & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(y >> 8);
lcd_wr_data(y & 0xFF);
}
}
/**
* @brief 设置LCD的自动扫描方向(对RGB屏无效)
* @note
* 9341/5310/5510/1963/7789/7796/9806等IC已经实际测试
* 注意:其他函数可能会受到此函数设置的影响(尤其是9341),
* 所以,一般设置为L2R_U2D即可,如果设置为其他扫描方式,可能导致显示不正常.
*
* @param dir:0~7,代表8个方向(具体定义见lcd.h)
* @retval 无
*/
void lcd_scan_dir(uint8_t dir)
{
uint16_t regval = 0;
uint16_t dirreg = 0;
uint16_t temp;
/* 横屏时,对1963不改变扫描方向!竖屏时1963改变方向(这里仅用于1963的特殊处理,对其他驱动IC无效) */
if ((lcddev.dir == 1 && lcddev.id != 0x1963) || (lcddev.dir == 0 && lcddev.id == 0x1963))
{
switch (dir) /* 方向转换 */
{
case 0:
dir = 6;
break;
case 1:
dir = 7;
break;
case 2:
dir = 4;
break;
case 3:
dir = 5;
break;
case 4:
dir = 1;
break;
case 5:
dir = 0;
break;
case 6:
dir = 3;
break;
case 7:
dir = 2;
break;
}
}
/* 根据扫描方式 设置 0x36/0x3600 寄存器 bit 5,6,7 位的值 */
switch (dir)
{
case L2R_U2D: /* 从左到右,从上到下 */
regval |= (0 << 7) | (0 << 6) | (0 << 5);
break;
case L2R_D2U: /* 从左到右,从下到上 */
regval |= (1 << 7) | (0 << 6) | (0 << 5);
break;
case R2L_U2D: /* 从右到左,从上到下 */
regval |= (0 << 7) | (1 << 6) | (0 << 5);
break;
case R2L_D2U: /* 从右到左,从下到上 */
regval |= (1 << 7) | (1 << 6) | (0 << 5);
break;
case U2D_L2R: /* 从上到下,从左到右 */
regval |= (0 << 7) | (0 << 6) | (1 << 5);
break;
case U2D_R2L: /* 从上到下,从右到左 */
regval |= (0 << 7) | (1 << 6) | (1 << 5);
break;
case D2U_L2R: /* 从下到上,从左到右 */
regval |= (1 << 7) | (0 << 6) | (1 << 5);
break;
case D2U_R2L: /* 从下到上,从右到左 */
regval |= (1 << 7) | (1 << 6) | (1 << 5);
break;
}
dirreg = 0x36; /* 对绝大部分驱动IC, 由0x36寄存器控制 */
if (lcddev.id == 0x5510)
{
dirreg = 0x3600; /* 对于5510, 和其他驱动ic的寄存器有差异 */
}
/* 9341 & 7789 & 7796 要设置BGR位 */
if (lcddev.id == 0x9341 || lcddev.id == 0x7789 || lcddev.id == 0x7796)
{
regval |= 0x08;
}
lcd_write_reg(dirreg, regval);
if (lcddev.id != 0x1963) /* 1963不做坐标处理 */
{
if (regval & 0x20)
{
if (lcddev.width < lcddev.height) /* 交换X,Y */
{
temp = lcddev.width;
lcddev.width = lcddev.height;
lcddev.height = temp;
}
}
else
{
if (lcddev.width > lcddev.height) /* 交换X,Y */
{
temp = lcddev.width;
lcddev.width = lcddev.height;
lcddev.height = temp;
}
}
}
/* 设置显示区域(开窗)大小 */
if (lcddev.id == 0x5510)
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(0);
lcd_wr_regno(lcddev.setxcmd + 1);
lcd_wr_data(0);
lcd_wr_regno(lcddev.setxcmd + 2);
lcd_wr_data((lcddev.width - 1) >> 8);
lcd_wr_regno(lcddev.setxcmd + 3);
lcd_wr_data((lcddev.width - 1) & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(0);
lcd_wr_regno(lcddev.setycmd + 1);
lcd_wr_data(0);
lcd_wr_regno(lcddev.setycmd + 2);
lcd_wr_data((lcddev.height - 1) >> 8);
lcd_wr_regno(lcddev.setycmd + 3);
lcd_wr_data((lcddev.height - 1) & 0xFF);
}
else
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(0);
lcd_wr_data(0);
lcd_wr_data((lcddev.width - 1) >> 8);
lcd_wr_data((lcddev.width - 1) & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(0);
lcd_wr_data(0);
lcd_wr_data((lcddev.height - 1) >> 8);
lcd_wr_data((lcddev.height - 1) & 0xFF);
}
}
/**
* @brief 画点
* @param x,y: 坐标
* @param color: 点的颜色(32位颜色,方便兼容LTDC)
* @retval 无
*/
void lcd_draw_point(uint16_t x, uint16_t y, uint32_t color)
{
lcd_set_cursor(x, y); /* 设置光标位置 */
lcd_write_ram_prepare(); /* 开始写入GRAM */
LCD->LCD_RAM = color;
}
/**
* @brief SSD1963背光亮度设置函数
* @param pwm: 背光等级,0~100.越大越亮.
* @retval 无
*/
void lcd_ssd_backlight_set(uint8_t pwm)
{
lcd_wr_regno(0xBE); /* 配置PWM输出 */
lcd_wr_data(0x05); /* 1设置PWM频率 */
lcd_wr_data(pwm * 2.55); /* 2设置PWM占空比 */
lcd_wr_data(0x01); /* 3设置C */
lcd_wr_data(0xFF); /* 4设置D */
lcd_wr_data(0x00); /* 5设置E */
lcd_wr_data(0x00); /* 6设置F */
}
/**
* @brief 设置LCD显示方向
* @param dir:0,竖屏; 1,横屏
* @retval 无
*/
void lcd_display_dir(uint8_t dir)
{
lcddev.dir = dir; /* 竖屏/横屏 */
if (dir == 0) /* 竖屏 */
{
lcddev.width = 240;
lcddev.height = 320;
if (lcddev.id == 0x5510)
{
lcddev.wramcmd = 0x2C00;
lcddev.setxcmd = 0x2A00;
lcddev.setycmd = 0x2B00;
lcddev.width = 480;
lcddev.height = 800;
}
else if (lcddev.id == 0x1963)
{
lcddev.wramcmd = 0x2C; /* 设置写入GRAM的指令 */
lcddev.setxcmd = 0x2B; /* 设置写X坐标指令 */
lcddev.setycmd = 0x2A; /* 设置写Y坐标指令 */
lcddev.width = 480; /* 设置宽度480 */
lcddev.height = 800; /* 设置高度800 */
}
else /* 其他IC, 包括: 9341/5310/7789/7796/9806等IC */
{
lcddev.wramcmd = 0x2C;
lcddev.setxcmd = 0x2A;
lcddev.setycmd = 0x2B;
}
if (lcddev.id == 0x5310 || lcddev.id == 0x7796) /* 如果是5310/7796 则表示是 320*480分辨率 */
{
lcddev.width = 320;
lcddev.height = 480;
}
if (lcddev.id == 0X9806) /* 如果是9806 则表示是 480*800 分辨率 */
{
lcddev.width = 480;
lcddev.height = 800;
}
}
else /* 横屏 */
{
lcddev.width = 320; /* 默认宽度 */
lcddev.height = 240; /* 默认高度 */
if (lcddev.id == 0x5510)
{
lcddev.wramcmd = 0x2C00;
lcddev.setxcmd = 0x2A00;
lcddev.setycmd = 0x2B00;
lcddev.width = 800;
lcddev.height = 480;
}
else if (lcddev.id == 0x1963 || lcddev.id == 0x9806)
{
lcddev.wramcmd = 0x2C; /* 设置写入GRAM的指令 */
lcddev.setxcmd = 0x2A; /* 设置写X坐标指令 */
lcddev.setycmd = 0x2B; /* 设置写Y坐标指令 */
lcddev.width = 800; /* 设置宽度800 */
lcddev.height = 480; /* 设置高度480 */
}
else /* 其他IC, 包括:9341/5310/7789/7796等IC */
{
lcddev.wramcmd = 0x2C;
lcddev.setxcmd = 0x2A;
lcddev.setycmd = 0x2B;
}
if (lcddev.id == 0x5310 || lcddev.id == 0x7796) /* 如果是5310/7796 则表示是 320*480分辨率 */
{
lcddev.width = 480;
lcddev.height = 320;
}
}
lcd_scan_dir(DFT_SCAN_DIR); /* 默认扫描方向 */
}
/**
* @brief 设置窗口(对RGB屏无效), 并自动设置画点坐标到窗口左上角(sx,sy).
* @param sx,sy:窗口起始坐标(左上角)
* @param width,height:窗口宽度和高度,必须大于0!!
* @note 窗体大小:width*height.
*
* @retval 无
*/
void lcd_set_window(uint16_t sx, uint16_t sy, uint16_t width, uint16_t height)
{
uint16_t twidth, theight;
twidth = sx + width - 1;
theight = sy + height - 1;
if (lcddev.id == 0x1963 && lcddev.dir != 1) /* 1963竖屏特殊处理 */
{
sx = lcddev.width - width - sx;
height = sy + height - 1;
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(sx >> 8);
lcd_wr_data(sx & 0xFF);
lcd_wr_data((sx + width - 1) >> 8);
lcd_wr_data((sx + width - 1) & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(sy >> 8);
lcd_wr_data(sy & 0xFF);
lcd_wr_data(height >> 8);
lcd_wr_data(height & 0xFF);
}
else if (lcddev.id == 0x5510)
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(sx >> 8);
lcd_wr_regno(lcddev.setxcmd + 1);
lcd_wr_data(sx & 0xFF);
lcd_wr_regno(lcddev.setxcmd + 2);
lcd_wr_data(twidth >> 8);
lcd_wr_regno(lcddev.setxcmd + 3);
lcd_wr_data(twidth & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(sy >> 8);
lcd_wr_regno(lcddev.setycmd + 1);
lcd_wr_data(sy & 0xFF);
lcd_wr_regno(lcddev.setycmd + 2);
lcd_wr_data(theight >> 8);
lcd_wr_regno(lcddev.setycmd + 3);
lcd_wr_data(theight & 0xFF);
}
else /* 9341/5310/7789/1963/7796/9806横屏 等 设置窗口 */
{
lcd_wr_regno(lcddev.setxcmd);
lcd_wr_data(sx >> 8);
lcd_wr_data(sx & 0xFF);
lcd_wr_data(twidth >> 8);
lcd_wr_data(twidth & 0xFF);
lcd_wr_regno(lcddev.setycmd);
lcd_wr_data(sy >> 8);
lcd_wr_data(sy & 0xFF);
lcd_wr_data(theight >> 8);
lcd_wr_data(theight & 0xFF);
}
}
/**
* @brief SRAM底层驱动,时钟使能,引脚分配
* @note 此函数会被HAL_SRAM_Init()调用,初始化读写总线引脚
* @param hsram:SRAM句柄
* @retval 无
*/
void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram)
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_FSMC_CLK_ENABLE(); /* 使能FSMC时钟 */
__HAL_RCC_GPIOD_CLK_ENABLE(); /* 使能GPIOD时钟 */
__HAL_RCC_GPIOE_CLK_ENABLE(); /* 使能GPIOE时钟 */
/* 初始化PD0,1, 8,9,10,14,15 */
gpio_init_struct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 \
| GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15;
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 推挽复用 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
gpio_init_struct.Alternate = GPIO_AF12_FSMC; /* 复用为FSMC */
HAL_GPIO_Init(GPIOD, &gpio_init_struct); /* 初始化 */
/* 初始化PE7,8,9,10,11,12,13,14,15 */
gpio_init_struct.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 \
| GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
HAL_GPIO_Init(GPIOE, &gpio_init_struct);
}
/**
* @brief 初始化LCD
* @note 该初始化函数可以初始化各种型号的LCD(详见本.c文件最前面的描述)
*
* @param 无
* @retval 无
*/
void lcd_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
FSMC_NORSRAM_TimingTypeDef fsmc_read_handle;
FSMC_NORSRAM_TimingTypeDef fsmc_write_handle;
LCD_CS_GPIO_CLK_ENABLE(); /* LCD_CS脚时钟使能 */
LCD_WR_GPIO_CLK_ENABLE(); /* LCD_WR脚时钟使能 */
LCD_RD_GPIO_CLK_ENABLE(); /* LCD_RD脚时钟使能 */
LCD_RS_GPIO_CLK_ENABLE(); /* LCD_RS脚时钟使能 */
LCD_BL_GPIO_CLK_ENABLE(); /* LCD_BL脚时钟使能 */
gpio_init_struct.Pin = LCD_CS_GPIO_PIN;
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 推挽复用 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
gpio_init_struct.Alternate = GPIO_AF12_FSMC; /* 复用为FSMC */
HAL_GPIO_Init(LCD_CS_GPIO_PORT, &gpio_init_struct); /* 初始化LCD_CS引脚 */
gpio_init_struct.Pin = LCD_WR_GPIO_PIN;
HAL_GPIO_Init(LCD_WR_GPIO_PORT, &gpio_init_struct); /* 初始化LCD_WR引脚 */
gpio_init_struct.Pin = LCD_RD_GPIO_PIN;
HAL_GPIO_Init(LCD_RD_GPIO_PORT, &gpio_init_struct); /* 初始化LCD_RD引脚 */
gpio_init_struct.Pin = LCD_RS_GPIO_PIN;
HAL_GPIO_Init(LCD_RS_GPIO_PORT, &gpio_init_struct); /* 初始化LCD_RS引脚 */
gpio_init_struct.Pin = LCD_BL_GPIO_PIN;
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */
HAL_GPIO_Init(LCD_BL_GPIO_PORT, &gpio_init_struct); /* LCD_BL引脚模式设置(推挽输出) */
g_sram_handle.Instance = FSMC_NORSRAM_DEVICE;
g_sram_handle.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
g_sram_handle.Init.NSBank = FSMC_NORSRAM_BANK4; /* 使用NE4 */
g_sram_handle.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; /* 地址/数据线不复用 */
g_sram_handle.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16; /* 16位数据宽度 */
g_sram_handle.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE; /* 是否使能突发访问,仅对同步突发存储器有效,此处未用到 */
g_sram_handle.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW; /* 等待信号的极性,仅在突发模式访问下有用 */
g_sram_handle.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS; /* 存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT */
g_sram_handle.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE; /* 存储器写使能 */
g_sram_handle.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE; /* 等待使能位,此处未用到 */
g_sram_handle.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE; /* 读写使用不同的时序 */
g_sram_handle.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE; /* 是否使能同步传输模式下的等待信号,此处未用到 */
g_sram_handle.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE; /* 禁止突发写 */
/* FSMC读时序控制寄存器 */
fsmc_read_handle.AddressSetupTime = 0x0F; /* 地址建立时间(ADDSET)为15个fsmc_ker_ck(1/168=6)即6*15=90ns */
fsmc_read_handle.AddressHoldTime = 0x00; /* 地址保持时间(ADDHLD) 模式A是没有用到 */
fsmc_read_handle.DataSetupTime = 60; /* 数据保存时间(DATAST)为60个fsmc_ker_ck=6*60=360ns */
/* 因为液晶驱动IC的读数据的时候,速度不能太快,尤其是个别奇葩芯片 */
fsmc_read_handle.AccessMode = FSMC_ACCESS_MODE_A; /* 模式A */
/* FSMC写时序控制寄存器 */
fsmc_write_handle.AddressSetupTime = 9; /* 地址建立时间(ADDSET)为9个fsmc_ker_ck=6*9=54ns */
fsmc_write_handle.AddressHoldTime = 0x00; /* 地址保持时间(ADDHLD) 模式A是没有用到 */
fsmc_write_handle.DataSetupTime = 9; /* 数据保存时间(DATAST)为9个fsmc_ker_ck=6*9=54ns */
/* 注意:某些液晶驱动IC的写信号脉宽,最少也得50ns */
fsmc_write_handle.AccessMode = FSMC_ACCESS_MODE_A; /* 模式A */
HAL_SRAM_Init(&g_sram_handle, &fsmc_read_handle, &fsmc_write_handle);
delay_ms(50);
/* 尝试9341 ID的读取 */
lcd_wr_regno(0xD3);
lcddev.id = lcd_rd_data(); /* dummy read */
lcddev.id = lcd_rd_data(); /* 读到0x00 */
lcddev.id = lcd_rd_data(); /* 读取93 */
lcddev.id <<= 8;
lcddev.id |= lcd_rd_data(); /* 读取41 */
if (lcddev.id != 0x9341) /* 不是 9341 , 尝试看看是不是 ST7789 */
{
lcd_wr_regno(0x04);
lcddev.id = lcd_rd_data(); /* dummy read */
lcddev.id = lcd_rd_data(); /* 读到0x85 */
lcddev.id = lcd_rd_data(); /* 读取0x85 */
lcddev.id <<= 8;
lcddev.id |= lcd_rd_data(); /* 读取0x52 */
if (lcddev.id == 0x8552) /* 将8552的ID转换成7789 */
{
lcddev.id = 0x7789;
}
if (lcddev.id != 0x7789) /* 也不是ST7789, 尝试是不是 NT35310 */
{
lcd_wr_regno(0xD4);
lcddev.id = lcd_rd_data(); /* dummy read */
lcddev.id = lcd_rd_data(); /* 读回0x01 */
lcddev.id = lcd_rd_data(); /* 读回0x53 */
lcddev.id <<= 8;
lcddev.id |= lcd_rd_data(); /* 这里读回0x10 */
if (lcddev.id != 0x5310) /* 也不是NT35310,尝试看看是不是ST7796 */
{
lcd_wr_regno(0XD3);
lcddev.id = lcd_rd_data(); /* dummy read */
lcddev.id = lcd_rd_data(); /* 读到0X00 */
lcddev.id = lcd_rd_data(); /* 读取0X77 */
lcddev.id <<= 8;
lcddev.id |= lcd_rd_data(); /* 读取0X96 */
if (lcddev.id != 0x7796) /* 也不是ST7796,尝试看看是不是NT35510 */
{
/* 发送密钥(厂家提供) */
lcd_write_reg(0xF000, 0x0055);
lcd_write_reg(0xF001, 0x00AA);
lcd_write_reg(0xF002, 0x0052);
lcd_write_reg(0xF003, 0x0008);
lcd_write_reg(0xF004, 0x0001);
lcd_wr_regno(0xC500); /* 读取ID低八位 */
lcddev.id = lcd_rd_data(); /* 读回0x80 */
lcddev.id <<= 8;
lcd_wr_regno(0xC501); /* 读取ID高八位 */
lcddev.id |= lcd_rd_data(); /* 读回0x00 */
delay_ms(5); /* 等待5ms, 因为0XC501指令对1963来说就是软件复位指令, 等待5ms让1963复位完成再操作 */
if (lcddev.id != 0x5510) /* 也不是NT5510,尝试看看是不是ILI9806 */
{
lcd_wr_regno(0XD3);
lcddev.id = lcd_rd_data(); /* dummy read */
lcddev.id = lcd_rd_data(); /* 读回0X00 */
lcddev.id = lcd_rd_data(); /* 读回0X98 */
lcddev.id <<= 8;
lcddev.id |= lcd_rd_data(); /* 读回0X06 */
if (lcddev.id != 0x9806) /* 也不是ILI9806,尝试看看是不是SSD1963 */
{
lcd_wr_regno(0xA1);
lcddev.id = lcd_rd_data();
lcddev.id = lcd_rd_data(); /* 读回0x57 */
lcddev.id <<= 8;
lcddev.id |= lcd_rd_data(); /* 读回0x61 */
if (lcddev.id == 0x5761) lcddev.id = 0x1963; /* SSD1963读回的ID是5761H,为方便区分,我们强制设置为1963 */
}
}
}
}
}
}
/* 特别注意, 如果在main函数里面屏蔽串口1初始化, 则会卡死在printf
* 里面(卡死在f_putc函数), 所以, 必须初始化串口1, 或者屏蔽掉下面
* 这行 printf 语句 !!!!!!!
*/
if (lcddev.id == 0x7789)
{
lcd_ex_st7789_reginit(); /* 执行ST7789初始化 */
}
else if (lcddev.id == 0x9341)
{
lcd_ex_ili9341_reginit(); /* 执行ILI9341初始化 */
}
else if (lcddev.id == 0x5310)
{
lcd_ex_nt35310_reginit(); /* 执行NT35310初始化 */
}
else if (lcddev.id == 0x7796)
{
lcd_ex_st7796_reginit(); /* 执行ST7796初始化 */
}
else if (lcddev.id == 0x5510)
{
lcd_ex_nt35510_reginit(); /* 执行NT35510初始化 */
}
else if (lcddev.id == 0x9806)
{
lcd_ex_ili9806_reginit(); /* 执行ILI9806初始化 */
}
else if (lcddev.id == 0x1963)
{
lcd_ex_ssd1963_reginit(); /* 执行SSD1963初始化 */
lcd_ssd_backlight_set(100); /* 背光设置为最亮 */
}
/* 由于不同屏幕的写时序不同,这里的时序可以根据自己的屏幕进行修改
(若插上长排线对时序也会有影响,需要自己根据情况修改) */
/* 初始化完成以后,提速 */
if (lcddev.id == 0x7789)
{
/* 重新配置写时序控制寄存器的时序 */
fsmc_write_handle.AddressSetupTime = 3; /* 地址建立时间(ADDSET)为3个fsmc_ker_ck=6*3=18ns */
fsmc_write_handle.DataSetupTime = 3; /* 数据保持时间(DATAST)为3个fsmc_ker_ck=6*3=18ns */
FSMC_NORSRAM_Extended_Timing_Init(g_sram_handle.Extended, &fsmc_write_handle, g_sram_handle.Init.NSBank, g_sram_handle.Init.ExtendedMode);
}
else if (lcddev.id == 0x9806 || lcddev.id == 0x9341 || lcddev.id == 0x5510)
{
/* 重新配置写时序控制寄存器的时序 */
fsmc_write_handle.AddressSetupTime = 2; /* 地址建立时间(ADDSET)为2个fsmc_ker_ck=6*2=12ns */
fsmc_write_handle.DataSetupTime = 2; /* 数据保持时间(DATAST)为2个fsmc_ker_ck=6*2=12ns */
FSMC_NORSRAM_Extended_Timing_Init(g_sram_handle.Extended, &fsmc_write_handle, g_sram_handle.Init.NSBank, g_sram_handle.Init.ExtendedMode);
}
else if (lcddev.id == 0x5310 || lcddev.id == 0x7796 || lcddev.id == 0x1963)
{
/* 重新配置写时序控制寄存器的时序 */
fsmc_write_handle.AddressSetupTime = 1; /* 地址建立时间(ADDSET)为1个fsmc_ker_ck=6*1=6ns */
fsmc_write_handle.DataSetupTime = 1; /* 数据保持时间(DATAST)为1个fsmc_ker_ck=6*1=6ns */
FSMC_NORSRAM_Extended_Timing_Init(g_sram_handle.Extended, &fsmc_write_handle, g_sram_handle.Init.NSBank, g_sram_handle.Init.ExtendedMode);
}
lcd_display_dir(0); /* 默认为竖屏 */
LCD_BL(1); /* 点亮背光 */
lcd_clear(WHITE);
}
/**
* @brief 清屏函数
* @param color: 要清屏的颜色
* @retval 无
*/
void lcd_clear(uint16_t color)
{
uint32_t index = 0;
uint32_t totalpoint = lcddev.width;
totalpoint *= lcddev.height; /* 得到总点数 */
lcd_set_cursor(0x00, 0x0000); /* 设置光标位置 */
lcd_write_ram_prepare(); /* 开始写入GRAM */
for (index = 0; index < totalpoint; index++)
{
LCD->LCD_RAM = color;
}
}
/**
* @brief 在指定区域内填充单个颜色
* @param (sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex - sx + 1) * (ey - sy + 1)
* @param color: 要填充的颜色(32位颜色,方便兼容LTDC)
* @retval 无
*/
void lcd_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint32_t color)
{
uint16_t i, j;
uint16_t xlen = 0;
xlen = ex - sx + 1;
for (i = sy; i <= ey; i++)
{
lcd_set_cursor(sx, i); /* 设置光标位置 */
lcd_write_ram_prepare(); /* 开始写入GRAM */
for (j = 0; j < xlen; j++)
{
LCD->LCD_RAM = color; /* 显示颜色 */
}
}
}
/**
* @brief 在指定区域内填充指定颜色块
* @param (sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex - sx + 1) * (ey - sy + 1)
* @param color: 要填充的颜色数组首地址
* @retval 无
*/
void lcd_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *color)
{
uint16_t height, width;
uint16_t i, j;
width = ex - sx + 1; /* 得到填充的宽度 */
height = ey - sy + 1; /* 高度 */
for (i = 0; i < height; i++)
{
lcd_set_cursor(sx, sy + i); /* 设置光标位置 */
lcd_write_ram_prepare(); /* 开始写入GRAM */
for (j = 0; j < width; j++)
{
LCD->LCD_RAM = color[i * width + j]; /* 写入数据 */
}
}
}
/**
* @brief 画线
* @param x1,y1: 起点坐标
* @param x2,y2: 终点坐标
* @param color: 线的颜色
* @retval 无
*/
void lcd_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color)
{
uint16_t t;
int xerr = 0, yerr = 0, delta_x, delta_y, distance;
int incx, incy, row, col;
delta_x = x2 - x1; /* 计算坐标增量 */
delta_y = y2 - y1;
row = x1;
col = 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;
}
for (t = 0; t <= distance + 1; t++) /* 画线输出 */
{
lcd_draw_point(row, col, color); /* 画点 */
xerr += delta_x;
yerr += delta_y;
if (xerr > distance)
{
xerr -= distance;
row += incx;
}
if (yerr > distance)
{
yerr -= distance;
col += incy;
}
}
}
/**
* @brief 画水平线
* @param x,y : 起点坐标
* @param len : 线长度
* @param color : 矩形的颜色
* @retval 无
*/
void lcd_draw_hline(uint16_t x, uint16_t y, uint16_t len, uint16_t color)
{
if ((len == 0) || (x > lcddev.width) || (y > lcddev.height))
{
return;
}
lcd_fill(x, y, x + len - 1, y, color);
}
/**
* @brief 画矩形
* @param x1,y1: 起点坐标
* @param x2,y2: 终点坐标
* @param color: 矩形的颜色
* @retval 无
*/
void lcd_draw_rectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color)
{
lcd_draw_line(x1, y1, x2, y1, color);
lcd_draw_line(x1, y1, x1, y2, color);
lcd_draw_line(x1, y2, x2, y2, color);
lcd_draw_line(x2, y1, x2, y2, color);
}
/**
* @brief 画圆
* @param x0,y0 : 圆中心坐标
* @param r : 半径
* @param color : 圆的颜色
* @retval 无
*/
void lcd_draw_circle(uint16_t x0, uint16_t y0, uint8_t r, uint16_t color)
{
int a, b;
int di;
a = 0;
b = r;
di = 3 - (r << 1); /* 判断下个点位置的标志 */
while (a <= b)
{
lcd_draw_point(x0 + a, y0 - b, color); /* 5 */
lcd_draw_point(x0 + b, y0 - a, color); /* 0 */
lcd_draw_point(x0 + b, y0 + a, color); /* 4 */
lcd_draw_point(x0 + a, y0 + b, color); /* 6 */
lcd_draw_point(x0 - a, y0 + b, color); /* 1 */
lcd_draw_point(x0 - b, y0 + a, color);
lcd_draw_point(x0 - a, y0 - b, color); /* 2 */
lcd_draw_point(x0 - b, y0 - a, color); /* 7 */
a++;
/* 使用Bresenham算法画圆 */
if (di < 0)
{
di += 4 * a + 6;
}
else
{
di += 10 + 4 * (a - b);
b--;
}
}
}
/**
* @brief 填充实心圆
* @param x,y : 圆中心坐标
* @param r : 半径
* @param color: 圆的颜色
* @retval 无
*/
void lcd_fill_circle(uint16_t x, uint16_t y, uint16_t r, uint16_t color)
{
uint32_t i;
uint32_t imax = ((uint32_t)r * 707) / 1000 + 1;
uint32_t sqmax = (uint32_t)r * (uint32_t)r + (uint32_t)r / 2;
uint32_t xr = r;
lcd_draw_hline(x - r, y, 2 * r, color);
for (i = 1; i <= imax; i++)
{
if ((i * i + xr * xr) > sqmax)
{
/* draw lines from outside */
if (xr > imax)
{
lcd_draw_hline (x - i + 1, y + xr, 2 * (i - 1), color);
lcd_draw_hline (x - i + 1, y - xr, 2 * (i - 1), color);
}
xr--;
}
/* draw lines from inside (center) */
lcd_draw_hline(x - xr, y + i, 2 * xr, color);
lcd_draw_hline(x - xr, y - i, 2 * xr, color);
}
}
/**
* @brief 在指定位置显示一个字符
* @param x,y : 坐标
* @param chr : 要显示的字符:" "--->"~"
* @param size : 字体大小 12/16/24/32
* @param mode : 叠加方式(1); 非叠加方式(0);
* @param color : 字符的颜色;
* @retval 无
*/
void lcd_show_char(uint16_t x, uint16_t y, char chr, uint8_t size, uint8_t mode, uint16_t color)
{
uint8_t temp, t1, t;
uint16_t y0 = y;
uint8_t csize = 0;
uint8_t *pfont = 0;
csize = (size / 8 + ((size % 8) ? 1 : 0)) * (size / 2); /* 得到字体一个字符对应点阵集所占的字节数 */
chr = chr - ' '; /* 得到偏移后的值(ASCII字库是从空格开始取模,所以-' '就是对应字符的字库) */
switch (size)
{
case 12:
pfont = (uint8_t *)asc2_1206[chr]; /* 调用1206字体 */
break;
case 16:
pfont = (uint8_t *)asc2_1608[chr]; /* 调用1608字体 */
break;
case 24:
pfont = (uint8_t *)asc2_2412[chr]; /* 调用2412字体 */
break;
case 32:
pfont = (uint8_t *)asc2_3216[chr]; /* 调用3216字体 */
break;
default:
return ;
}
for (t = 0; t < csize; t++)
{
temp = pfont[t]; /* 获取字符的点阵数据 */
for (t1 = 0; t1 < 8; t1++) /* 一个字节8个点 */
{
if (temp & 0x80) /* 有效点,需要显示 */
{
lcd_draw_point(x, y, color); /* 画点出来,要显示这个点 */
}
else if (mode == 0) /* 无效点,不显示 */
{
lcd_draw_point(x, y, g_back_color); /* 画背景色,相当于这个点不显示(注意背景色由全局变量控制) */
}
temp <<= 1; /* 移位, 以便获取下一个位的状态 */
y++;
if (y >= lcddev.height)return; /* 超区域了 */
if ((y - y0) == size) /* 显示完一列了? */
{
y = y0; /* y坐标复位 */
x++; /* x坐标递增 */
if (x >= lcddev.width)
{
return; /* x坐标超区域了 */
}
break;
}
}
}
}
/**
* @brief 平方函数, m^n
* @param m: 底数
* @param n: 指数
* @retval m的n次方
*/
static uint32_t lcd_pow(uint8_t m, uint8_t n)
{
uint32_t result = 1;
while (n--)
{
result *= m;
}
return result;
}
/**
* @brief 显示len个数字
* @param x,y : 起始坐标
* @param num : 数值(0 ~ 2^32)
* @param len : 显示数字的位数
* @param size: 选择字体 12/16/24/32
* @param color : 数字的颜色;
* @retval 无
*/
void lcd_show_num(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size, uint16_t color)
{
uint8_t t, temp;
uint8_t enshow = 0;
for (t = 0; t < len; t++) /* 按总显示位数循环 */
{
temp = (num / lcd_pow(10, len - t - 1)) % 10; /* 获取对应位的数字 */
if (enshow == 0 && t < (len - 1)) /* 没有使能显示,且还有位要显示 */
{
if (temp == 0)
{
lcd_show_char(x + (size / 2) * t, y, ' ', size, 0, color); /* 显示空格,占位 */
continue; /* 继续下个一位 */
}
else
{
enshow = 1; /* 使能显示 */
}
}
lcd_show_char(x + (size / 2) * t, y, temp + '0', size, 0, color); /* 显示字符 */
}
}
/**
* @brief 扩展显示len个数字(高位是0也显示)
* @param x,y : 起始坐标
* @param num : 数值(0 ~ 2^32)
* @param len : 显示数字的位数
* @param size: 选择字体 12/16/24/32
* @param mode: 显示模式
* [7]:0,不填充;1,填充0.
* [6:1]:保留
* [0]:0,非叠加显示;1,叠加显示.
* @param color : 数字的颜色;
* @retval 无
*/
void lcd_show_xnum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, uint8_t size, uint8_t mode, uint16_t color)
{
uint8_t t, temp;
uint8_t enshow = 0;
for (t = 0; t < len; t++) /* 按总显示位数循环 */
{
temp = (num / lcd_pow(10, len - t - 1)) % 10; /* 获取对应位的数字 */
if (enshow == 0 && t < (len - 1)) /* 没有使能显示,且还有位要显示 */
{
if (temp == 0)
{
if (mode & 0x80) /* 高位需要填充0 */
{
lcd_show_char(x + (size / 2) * t, y, '0', size, mode & 0x01, color); /* 用0占位 */
}
else
{
lcd_show_char(x + (size / 2) * t, y, ' ', size, mode & 0x01, color); /* 用空格占位 */
}
continue;
}
else
{
enshow = 1; /* 使能显示 */
}
}
lcd_show_char(x + (size / 2) * t, y, temp + '0', size, mode & 0x01, color);
}
}
/**
* @brief 显示字符串
* @param x,y : 起始坐标
* @param width,height: 区域大小
* @param size : 选择字体 12/16/24/32
* @param p : 字符串首地址
* @param color : 字符串的颜色;
* @retval 无
*/
void lcd_show_string(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, char *p, uint16_t color)
{
uint8_t x0 = x;
width += x;
height += y;
while ((*p <= '~') && (*p >= ' ')) /* 判断是不是非法字符! */
{
if (x >= width)
{
x = x0;
y += size;
}
if (y >= height)
{
break; /* 退出 */
}
lcd_show_char(x, y, *p, size, 0, color);
x += size / 2;
p++;
}
}
lcd_ex.c:
/**
****************************************************************************************************
* @file lcd_ex.c
* @author 正点原子团队(ALIENTEK)
* @version V1.1
* @date 2023-05-29
* @brief lcd_ex.c存放各个LCD驱动IC的寄存器初始化部分代码,以简化lcd.c,该.c文件
* 不直接加入到工程里面,只有lcd.c会用到,所以通过include的形式添加.(不要在
* 其他文件再包含该.c文件!!否则会报错!)
*
* @license Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
****************************************************************************************************
* @attention
*
* 实验平台:正点原子 探索者 F407开发板
* 在线视频:www.yuanzige.com
* 技术论坛:www.openedv.com
* 公司网址:www.alientek.com
* 购买地址:openedv.taobao.com
*
* 修改说明
* V1.0 20211016
* 第一次发布
* V1.1 20230529
* 1,新增对ST7796和ILI9806 IC支持
****************************************************************************************************
*/
#include "LCD/lcd.h"
/**
* @brief ST7789 寄存器初始化代码
* @param 无
* @retval 无
*/
void lcd_ex_st7789_reginit(void)
{
lcd_wr_regno(0x11);
delay_ms(120);
lcd_wr_regno(0x36);
lcd_wr_data(0x00);
lcd_wr_regno(0x3A);
lcd_wr_data(0x05);
lcd_wr_regno(0xB2);
lcd_wr_data(0x0C);
lcd_wr_data(0x0C);
lcd_wr_data(0x00);
lcd_wr_data(0x33);
lcd_wr_data(0x33);
lcd_wr_regno(0xB7);
lcd_wr_data(0x35);
lcd_wr_regno(0xBB); /* vcom */
lcd_wr_data(0x32); /* 30 */
lcd_wr_regno(0xC0);
lcd_wr_data(0x0C);
lcd_wr_regno(0xC2);
lcd_wr_data(0x01);
lcd_wr_regno(0xC3); /* vrh */
lcd_wr_data(0x10); /* 17 0D */
lcd_wr_regno(0xC4); /* vdv */
lcd_wr_data(0x20); /* 20 */
lcd_wr_regno(0xC6);
lcd_wr_data(0x0f);
lcd_wr_regno(0xD0);
lcd_wr_data(0xA4);
lcd_wr_data(0xA1);
lcd_wr_regno(0xE0); /* Set Gamma */
lcd_wr_data(0xd0);
lcd_wr_data(0x00);
lcd_wr_data(0x02);
lcd_wr_data(0x07);
lcd_wr_data(0x0a);
lcd_wr_data(0x28);
lcd_wr_data(0x32);
lcd_wr_data(0x44);
lcd_wr_data(0x42);
lcd_wr_data(0x06);
lcd_wr_data(0x0e);
lcd_wr_data(0x12);
lcd_wr_data(0x14);
lcd_wr_data(0x17);
lcd_wr_regno(0xE1); /* Set Gamma */
lcd_wr_data(0xd0);
lcd_wr_data(0x00);
lcd_wr_data(0x02);
lcd_wr_data(0x07);
lcd_wr_data(0x0a);
lcd_wr_data(0x28);
lcd_wr_data(0x31);
lcd_wr_data(0x54);
lcd_wr_data(0x47);
lcd_wr_data(0x0e);
lcd_wr_data(0x1c);
lcd_wr_data(0x17);
lcd_wr_data(0x1b);
lcd_wr_data(0x1e);
lcd_wr_regno(0x2A);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0xef);
lcd_wr_regno(0x2B);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x01);
lcd_wr_data(0x3f);
lcd_wr_regno(0x29); /* display on */
}
/**
* @brief ILI9341寄存器初始化代码
* @param 无
* @retval 无
*/
void lcd_ex_ili9341_reginit(void)
{
lcd_wr_regno(0xCF);
lcd_wr_data(0x00);
lcd_wr_data(0xC1);
lcd_wr_data(0x30);
lcd_wr_regno(0xED);
lcd_wr_data(0x64);
lcd_wr_data(0x03);
lcd_wr_data(0x12);
lcd_wr_data(0x81);
lcd_wr_regno(0xE8);
lcd_wr_data(0x85);
lcd_wr_data(0x10);
lcd_wr_data(0x7A);
lcd_wr_regno(0xCB);
lcd_wr_data(0x39);
lcd_wr_data(0x2C);
lcd_wr_data(0x00);
lcd_wr_data(0x34);
lcd_wr_data(0x02);
lcd_wr_regno(0xF7);
lcd_wr_data(0x20);
lcd_wr_regno(0xEA);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xC0); /* Power control */
lcd_wr_data(0x1B); /* VRH[5:0] */
lcd_wr_regno(0xC1); /* Power control */
lcd_wr_data(0x01); /* SAP[2:0];BT[3:0] */
lcd_wr_regno(0xC5); /* VCM control */
lcd_wr_data(0x30); /* 3F */
lcd_wr_data(0x30); /* 3C */
lcd_wr_regno(0xC7); /* VCM control2 */
lcd_wr_data(0xB7);
lcd_wr_regno(0x36); /* Memory Access Control */
lcd_wr_data(0x48);
lcd_wr_regno(0x3A);
lcd_wr_data(0x55);
lcd_wr_regno(0xB1);
lcd_wr_data(0x00);
lcd_wr_data(0x1A);
lcd_wr_regno(0xB6); /* Display Function Control */
lcd_wr_data(0x0A);
lcd_wr_data(0xA2);
lcd_wr_regno(0xF2); /* 3Gamma Function Disable */
lcd_wr_data(0x00);
lcd_wr_regno(0x26); /* Gamma curve selected */
lcd_wr_data(0x01);
lcd_wr_regno(0xE0); /* Set Gamma */
lcd_wr_data(0x0F);
lcd_wr_data(0x2A);
lcd_wr_data(0x28);
lcd_wr_data(0x08);
lcd_wr_data(0x0E);
lcd_wr_data(0x08);
lcd_wr_data(0x54);
lcd_wr_data(0xA9);
lcd_wr_data(0x43);
lcd_wr_data(0x0A);
lcd_wr_data(0x0F);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xE1); /* Set Gamma */
lcd_wr_data(0x00);
lcd_wr_data(0x15);
lcd_wr_data(0x17);
lcd_wr_data(0x07);
lcd_wr_data(0x11);
lcd_wr_data(0x06);
lcd_wr_data(0x2B);
lcd_wr_data(0x56);
lcd_wr_data(0x3C);
lcd_wr_data(0x05);
lcd_wr_data(0x10);
lcd_wr_data(0x0F);
lcd_wr_data(0x3F);
lcd_wr_data(0x3F);
lcd_wr_data(0x0F);
lcd_wr_regno(0x2B);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x01);
lcd_wr_data(0x3f);
lcd_wr_regno(0x2A);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0xef);
lcd_wr_regno(0x11); /* Exit Sleep */
delay_ms(120);
lcd_wr_regno(0x29); /* display on */
}
/**
* @brief NT35310寄存器初始化代码
* @param 无
* @retval 无
*/
void lcd_ex_nt35310_reginit(void)
{
lcd_wr_regno(0xED);
lcd_wr_data(0x01);
lcd_wr_data(0xFE);
lcd_wr_regno(0xEE);
lcd_wr_data(0xDE);
lcd_wr_data(0x21);
lcd_wr_regno(0xF1);
lcd_wr_data(0x01);
lcd_wr_regno(0xDF);
lcd_wr_data(0x10);
/* VCOMvoltage */
lcd_wr_regno(0xC4);
lcd_wr_data(0x8F); /* 5f */
lcd_wr_regno(0xC6);
lcd_wr_data(0x00);
lcd_wr_data(0xE2);
lcd_wr_data(0xE2);
lcd_wr_data(0xE2);
lcd_wr_regno(0xBF);
lcd_wr_data(0xAA);
lcd_wr_regno(0xB0);
lcd_wr_data(0x0D);
lcd_wr_data(0x00);
lcd_wr_data(0x0D);
lcd_wr_data(0x00);
lcd_wr_data(0x11);
lcd_wr_data(0x00);
lcd_wr_data(0x19);
lcd_wr_data(0x00);
lcd_wr_data(0x21);
lcd_wr_data(0x00);
lcd_wr_data(0x2D);
lcd_wr_data(0x00);
lcd_wr_data(0x3D);
lcd_wr_data(0x00);
lcd_wr_data(0x5D);
lcd_wr_data(0x00);
lcd_wr_data(0x5D);
lcd_wr_data(0x00);
lcd_wr_regno(0xB1);
lcd_wr_data(0x80);
lcd_wr_data(0x00);
lcd_wr_data(0x8B);
lcd_wr_data(0x00);
lcd_wr_data(0x96);
lcd_wr_data(0x00);
lcd_wr_regno(0xB2);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x02);
lcd_wr_data(0x00);
lcd_wr_data(0x03);
lcd_wr_data(0x00);
lcd_wr_regno(0xB3);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xB4);
lcd_wr_data(0x8B);
lcd_wr_data(0x00);
lcd_wr_data(0x96);
lcd_wr_data(0x00);
lcd_wr_data(0xA1);
lcd_wr_data(0x00);
lcd_wr_regno(0xB5);
lcd_wr_data(0x02);
lcd_wr_data(0x00);
lcd_wr_data(0x03);
lcd_wr_data(0x00);
lcd_wr_data(0x04);
lcd_wr_data(0x00);
lcd_wr_regno(0xB6);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xB7);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x3F);
lcd_wr_data(0x00);
lcd_wr_data(0x5E);
lcd_wr_data(0x00);
lcd_wr_data(0x64);
lcd_wr_data(0x00);
lcd_wr_data(0x8C);
lcd_wr_data(0x00);
lcd_wr_data(0xAC);
lcd_wr_data(0x00);
lcd_wr_data(0xDC);
lcd_wr_data(0x00);
lcd_wr_data(0x70);
lcd_wr_data(0x00);
lcd_wr_data(0x90);
lcd_wr_data(0x00);
lcd_wr_data(0xEB);
lcd_wr_data(0x00);
lcd_wr_data(0xDC);
lcd_wr_data(0x00);
lcd_wr_regno(0xB8);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xBA);
lcd_wr_data(0x24);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xC1);
lcd_wr_data(0x20);
lcd_wr_data(0x00);
lcd_wr_data(0x54);
lcd_wr_data(0x00);
lcd_wr_data(0xFF);
lcd_wr_data(0x00);
lcd_wr_regno(0xC2);
lcd_wr_data(0x0A);
lcd_wr_data(0x00);
lcd_wr_data(0x04);
lcd_wr_data(0x00);
lcd_wr_regno(0xC3);
lcd_wr_data(0x3C);
lcd_wr_data(0x00);
lcd_wr_data(0x3A);
lcd_wr_data(0x00);
lcd_wr_data(0x39);
lcd_wr_data(0x00);
lcd_wr_data(0x37);
lcd_wr_data(0x00);
lcd_wr_data(0x3C);
lcd_wr_data(0x00);
lcd_wr_data(0x36);
lcd_wr_data(0x00);
lcd_wr_data(0x32);
lcd_wr_data(0x00);
lcd_wr_data(0x2F);
lcd_wr_data(0x00);
lcd_wr_data(0x2C);
lcd_wr_data(0x00);
lcd_wr_data(0x29);
lcd_wr_data(0x00);
lcd_wr_data(0x26);
lcd_wr_data(0x00);
lcd_wr_data(0x24);
lcd_wr_data(0x00);
lcd_wr_data(0x24);
lcd_wr_data(0x00);
lcd_wr_data(0x23);
lcd_wr_data(0x00);
lcd_wr_data(0x3C);
lcd_wr_data(0x00);
lcd_wr_data(0x36);
lcd_wr_data(0x00);
lcd_wr_data(0x32);
lcd_wr_data(0x00);
lcd_wr_data(0x2F);
lcd_wr_data(0x00);
lcd_wr_data(0x2C);
lcd_wr_data(0x00);
lcd_wr_data(0x29);
lcd_wr_data(0x00);
lcd_wr_data(0x26);
lcd_wr_data(0x00);
lcd_wr_data(0x24);
lcd_wr_data(0x00);
lcd_wr_data(0x24);
lcd_wr_data(0x00);
lcd_wr_data(0x23);
lcd_wr_data(0x00);
lcd_wr_regno(0xC4);
lcd_wr_data(0x62);
lcd_wr_data(0x00);
lcd_wr_data(0x05);
lcd_wr_data(0x00);
lcd_wr_data(0x84);
lcd_wr_data(0x00);
lcd_wr_data(0xF0);
lcd_wr_data(0x00);
lcd_wr_data(0x18);
lcd_wr_data(0x00);
lcd_wr_data(0xA4);
lcd_wr_data(0x00);
lcd_wr_data(0x18);
lcd_wr_data(0x00);
lcd_wr_data(0x50);
lcd_wr_data(0x00);
lcd_wr_data(0x0C);
lcd_wr_data(0x00);
lcd_wr_data(0x17);
lcd_wr_data(0x00);
lcd_wr_data(0x95);
lcd_wr_data(0x00);
lcd_wr_data(0xF3);
lcd_wr_data(0x00);
lcd_wr_data(0xE6);
lcd_wr_data(0x00);
lcd_wr_regno(0xC5);
lcd_wr_data(0x32);
lcd_wr_data(0x00);
lcd_wr_data(0x44);
lcd_wr_data(0x00);
lcd_wr_data(0x65);
lcd_wr_data(0x00);
lcd_wr_data(0x76);
lcd_wr_data(0x00);
lcd_wr_data(0x88);
lcd_wr_data(0x00);
lcd_wr_regno(0xC6);
lcd_wr_data(0x20);
lcd_wr_data(0x00);
lcd_wr_data(0x17);
lcd_wr_data(0x00);
lcd_wr_data(0x01);
lcd_wr_data(0x00);
lcd_wr_regno(0xC7);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xC8);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xC9);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xE0);
lcd_wr_data(0x16);
lcd_wr_data(0x00);
lcd_wr_data(0x1C);
lcd_wr_data(0x00);
lcd_wr_data(0x21);
lcd_wr_data(0x00);
lcd_wr_data(0x36);
lcd_wr_data(0x00);
lcd_wr_data(0x46);
lcd_wr_data(0x00);
lcd_wr_data(0x52);
lcd_wr_data(0x00);
lcd_wr_data(0x64);
lcd_wr_data(0x00);
lcd_wr_data(0x7A);
lcd_wr_data(0x00);
lcd_wr_data(0x8B);
lcd_wr_data(0x00);
lcd_wr_data(0x99);
lcd_wr_data(0x00);
lcd_wr_data(0xA8);
lcd_wr_data(0x00);
lcd_wr_data(0xB9);
lcd_wr_data(0x00);
lcd_wr_data(0xC4);
lcd_wr_data(0x00);
lcd_wr_data(0xCA);
lcd_wr_data(0x00);
lcd_wr_data(0xD2);
lcd_wr_data(0x00);
lcd_wr_data(0xD9);
lcd_wr_data(0x00);
lcd_wr_data(0xE0);
lcd_wr_data(0x00);
lcd_wr_data(0xF3);
lcd_wr_data(0x00);
lcd_wr_regno(0xE1);
lcd_wr_data(0x16);
lcd_wr_data(0x00);
lcd_wr_data(0x1C);
lcd_wr_data(0x00);
lcd_wr_data(0x22);
lcd_wr_data(0x00);
lcd_wr_data(0x36);
lcd_wr_data(0x00);
lcd_wr_data(0x45);
lcd_wr_data(0x00);
lcd_wr_data(0x52);
lcd_wr_data(0x00);
lcd_wr_data(0x64);
lcd_wr_data(0x00);
lcd_wr_data(0x7A);
lcd_wr_data(0x00);
lcd_wr_data(0x8B);
lcd_wr_data(0x00);
lcd_wr_data(0x99);
lcd_wr_data(0x00);
lcd_wr_data(0xA8);
lcd_wr_data(0x00);
lcd_wr_data(0xB9);
lcd_wr_data(0x00);
lcd_wr_data(0xC4);
lcd_wr_data(0x00);
lcd_wr_data(0xCA);
lcd_wr_data(0x00);
lcd_wr_data(0xD2);
lcd_wr_data(0x00);
lcd_wr_data(0xD8);
lcd_wr_data(0x00);
lcd_wr_data(0xE0);
lcd_wr_data(0x00);
lcd_wr_data(0xF3);
lcd_wr_data(0x00);
lcd_wr_regno(0xE2);
lcd_wr_data(0x05);
lcd_wr_data(0x00);
lcd_wr_data(0x0B);
lcd_wr_data(0x00);
lcd_wr_data(0x1B);
lcd_wr_data(0x00);
lcd_wr_data(0x34);
lcd_wr_data(0x00);
lcd_wr_data(0x44);
lcd_wr_data(0x00);
lcd_wr_data(0x4F);
lcd_wr_data(0x00);
lcd_wr_data(0x61);
lcd_wr_data(0x00);
lcd_wr_data(0x79);
lcd_wr_data(0x00);
lcd_wr_data(0x88);
lcd_wr_data(0x00);
lcd_wr_data(0x97);
lcd_wr_data(0x00);
lcd_wr_data(0xA6);
lcd_wr_data(0x00);
lcd_wr_data(0xB7);
lcd_wr_data(0x00);
lcd_wr_data(0xC2);
lcd_wr_data(0x00);
lcd_wr_data(0xC7);
lcd_wr_data(0x00);
lcd_wr_data(0xD1);
lcd_wr_data(0x00);
lcd_wr_data(0xD6);
lcd_wr_data(0x00);
lcd_wr_data(0xDD);
lcd_wr_data(0x00);
lcd_wr_data(0xF3);
lcd_wr_data(0x00);
lcd_wr_regno(0xE3);
lcd_wr_data(0x05);
lcd_wr_data(0x00);
lcd_wr_data(0xA);
lcd_wr_data(0x00);
lcd_wr_data(0x1C);
lcd_wr_data(0x00);
lcd_wr_data(0x33);
lcd_wr_data(0x00);
lcd_wr_data(0x44);
lcd_wr_data(0x00);
lcd_wr_data(0x50);
lcd_wr_data(0x00);
lcd_wr_data(0x62);
lcd_wr_data(0x00);
lcd_wr_data(0x78);
lcd_wr_data(0x00);
lcd_wr_data(0x88);
lcd_wr_data(0x00);
lcd_wr_data(0x97);
lcd_wr_data(0x00);
lcd_wr_data(0xA6);
lcd_wr_data(0x00);
lcd_wr_data(0xB7);
lcd_wr_data(0x00);
lcd_wr_data(0xC2);
lcd_wr_data(0x00);
lcd_wr_data(0xC7);
lcd_wr_data(0x00);
lcd_wr_data(0xD1);
lcd_wr_data(0x00);
lcd_wr_data(0xD5);
lcd_wr_data(0x00);
lcd_wr_data(0xDD);
lcd_wr_data(0x00);
lcd_wr_data(0xF3);
lcd_wr_data(0x00);
lcd_wr_regno(0xE4);
lcd_wr_data(0x01);
lcd_wr_data(0x00);
lcd_wr_data(0x01);
lcd_wr_data(0x00);
lcd_wr_data(0x02);
lcd_wr_data(0x00);
lcd_wr_data(0x2A);
lcd_wr_data(0x00);
lcd_wr_data(0x3C);
lcd_wr_data(0x00);
lcd_wr_data(0x4B);
lcd_wr_data(0x00);
lcd_wr_data(0x5D);
lcd_wr_data(0x00);
lcd_wr_data(0x74);
lcd_wr_data(0x00);
lcd_wr_data(0x84);
lcd_wr_data(0x00);
lcd_wr_data(0x93);
lcd_wr_data(0x00);
lcd_wr_data(0xA2);
lcd_wr_data(0x00);
lcd_wr_data(0xB3);
lcd_wr_data(0x00);
lcd_wr_data(0xBE);
lcd_wr_data(0x00);
lcd_wr_data(0xC4);
lcd_wr_data(0x00);
lcd_wr_data(0xCD);
lcd_wr_data(0x00);
lcd_wr_data(0xD3);
lcd_wr_data(0x00);
lcd_wr_data(0xDD);
lcd_wr_data(0x00);
lcd_wr_data(0xF3);
lcd_wr_data(0x00);
lcd_wr_regno(0xE5);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x02);
lcd_wr_data(0x00);
lcd_wr_data(0x29);
lcd_wr_data(0x00);
lcd_wr_data(0x3C);
lcd_wr_data(0x00);
lcd_wr_data(0x4B);
lcd_wr_data(0x00);
lcd_wr_data(0x5D);
lcd_wr_data(0x00);
lcd_wr_data(0x74);
lcd_wr_data(0x00);
lcd_wr_data(0x84);
lcd_wr_data(0x00);
lcd_wr_data(0x93);
lcd_wr_data(0x00);
lcd_wr_data(0xA2);
lcd_wr_data(0x00);
lcd_wr_data(0xB3);
lcd_wr_data(0x00);
lcd_wr_data(0xBE);
lcd_wr_data(0x00);
lcd_wr_data(0xC4);
lcd_wr_data(0x00);
lcd_wr_data(0xCD);
lcd_wr_data(0x00);
lcd_wr_data(0xD3);
lcd_wr_data(0x00);
lcd_wr_data(0xDC);
lcd_wr_data(0x00);
lcd_wr_data(0xF3);
lcd_wr_data(0x00);
lcd_wr_regno(0xE6);
lcd_wr_data(0x11);
lcd_wr_data(0x00);
lcd_wr_data(0x34);
lcd_wr_data(0x00);
lcd_wr_data(0x56);
lcd_wr_data(0x00);
lcd_wr_data(0x76);
lcd_wr_data(0x00);
lcd_wr_data(0x77);
lcd_wr_data(0x00);
lcd_wr_data(0x66);
lcd_wr_data(0x00);
lcd_wr_data(0x88);
lcd_wr_data(0x00);
lcd_wr_data(0x99);
lcd_wr_data(0x00);
lcd_wr_data(0xBB);
lcd_wr_data(0x00);
lcd_wr_data(0x99);
lcd_wr_data(0x00);
lcd_wr_data(0x66);
lcd_wr_data(0x00);
lcd_wr_data(0x55);
lcd_wr_data(0x00);
lcd_wr_data(0x55);
lcd_wr_data(0x00);
lcd_wr_data(0x45);
lcd_wr_data(0x00);
lcd_wr_data(0x43);
lcd_wr_data(0x00);
lcd_wr_data(0x44);
lcd_wr_data(0x00);
lcd_wr_regno(0xE7);
lcd_wr_data(0x32);
lcd_wr_data(0x00);
lcd_wr_data(0x55);
lcd_wr_data(0x00);
lcd_wr_data(0x76);
lcd_wr_data(0x00);
lcd_wr_data(0x66);
lcd_wr_data(0x00);
lcd_wr_data(0x67);
lcd_wr_data(0x00);
lcd_wr_data(0x67);
lcd_wr_data(0x00);
lcd_wr_data(0x87);
lcd_wr_data(0x00);
lcd_wr_data(0x99);
lcd_wr_data(0x00);
lcd_wr_data(0xBB);
lcd_wr_data(0x00);
lcd_wr_data(0x99);
lcd_wr_data(0x00);
lcd_wr_data(0x77);
lcd_wr_data(0x00);
lcd_wr_data(0x44);
lcd_wr_data(0x00);
lcd_wr_data(0x56);
lcd_wr_data(0x00);
lcd_wr_data(0x23);
lcd_wr_data(0x00);
lcd_wr_data(0x33);
lcd_wr_data(0x00);
lcd_wr_data(0x45);
lcd_wr_data(0x00);
lcd_wr_regno(0xE8);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x99);
lcd_wr_data(0x00);
lcd_wr_data(0x87);
lcd_wr_data(0x00);
lcd_wr_data(0x88);
lcd_wr_data(0x00);
lcd_wr_data(0x77);
lcd_wr_data(0x00);
lcd_wr_data(0x66);
lcd_wr_data(0x00);
lcd_wr_data(0x88);
lcd_wr_data(0x00);
lcd_wr_data(0xAA);
lcd_wr_data(0x00);
lcd_wr_data(0xBB);
lcd_wr_data(0x00);
lcd_wr_data(0x99);
lcd_wr_data(0x00);
lcd_wr_data(0x66);
lcd_wr_data(0x00);
lcd_wr_data(0x55);
lcd_wr_data(0x00);
lcd_wr_data(0x55);
lcd_wr_data(0x00);
lcd_wr_data(0x44);
lcd_wr_data(0x00);
lcd_wr_data(0x44);
lcd_wr_data(0x00);
lcd_wr_data(0x55);
lcd_wr_data(0x00);
lcd_wr_regno(0xE9);
lcd_wr_data(0xAA);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0x00);
lcd_wr_data(0xAA);
lcd_wr_regno(0xCF);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xF0);
lcd_wr_data(0x00);
lcd_wr_data(0x50);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xF3);
lcd_wr_data(0x00);
lcd_wr_regno(0xF9);
lcd_wr_data(0x06);
lcd_wr_data(0x10);
lcd_wr_data(0x29);
lcd_wr_data(0x00);
lcd_wr_regno(0x3A);
lcd_wr_data(0x55); /* 66 */
lcd_wr_regno(0x11);
delay_ms(100);
lcd_wr_regno(0x29);
lcd_wr_regno(0x35);
lcd_wr_data(0x00);
lcd_wr_regno(0x51);
lcd_wr_data(0xFF);
lcd_wr_regno(0x53);
lcd_wr_data(0x2C);
lcd_wr_regno(0x55);
lcd_wr_data(0x82);
lcd_wr_regno(0x2c);
}
/**
* @brief ST7796寄存器初始化代码
* @param 无
* @retval 无
*/
void lcd_ex_st7796_reginit(void)
{
lcd_wr_regno(0x11);
delay_ms(120);
lcd_wr_regno(0x36); /* Memory Data Access Control MY,MX~~ */
lcd_wr_data(0x48);
lcd_wr_regno(0x3A);
lcd_wr_data(0x55);
lcd_wr_regno(0xF0);
lcd_wr_data(0xC3);
lcd_wr_regno(0xF0);
lcd_wr_data(0x96);
lcd_wr_regno(0xB4);
lcd_wr_data(0x01);
lcd_wr_regno(0xB6); /* Display Function Control */
lcd_wr_data(0x0A);
lcd_wr_data(0xA2);
lcd_wr_regno(0xB7);
lcd_wr_data(0xC6);
lcd_wr_regno(0xB9);
lcd_wr_data(0x02);
lcd_wr_data(0xE0);
lcd_wr_regno(0xC0);
lcd_wr_data(0x80);
lcd_wr_data(0x16);
lcd_wr_regno(0xC1);
lcd_wr_data(0x19);
lcd_wr_regno(0xC2);
lcd_wr_data(0xA7);
lcd_wr_regno(0xC5);
lcd_wr_data(0x16);
lcd_wr_regno(0xE8);
lcd_wr_data(0x40);
lcd_wr_data(0x8A);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x29);
lcd_wr_data(0x19);
lcd_wr_data(0xA5);
lcd_wr_data(0x33);
lcd_wr_regno(0xE0);
lcd_wr_data(0xF0);
lcd_wr_data(0x07);
lcd_wr_data(0x0D);
lcd_wr_data(0x04);
lcd_wr_data(0x05);
lcd_wr_data(0x14);
lcd_wr_data(0x36);
lcd_wr_data(0x54);
lcd_wr_data(0x4C);
lcd_wr_data(0x38);
lcd_wr_data(0x13);
lcd_wr_data(0x14);
lcd_wr_data(0x2E);
lcd_wr_data(0x34);
lcd_wr_regno(0xE1);
lcd_wr_data(0xF0);
lcd_wr_data(0x10);
lcd_wr_data(0x14);
lcd_wr_data(0x0E);
lcd_wr_data(0x0C);
lcd_wr_data(0x08);
lcd_wr_data(0x35);
lcd_wr_data(0x44);
lcd_wr_data(0x4C);
lcd_wr_data(0x26);
lcd_wr_data(0x10);
lcd_wr_data(0x12);
lcd_wr_data(0x2C);
lcd_wr_data(0x32);
lcd_wr_regno(0xF0);
lcd_wr_data(0x3C);
lcd_wr_regno(0xF0);
lcd_wr_data(0x69);
delay_ms(120);
lcd_wr_regno(0x21);
lcd_wr_regno(0x29);
}
/**
* @brief NT35510寄存器初始化代码
* @param 无
* @retval 无
*/
void lcd_ex_nt35510_reginit(void)
{
lcd_write_reg(0xF000, 0x55);
lcd_write_reg(0xF001, 0xAA);
lcd_write_reg(0xF002, 0x52);
lcd_write_reg(0xF003, 0x08);
lcd_write_reg(0xF004, 0x01);
/* AVDD Set AVDD 5.2V */
lcd_write_reg(0xB000, 0x0D);
lcd_write_reg(0xB001, 0x0D);
lcd_write_reg(0xB002, 0x0D);
/* AVDD ratio */
lcd_write_reg(0xB600, 0x34);
lcd_write_reg(0xB601, 0x34);
lcd_write_reg(0xB602, 0x34);
/* AVEE -5.2V */
lcd_write_reg(0xB100, 0x0D);
lcd_write_reg(0xB101, 0x0D);
lcd_write_reg(0xB102, 0x0D);
/* AVEE ratio */
lcd_write_reg(0xB700, 0x34);
lcd_write_reg(0xB701, 0x34);
lcd_write_reg(0xB702, 0x34);
/* VCL -2.5V */
lcd_write_reg(0xB200, 0x00);
lcd_write_reg(0xB201, 0x00);
lcd_write_reg(0xB202, 0x00);
/* VCL ratio */
lcd_write_reg(0xB800, 0x24);
lcd_write_reg(0xB801, 0x24);
lcd_write_reg(0xB802, 0x24);
/* VGH 15V (Free pump) */
lcd_write_reg(0xBF00, 0x01);
lcd_write_reg(0xB300, 0x0F);
lcd_write_reg(0xB301, 0x0F);
lcd_write_reg(0xB302, 0x0F);
/* VGH ratio */
lcd_write_reg(0xB900, 0x34);
lcd_write_reg(0xB901, 0x34);
lcd_write_reg(0xB902, 0x34);
/* VGL_REG -10V */
lcd_write_reg(0xB500, 0x08);
lcd_write_reg(0xB501, 0x08);
lcd_write_reg(0xB502, 0x08);
lcd_write_reg(0xC200, 0x03);
/* VGLX ratio */
lcd_write_reg(0xBA00, 0x24);
lcd_write_reg(0xBA01, 0x24);
lcd_write_reg(0xBA02, 0x24);
/* VGMP/VGSP 4.5V/0V */
lcd_write_reg(0xBC00, 0x00);
lcd_write_reg(0xBC01, 0x78);
lcd_write_reg(0xBC02, 0x00);
/* VGMN/VGSN -4.5V/0V */
lcd_write_reg(0xBD00, 0x00);
lcd_write_reg(0xBD01, 0x78);
lcd_write_reg(0xBD02, 0x00);
/* VCOM */
lcd_write_reg(0xBE00, 0x00);
lcd_write_reg(0xBE01, 0x64);
/* Gamma Setting */
lcd_write_reg(0xD100, 0x00);
lcd_write_reg(0xD101, 0x33);
lcd_write_reg(0xD102, 0x00);
lcd_write_reg(0xD103, 0x34);
lcd_write_reg(0xD104, 0x00);
lcd_write_reg(0xD105, 0x3A);
lcd_write_reg(0xD106, 0x00);
lcd_write_reg(0xD107, 0x4A);
lcd_write_reg(0xD108, 0x00);
lcd_write_reg(0xD109, 0x5C);
lcd_write_reg(0xD10A, 0x00);
lcd_write_reg(0xD10B, 0x81);
lcd_write_reg(0xD10C, 0x00);
lcd_write_reg(0xD10D, 0xA6);
lcd_write_reg(0xD10E, 0x00);
lcd_write_reg(0xD10F, 0xE5);
lcd_write_reg(0xD110, 0x01);
lcd_write_reg(0xD111, 0x13);
lcd_write_reg(0xD112, 0x01);
lcd_write_reg(0xD113, 0x54);
lcd_write_reg(0xD114, 0x01);
lcd_write_reg(0xD115, 0x82);
lcd_write_reg(0xD116, 0x01);
lcd_write_reg(0xD117, 0xCA);
lcd_write_reg(0xD118, 0x02);
lcd_write_reg(0xD119, 0x00);
lcd_write_reg(0xD11A, 0x02);
lcd_write_reg(0xD11B, 0x01);
lcd_write_reg(0xD11C, 0x02);
lcd_write_reg(0xD11D, 0x34);
lcd_write_reg(0xD11E, 0x02);
lcd_write_reg(0xD11F, 0x67);
lcd_write_reg(0xD120, 0x02);
lcd_write_reg(0xD121, 0x84);
lcd_write_reg(0xD122, 0x02);
lcd_write_reg(0xD123, 0xA4);
lcd_write_reg(0xD124, 0x02);
lcd_write_reg(0xD125, 0xB7);
lcd_write_reg(0xD126, 0x02);
lcd_write_reg(0xD127, 0xCF);
lcd_write_reg(0xD128, 0x02);
lcd_write_reg(0xD129, 0xDE);
lcd_write_reg(0xD12A, 0x02);
lcd_write_reg(0xD12B, 0xF2);
lcd_write_reg(0xD12C, 0x02);
lcd_write_reg(0xD12D, 0xFE);
lcd_write_reg(0xD12E, 0x03);
lcd_write_reg(0xD12F, 0x10);
lcd_write_reg(0xD130, 0x03);
lcd_write_reg(0xD131, 0x33);
lcd_write_reg(0xD132, 0x03);
lcd_write_reg(0xD133, 0x6D);
lcd_write_reg(0xD200, 0x00);
lcd_write_reg(0xD201, 0x33);
lcd_write_reg(0xD202, 0x00);
lcd_write_reg(0xD203, 0x34);
lcd_write_reg(0xD204, 0x00);
lcd_write_reg(0xD205, 0x3A);
lcd_write_reg(0xD206, 0x00);
lcd_write_reg(0xD207, 0x4A);
lcd_write_reg(0xD208, 0x00);
lcd_write_reg(0xD209, 0x5C);
lcd_write_reg(0xD20A, 0x00);
lcd_write_reg(0xD20B, 0x81);
lcd_write_reg(0xD20C, 0x00);
lcd_write_reg(0xD20D, 0xA6);
lcd_write_reg(0xD20E, 0x00);
lcd_write_reg(0xD20F, 0xE5);
lcd_write_reg(0xD210, 0x01);
lcd_write_reg(0xD211, 0x13);
lcd_write_reg(0xD212, 0x01);
lcd_write_reg(0xD213, 0x54);
lcd_write_reg(0xD214, 0x01);
lcd_write_reg(0xD215, 0x82);
lcd_write_reg(0xD216, 0x01);
lcd_write_reg(0xD217, 0xCA);
lcd_write_reg(0xD218, 0x02);
lcd_write_reg(0xD219, 0x00);
lcd_write_reg(0xD21A, 0x02);
lcd_write_reg(0xD21B, 0x01);
lcd_write_reg(0xD21C, 0x02);
lcd_write_reg(0xD21D, 0x34);
lcd_write_reg(0xD21E, 0x02);
lcd_write_reg(0xD21F, 0x67);
lcd_write_reg(0xD220, 0x02);
lcd_write_reg(0xD221, 0x84);
lcd_write_reg(0xD222, 0x02);
lcd_write_reg(0xD223, 0xA4);
lcd_write_reg(0xD224, 0x02);
lcd_write_reg(0xD225, 0xB7);
lcd_write_reg(0xD226, 0x02);
lcd_write_reg(0xD227, 0xCF);
lcd_write_reg(0xD228, 0x02);
lcd_write_reg(0xD229, 0xDE);
lcd_write_reg(0xD22A, 0x02);
lcd_write_reg(0xD22B, 0xF2);
lcd_write_reg(0xD22C, 0x02);
lcd_write_reg(0xD22D, 0xFE);
lcd_write_reg(0xD22E, 0x03);
lcd_write_reg(0xD22F, 0x10);
lcd_write_reg(0xD230, 0x03);
lcd_write_reg(0xD231, 0x33);
lcd_write_reg(0xD232, 0x03);
lcd_write_reg(0xD233, 0x6D);
lcd_write_reg(0xD300, 0x00);
lcd_write_reg(0xD301, 0x33);
lcd_write_reg(0xD302, 0x00);
lcd_write_reg(0xD303, 0x34);
lcd_write_reg(0xD304, 0x00);
lcd_write_reg(0xD305, 0x3A);
lcd_write_reg(0xD306, 0x00);
lcd_write_reg(0xD307, 0x4A);
lcd_write_reg(0xD308, 0x00);
lcd_write_reg(0xD309, 0x5C);
lcd_write_reg(0xD30A, 0x00);
lcd_write_reg(0xD30B, 0x81);
lcd_write_reg(0xD30C, 0x00);
lcd_write_reg(0xD30D, 0xA6);
lcd_write_reg(0xD30E, 0x00);
lcd_write_reg(0xD30F, 0xE5);
lcd_write_reg(0xD310, 0x01);
lcd_write_reg(0xD311, 0x13);
lcd_write_reg(0xD312, 0x01);
lcd_write_reg(0xD313, 0x54);
lcd_write_reg(0xD314, 0x01);
lcd_write_reg(0xD315, 0x82);
lcd_write_reg(0xD316, 0x01);
lcd_write_reg(0xD317, 0xCA);
lcd_write_reg(0xD318, 0x02);
lcd_write_reg(0xD319, 0x00);
lcd_write_reg(0xD31A, 0x02);
lcd_write_reg(0xD31B, 0x01);
lcd_write_reg(0xD31C, 0x02);
lcd_write_reg(0xD31D, 0x34);
lcd_write_reg(0xD31E, 0x02);
lcd_write_reg(0xD31F, 0x67);
lcd_write_reg(0xD320, 0x02);
lcd_write_reg(0xD321, 0x84);
lcd_write_reg(0xD322, 0x02);
lcd_write_reg(0xD323, 0xA4);
lcd_write_reg(0xD324, 0x02);
lcd_write_reg(0xD325, 0xB7);
lcd_write_reg(0xD326, 0x02);
lcd_write_reg(0xD327, 0xCF);
lcd_write_reg(0xD328, 0x02);
lcd_write_reg(0xD329, 0xDE);
lcd_write_reg(0xD32A, 0x02);
lcd_write_reg(0xD32B, 0xF2);
lcd_write_reg(0xD32C, 0x02);
lcd_write_reg(0xD32D, 0xFE);
lcd_write_reg(0xD32E, 0x03);
lcd_write_reg(0xD32F, 0x10);
lcd_write_reg(0xD330, 0x03);
lcd_write_reg(0xD331, 0x33);
lcd_write_reg(0xD332, 0x03);
lcd_write_reg(0xD333, 0x6D);
lcd_write_reg(0xD400, 0x00);
lcd_write_reg(0xD401, 0x33);
lcd_write_reg(0xD402, 0x00);
lcd_write_reg(0xD403, 0x34);
lcd_write_reg(0xD404, 0x00);
lcd_write_reg(0xD405, 0x3A);
lcd_write_reg(0xD406, 0x00);
lcd_write_reg(0xD407, 0x4A);
lcd_write_reg(0xD408, 0x00);
lcd_write_reg(0xD409, 0x5C);
lcd_write_reg(0xD40A, 0x00);
lcd_write_reg(0xD40B, 0x81);
lcd_write_reg(0xD40C, 0x00);
lcd_write_reg(0xD40D, 0xA6);
lcd_write_reg(0xD40E, 0x00);
lcd_write_reg(0xD40F, 0xE5);
lcd_write_reg(0xD410, 0x01);
lcd_write_reg(0xD411, 0x13);
lcd_write_reg(0xD412, 0x01);
lcd_write_reg(0xD413, 0x54);
lcd_write_reg(0xD414, 0x01);
lcd_write_reg(0xD415, 0x82);
lcd_write_reg(0xD416, 0x01);
lcd_write_reg(0xD417, 0xCA);
lcd_write_reg(0xD418, 0x02);
lcd_write_reg(0xD419, 0x00);
lcd_write_reg(0xD41A, 0x02);
lcd_write_reg(0xD41B, 0x01);
lcd_write_reg(0xD41C, 0x02);
lcd_write_reg(0xD41D, 0x34);
lcd_write_reg(0xD41E, 0x02);
lcd_write_reg(0xD41F, 0x67);
lcd_write_reg(0xD420, 0x02);
lcd_write_reg(0xD421, 0x84);
lcd_write_reg(0xD422, 0x02);
lcd_write_reg(0xD423, 0xA4);
lcd_write_reg(0xD424, 0x02);
lcd_write_reg(0xD425, 0xB7);
lcd_write_reg(0xD426, 0x02);
lcd_write_reg(0xD427, 0xCF);
lcd_write_reg(0xD428, 0x02);
lcd_write_reg(0xD429, 0xDE);
lcd_write_reg(0xD42A, 0x02);
lcd_write_reg(0xD42B, 0xF2);
lcd_write_reg(0xD42C, 0x02);
lcd_write_reg(0xD42D, 0xFE);
lcd_write_reg(0xD42E, 0x03);
lcd_write_reg(0xD42F, 0x10);
lcd_write_reg(0xD430, 0x03);
lcd_write_reg(0xD431, 0x33);
lcd_write_reg(0xD432, 0x03);
lcd_write_reg(0xD433, 0x6D);
lcd_write_reg(0xD500, 0x00);
lcd_write_reg(0xD501, 0x33);
lcd_write_reg(0xD502, 0x00);
lcd_write_reg(0xD503, 0x34);
lcd_write_reg(0xD504, 0x00);
lcd_write_reg(0xD505, 0x3A);
lcd_write_reg(0xD506, 0x00);
lcd_write_reg(0xD507, 0x4A);
lcd_write_reg(0xD508, 0x00);
lcd_write_reg(0xD509, 0x5C);
lcd_write_reg(0xD50A, 0x00);
lcd_write_reg(0xD50B, 0x81);
lcd_write_reg(0xD50C, 0x00);
lcd_write_reg(0xD50D, 0xA6);
lcd_write_reg(0xD50E, 0x00);
lcd_write_reg(0xD50F, 0xE5);
lcd_write_reg(0xD510, 0x01);
lcd_write_reg(0xD511, 0x13);
lcd_write_reg(0xD512, 0x01);
lcd_write_reg(0xD513, 0x54);
lcd_write_reg(0xD514, 0x01);
lcd_write_reg(0xD515, 0x82);
lcd_write_reg(0xD516, 0x01);
lcd_write_reg(0xD517, 0xCA);
lcd_write_reg(0xD518, 0x02);
lcd_write_reg(0xD519, 0x00);
lcd_write_reg(0xD51A, 0x02);
lcd_write_reg(0xD51B, 0x01);
lcd_write_reg(0xD51C, 0x02);
lcd_write_reg(0xD51D, 0x34);
lcd_write_reg(0xD51E, 0x02);
lcd_write_reg(0xD51F, 0x67);
lcd_write_reg(0xD520, 0x02);
lcd_write_reg(0xD521, 0x84);
lcd_write_reg(0xD522, 0x02);
lcd_write_reg(0xD523, 0xA4);
lcd_write_reg(0xD524, 0x02);
lcd_write_reg(0xD525, 0xB7);
lcd_write_reg(0xD526, 0x02);
lcd_write_reg(0xD527, 0xCF);
lcd_write_reg(0xD528, 0x02);
lcd_write_reg(0xD529, 0xDE);
lcd_write_reg(0xD52A, 0x02);
lcd_write_reg(0xD52B, 0xF2);
lcd_write_reg(0xD52C, 0x02);
lcd_write_reg(0xD52D, 0xFE);
lcd_write_reg(0xD52E, 0x03);
lcd_write_reg(0xD52F, 0x10);
lcd_write_reg(0xD530, 0x03);
lcd_write_reg(0xD531, 0x33);
lcd_write_reg(0xD532, 0x03);
lcd_write_reg(0xD533, 0x6D);
lcd_write_reg(0xD600, 0x00);
lcd_write_reg(0xD601, 0x33);
lcd_write_reg(0xD602, 0x00);
lcd_write_reg(0xD603, 0x34);
lcd_write_reg(0xD604, 0x00);
lcd_write_reg(0xD605, 0x3A);
lcd_write_reg(0xD606, 0x00);
lcd_write_reg(0xD607, 0x4A);
lcd_write_reg(0xD608, 0x00);
lcd_write_reg(0xD609, 0x5C);
lcd_write_reg(0xD60A, 0x00);
lcd_write_reg(0xD60B, 0x81);
lcd_write_reg(0xD60C, 0x00);
lcd_write_reg(0xD60D, 0xA6);
lcd_write_reg(0xD60E, 0x00);
lcd_write_reg(0xD60F, 0xE5);
lcd_write_reg(0xD610, 0x01);
lcd_write_reg(0xD611, 0x13);
lcd_write_reg(0xD612, 0x01);
lcd_write_reg(0xD613, 0x54);
lcd_write_reg(0xD614, 0x01);
lcd_write_reg(0xD615, 0x82);
lcd_write_reg(0xD616, 0x01);
lcd_write_reg(0xD617, 0xCA);
lcd_write_reg(0xD618, 0x02);
lcd_write_reg(0xD619, 0x00);
lcd_write_reg(0xD61A, 0x02);
lcd_write_reg(0xD61B, 0x01);
lcd_write_reg(0xD61C, 0x02);
lcd_write_reg(0xD61D, 0x34);
lcd_write_reg(0xD61E, 0x02);
lcd_write_reg(0xD61F, 0x67);
lcd_write_reg(0xD620, 0x02);
lcd_write_reg(0xD621, 0x84);
lcd_write_reg(0xD622, 0x02);
lcd_write_reg(0xD623, 0xA4);
lcd_write_reg(0xD624, 0x02);
lcd_write_reg(0xD625, 0xB7);
lcd_write_reg(0xD626, 0x02);
lcd_write_reg(0xD627, 0xCF);
lcd_write_reg(0xD628, 0x02);
lcd_write_reg(0xD629, 0xDE);
lcd_write_reg(0xD62A, 0x02);
lcd_write_reg(0xD62B, 0xF2);
lcd_write_reg(0xD62C, 0x02);
lcd_write_reg(0xD62D, 0xFE);
lcd_write_reg(0xD62E, 0x03);
lcd_write_reg(0xD62F, 0x10);
lcd_write_reg(0xD630, 0x03);
lcd_write_reg(0xD631, 0x33);
lcd_write_reg(0xD632, 0x03);
lcd_write_reg(0xD633, 0x6D);
/* LV2 Page 0 enable */
lcd_write_reg(0xF000, 0x55);
lcd_write_reg(0xF001, 0xAA);
lcd_write_reg(0xF002, 0x52);
lcd_write_reg(0xF003, 0x08);
lcd_write_reg(0xF004, 0x00);
/* Display control */
lcd_write_reg(0xB100, 0xCC);
lcd_write_reg(0xB101, 0x00);
/* Source hold time */
lcd_write_reg(0xB600, 0x05);
/* Gate EQ control */
lcd_write_reg(0xB700, 0x70);
lcd_write_reg(0xB701, 0x70);
/* Source EQ control (Mode 2) */
lcd_write_reg(0xB800, 0x01);
lcd_write_reg(0xB801, 0x03);
lcd_write_reg(0xB802, 0x03);
lcd_write_reg(0xB803, 0x03);
/* Inversion mode (2-dot) */
lcd_write_reg(0xBC00, 0x02);
lcd_write_reg(0xBC01, 0x00);
lcd_write_reg(0xBC02, 0x00);
/* Timing control 4H w/ 4-delay */
lcd_write_reg(0xC900, 0xD0);
lcd_write_reg(0xC901, 0x02);
lcd_write_reg(0xC902, 0x50);
lcd_write_reg(0xC903, 0x50);
lcd_write_reg(0xC904, 0x50);
lcd_write_reg(0x3500, 0x00);
lcd_write_reg(0x3A00, 0x55); /* 16-bit/pixel */
lcd_wr_regno(0x1100);
delay_ms(1);
lcd_wr_regno(0x2900);
}
/**
* @brief ILI9806寄存器初始化代码
* @param 无
* @retval 无
*/
void lcd_ex_ili9806_reginit(void)
{
lcd_wr_regno(0xFF); /* EXTC Command Set enable register */
lcd_wr_data(0xFF);
lcd_wr_data(0x98);
lcd_wr_data(0x06);
lcd_wr_regno(0xBC); /* GIP 1 */
lcd_wr_data(0x01);
lcd_wr_data(0x0F);
lcd_wr_data(0x61);
lcd_wr_data(0xFF);
lcd_wr_data(0x01);
lcd_wr_data(0x01);
lcd_wr_data(0x0B);
lcd_wr_data(0x10);
lcd_wr_data(0x37);
lcd_wr_data(0x63);
lcd_wr_data(0xFF);
lcd_wr_data(0xFF);
lcd_wr_data(0x01);
lcd_wr_data(0x01);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0xFF);
lcd_wr_data(0x52);
lcd_wr_data(0x01);
lcd_wr_data(0x00);
lcd_wr_data(0x40);
lcd_wr_regno(0xBD); /* GIP 2 */
lcd_wr_data(0x01);
lcd_wr_data(0x23);
lcd_wr_data(0x45);
lcd_wr_data(0x67);
lcd_wr_data(0x01);
lcd_wr_data(0x23);
lcd_wr_data(0x45);
lcd_wr_data(0x67);
lcd_wr_regno(0xBE); /* GIP 3 */
lcd_wr_data(0x00);
lcd_wr_data(0x01);
lcd_wr_data(0xAB);
lcd_wr_data(0x60);
lcd_wr_data(0x22);
lcd_wr_data(0x22);
lcd_wr_data(0x22);
lcd_wr_data(0x22);
lcd_wr_data(0x22);
lcd_wr_regno(0xC7); /* VCOM Control */
lcd_wr_data(0x36);
lcd_wr_regno(0xED); /* EN_volt_reg VGMP / VGMN /VGSP / VGSN voltage to output */
lcd_wr_data(0x7F);
lcd_wr_data(0x0F);
lcd_wr_regno(0XC0); /* Power Control 1 Setting AVDD / AVEE / VGH / VGL */
lcd_wr_data(0x0F);
lcd_wr_data(0x0B);
lcd_wr_data(0x0A); /* VGH 15V,VGLO-10V */
lcd_wr_regno(0XFC); /* AVDD / AVEE generated by internal pumping. */
lcd_wr_data(0x08);
lcd_wr_regno(0XDF);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x20);
lcd_wr_regno(0XF3); /* DVDD Voltage Setting */
lcd_wr_data(0x74);
lcd_wr_regno(0xB4); /* Inversion Type */
lcd_wr_data(0x00); /* 02 */
lcd_wr_data(0x00); /* 02 */
lcd_wr_data(0x00); /* 02 */
lcd_wr_regno(0xF7); /* Resolution Control */
lcd_wr_data(0x82); /* 480*800 */
lcd_wr_regno(0xB1); /* FRAME RATE Setting */
lcd_wr_data(0x00);
lcd_wr_data(0x13);
lcd_wr_data(0x13);
lcd_wr_regno(0XF2); /* CR_EQ_PC_SDT #C0,06,40,28 */
lcd_wr_data(0x80);
lcd_wr_data(0x04);
lcd_wr_data(0x40);
lcd_wr_data(0x28);
lcd_wr_regno(0XC1); /* Power Control 2 SD OP Bias_VRH1_VRH2_EXT_CPCK_SEL */
lcd_wr_data(0x17);
lcd_wr_data(0x88); /* VGMP */
lcd_wr_data(0x88); /* VGMN */
lcd_wr_data(0x20);
lcd_wr_regno(0xE0); /* Positive Gamma Control */
lcd_wr_data(0x00); /* P1 */
lcd_wr_data(0x0A); /* P2 */
lcd_wr_data(0x12); /* P3 */
lcd_wr_data(0x10); /* P4 */
lcd_wr_data(0x0E); /* P5 */
lcd_wr_data(0x20); /* P6 */
lcd_wr_data(0xCC); /* P7 */
lcd_wr_data(0x07); /* P8 */
lcd_wr_data(0x06); /* P9 */
lcd_wr_data(0x0B); /* P10 */
lcd_wr_data(0x0E); /* P11 */
lcd_wr_data(0x0F); /* P12 */
lcd_wr_data(0x0D); /* P13 */
lcd_wr_data(0x15); /* P14 */
lcd_wr_data(0x10); /* P15 */
lcd_wr_data(0x00); /* P16 */
lcd_wr_regno(0xE1); /* Negative Gamma Correction */
lcd_wr_data(0x00); /* P1 */
lcd_wr_data(0x0B); /* P2 */
lcd_wr_data(0x13); /* P3 */
lcd_wr_data(0x0D); /* P4 */
lcd_wr_data(0x0E); /* P5 */
lcd_wr_data(0x1B); /* P6 */
lcd_wr_data(0x71); /* P7 */
lcd_wr_data(0x06); /* P8 */
lcd_wr_data(0x06); /* P9 */
lcd_wr_data(0x0A); /* P10 */
lcd_wr_data(0x0F); /* P11 */
lcd_wr_data(0x0E); /* P12 */
lcd_wr_data(0x0F); /* P13 */
lcd_wr_data(0x15); /* P14 */
lcd_wr_data(0x0C); /* P15 */
lcd_wr_data(0x00); /* P16 */
lcd_wr_regno(0x2a);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x01);
lcd_wr_data(0xdf);
lcd_wr_regno(0x2b);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x03);
lcd_wr_data(0x1f);
lcd_wr_regno(0x3A); /* Pixel Format */
lcd_wr_data(0x55);
lcd_wr_regno(0x36); /* Memory Access Control */
lcd_wr_data(0x00); /* 02-180 */
lcd_wr_regno(0x11);
delay_ms(120);
lcd_wr_regno(0x29);
delay_ms(20);
lcd_wr_regno(0x2C);
}
/**
* @brief SSD1963寄存器初始化代码
* @param 无
* @retval 无
*/
void lcd_ex_ssd1963_reginit(void)
{
lcd_wr_regno(0xE2); /* Set PLL with OSC = 10MHz (hardware), Multiplier N = 35, 250MHz < VCO < 800MHz = OSC*(N+1), VCO = 300MHz */
lcd_wr_data(0x1D); /* 参数1 */
lcd_wr_data(0x02); /* 参数2 Divider M = 2, PLL = 300/(M+1) = 100MHz */
lcd_wr_data(0x04); /* 参数3 Validate M and N values */
delay_ms(1);
lcd_wr_regno(0xE0); /* Start PLL command */
lcd_wr_data(0x01); /* enable PLL */
delay_ms(10);
lcd_wr_regno(0xE0); /* Start PLL command again */
lcd_wr_data(0x03); /* now, use PLL output as system clock */
delay_ms(12);
lcd_wr_regno(0x01); /* 软复位 */
delay_ms(10);
lcd_wr_regno(0xE6); /* 设置像素频率,33Mhz */
lcd_wr_data(0x2F);
lcd_wr_data(0xFF);
lcd_wr_data(0xFF);
lcd_wr_regno(0xB0); /* 设置LCD模式 */
lcd_wr_data(0x20); /* 24位模式 */
lcd_wr_data(0x00); /* TFT 模式 */
lcd_wr_data((SSD_HOR_RESOLUTION - 1) >> 8); /* 设置LCD水平像素 */
lcd_wr_data(SSD_HOR_RESOLUTION - 1);
lcd_wr_data((SSD_VER_RESOLUTION - 1) >> 8); /* 设置LCD垂直像素 */
lcd_wr_data(SSD_VER_RESOLUTION - 1);
lcd_wr_data(0x00); /* RGB序列 */
lcd_wr_regno(0xB4); /* Set horizontal period */
lcd_wr_data((SSD_HT - 1) >> 8);
lcd_wr_data(SSD_HT - 1);
lcd_wr_data(SSD_HPS >> 8);
lcd_wr_data(SSD_HPS);
lcd_wr_data(SSD_HOR_PULSE_WIDTH - 1);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xB6); /* Set vertical perio */
lcd_wr_data((SSD_VT - 1) >> 8);
lcd_wr_data(SSD_VT - 1);
lcd_wr_data(SSD_VPS >> 8);
lcd_wr_data(SSD_VPS);
lcd_wr_data(SSD_VER_FRONT_PORCH - 1);
lcd_wr_data(0x00);
lcd_wr_data(0x00);
lcd_wr_regno(0xF0); /* 设置SSD1963与CPU接口为16bit */
lcd_wr_data(0x03); /* 16-bit(565 format) data for 16bpp */
lcd_wr_regno(0x29); /* 开启显示 */
/* 设置PWM输出 背光通过占空比可调 */
lcd_wr_regno(0xD0); /* 设置自动白平衡DBC */
lcd_wr_data(0x00); /* disable */
lcd_wr_regno(0xBE); /* 配置PWM输出 */
lcd_wr_data(0x05); /* 1设置PWM频率 */
lcd_wr_data(0xFE); /* 2设置PWM占空比 */
lcd_wr_data(0x01); /* 3设置C */
lcd_wr_data(0x00); /* 4设置D */
lcd_wr_data(0x00); /* 5设置E */
lcd_wr_data(0x00); /* 6设置F */
lcd_wr_regno(0xB8); /* 设置GPIO配置 */
lcd_wr_data(0x03); /* 2个IO口设置成输出 */
lcd_wr_data(0x01); /* GPIO使用正常的IO功能 */
lcd_wr_regno(0xBA);
lcd_wr_data(0x01); /* GPIO[1:0]=01,控制LCD方向 */
}
lcdfont.h:
/**
****************************************************************************************************
* @file lcdfont.h
* @author 正点原子团队(ALIENTEK)
* @version V1.0
* @date 2021-10-16
* @brief 包含12*12,16*16,24*24,32*32 四种LCD用ASCII字体
* @license Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
****************************************************************************************************
* @attention
*
* 实验平台:正点原子 探索者 F407开发板
* 在线视频:www.yuanzige.com
* 技术论坛:www.openedv.com
* 公司网址:www.alientek.com
* 购买地址:openedv.taobao.com
*
* 修改说明
* V1.0 20211016
* 第一次发布
*
****************************************************************************************************
*/
#ifndef __LCDFONT_H
#define __LCDFONT_H
/* 常用ASCII表
* 偏移量32
* ASCII字符集: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
* PC2LCD2002取模方式设置:阴码+逐列式+顺向+C51格式
* 总共:4个字符集(12*12、16*16、24*24和32*32),用户可以自行新增其他分辨率的字符集。
* 每个字符所占用的字节数为:(size/8+((size%8)?1:0))*(size/2),其中size:是字库生成时的点阵大小(12/16/24/32...)
*/
/* 12*12 ASCII字符集点阵 */
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 ASCII字符集点阵 */
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*/
};
/* 24*24 ASICII字符集点阵 */
const unsigned char asc2_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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x38,0x0F,0xFE,0x38,0x0F,0x80,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x06,0x00,0x00,0x0C,0x00,0x00,0x38,0x00,0x00,0x31,0x00,0x00,0x06,0x00,0x00,0x0C,0x00,0x00,0x38,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x00,0x00,0x00,0x61,0x80,0x00,0x67,0xF8,0x07,0xF9,0x80,0x00,0x61,0x80,0x00,0x61,0x80,0x00,0x61,0x80,0x00,0x61,0x80,0x00,0x67,0xF8,0x07,0xF9,0x80,0x00,0x61,0x80,0x00,0x00,0x00},/*"#",3*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0xE0,0x03,0xE0,0xF0,0x06,0x30,0x08,0x04,0x18,0x08,0x1F,0xFF,0xFE,0x04,0x0E,0x08,0x07,0x87,0xF0,0x03,0x81,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*"$",4*/
{0x01,0xF0,0x00,0x06,0x0C,0x00,0x04,0x04,0x08,0x06,0x0C,0x70,0x01,0xF9,0xC0,0x00,0x0E,0x00,0x00,0x3B,0xE0,0x00,0xEC,0x18,0x07,0x08,0x08,0x04,0x0C,0x18,0x00,0x03,0xE0,0x00,0x00,0x00},/*"%",5*/
{0x00,0x01,0xE0,0x00,0x07,0xF0,0x03,0xF8,0x18,0x04,0x1C,0x08,0x04,0x17,0x08,0x07,0xE1,0xD0,0x03,0xC0,0xE0,0x00,0x23,0xB0,0x00,0x3C,0x08,0x00,0x20,0x08,0x00,0x00,0x10,0x00,0x00,0x00},/*"&",6*/
{0x00,0x00,0x00,0x01,0x00,0x00,0x31,0x00,0x00,0x32,0x00,0x00,0x1C,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x01,0xFF,0xC0,0x07,0x80,0xF0,0x0C,0x00,0x18,0x10,0x00,0x04,0x20,0x00,0x02,0x00,0x00,0x00},/*"(",8*/
{0x00,0x00,0x00,0x20,0x00,0x02,0x10,0x00,0x04,0x0C,0x00,0x18,0x07,0x80,0xF0,0x01,0xFF,0xC0,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*")",9*/
{0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x66,0x00,0x00,0x66,0x00,0x00,0x3C,0x00,0x00,0x18,0x00,0x03,0xFF,0xC0,0x00,0x18,0x00,0x00,0x3C,0x00,0x00,0x66,0x00,0x00,0x66,0x00,0x00,0x42,0x00},/*"*",10*/
{0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x01,0xFF,0xC0,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x31,0x00,0x00,0x32,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
{0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x1C,0x00,0x00,0x70,0x00,0x01,0x80,0x00,0x0E,0x00,0x00,0x38,0x00,0x00,0xC0,0x00,0x07,0x00,0x00,0x1C,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00},/*"/",15*/
{0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x18,0x04,0x00,0x08,0x04,0x00,0x08,0x06,0x00,0x18,0x03,0x80,0x70,0x01,0xFF,0xE0,0x00,0x7F,0x80,0x00,0x00,0x00},/*"0",16*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x08,0x03,0xFF,0xF8,0x07,0xFF,0xF8,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00},/*"1",17*/
{0x00,0x00,0x00,0x01,0xC0,0x38,0x02,0xC0,0x58,0x04,0x00,0x98,0x04,0x01,0x18,0x04,0x02,0x18,0x04,0x04,0x18,0x06,0x1C,0x18,0x03,0xF8,0x18,0x01,0xE0,0xF8,0x00,0x00,0x00,0x00,0x00,0x00},/*"2",18*/
{0x00,0x00,0x00,0x01,0xC0,0xE0,0x03,0xC0,0xF0,0x04,0x00,0x08,0x04,0x08,0x08,0x04,0x08,0x08,0x06,0x18,0x08,0x03,0xF4,0x18,0x01,0xE7,0xF0,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*"3",19*/
{0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x0D,0x00,0x00,0x11,0x00,0x00,0x61,0x00,0x00,0x81,0x08,0x03,0x01,0x08,0x07,0xFF,0xF8,0x0F,0xFF,0xF8,0x00,0x01,0x08,0x00,0x01,0x08,0x00,0x00,0x00},/*"4",20*/
{0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xFC,0xD0,0x06,0x08,0x08,0x06,0x10,0x08,0x06,0x10,0x08,0x06,0x10,0x08,0x06,0x18,0x38,0x06,0x0F,0xF0,0x06,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"5",21*/
{0x00,0x00,0x00,0x00,0x3F,0x80,0x01,0xFF,0xE0,0x03,0x84,0x30,0x02,0x08,0x18,0x04,0x10,0x08,0x04,0x10,0x08,0x04,0x10,0x08,0x07,0x18,0x10,0x03,0x0F,0xF0,0x00,0x07,0xC0,0x00,0x00,0x00},/*"6",22*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x07,0x00,0x00,0x06,0x00,0x00,0x06,0x00,0xF8,0x06,0x07,0xF8,0x06,0x18,0x00,0x06,0xE0,0x00,0x07,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00},/*"7",23*/
{0x00,0x00,0x00,0x01,0xE1,0xE0,0x03,0xF7,0xF0,0x06,0x34,0x10,0x04,0x18,0x08,0x04,0x18,0x08,0x04,0x0C,0x08,0x04,0x0C,0x08,0x06,0x16,0x18,0x03,0xF3,0xF0,0x01,0xC1,0xE0,0x00,0x00,0x00},/*"8",24*/
{0x00,0x00,0x00,0x00,0xF8,0x00,0x03,0xFC,0x30,0x03,0x06,0x38,0x04,0x02,0x08,0x04,0x02,0x08,0x04,0x02,0x08,0x04,0x04,0x10,0x03,0x08,0xF0,0x01,0xFF,0xC0,0x00,0x7F,0x00,0x00,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x38,0x00,0x70,0x38,0x00,0x70,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x1A,0x00,0x30,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x14,0x00,0x00,0x22,0x00,0x00,0x41,0x00,0x00,0x80,0x80,0x01,0x00,0x40,0x02,0x00,0x20,0x04,0x00,0x10,0x08,0x00,0x08,0x00,0x00,0x00},/*"<",28*/
{0x00,0x00,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x21,0x00,0x00,0x00,0x00},/*"=",29*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x04,0x00,0x10,0x02,0x00,0x20,0x01,0x00,0x40,0x00,0x80,0x80,0x00,0x41,0x00,0x00,0x22,0x00,0x00,0x14,0x00,0x00,0x08,0x00,0x00,0x00,0x00},/*">",30*/
{0x00,0x00,0x00,0x03,0xC0,0x00,0x04,0xC0,0x00,0x04,0x00,0x00,0x08,0x00,0x38,0x08,0x0F,0x38,0x08,0x08,0x38,0x08,0x10,0x00,0x0C,0x30,0x00,0x07,0xE0,0x00,0x03,0xC0,0x00,0x00,0x00,0x00},/*"?",31*/
{0x00,0x00,0x00,0x00,0x3F,0x80,0x00,0xFF,0xE0,0x03,0x80,0x70,0x02,0x0F,0x10,0x06,0x70,0x88,0x04,0xC0,0x88,0x04,0x83,0x08,0x04,0x7F,0x88,0x02,0xC0,0x90,0x03,0x01,0x20,0x00,0xFE,0x40},/*"@",32*/
{0x00,0x00,0x08,0x00,0x00,0x18,0x00,0x01,0xF8,0x00,0x3E,0x08,0x01,0xC2,0x00,0x07,0x02,0x00,0x07,0xE2,0x00,0x00,0xFE,0x00,0x00,0x1F,0xC8,0x00,0x01,0xF8,0x00,0x00,0x38,0x00,0x00,0x08},/*"A",33*/
{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x04,0x08,0x08,0x04,0x08,0x08,0x04,0x08,0x08,0x06,0x18,0x08,0x03,0xF4,0x18,0x01,0xE7,0xF0,0x00,0x01,0xE0,0x00,0x00,0x00},/*"B",34*/
{0x00,0x00,0x00,0x00,0x3F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x02,0x00,0x18,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x10,0x06,0x00,0x20,0x07,0x80,0xC0,0x00,0x00,0x00},/*"C",35*/
{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x18,0x02,0x00,0x10,0x03,0x80,0x70,0x01,0xFF,0xE0,0x00,0x7F,0x80,0x00,0x00,0x00},/*"D",36*/
{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x04,0x08,0x08,0x04,0x08,0x08,0x04,0x08,0x08,0x04,0x3E,0x08,0x04,0x00,0x08,0x06,0x00,0x18,0x01,0x00,0x60,0x00,0x00,0x00},/*"E",37*/
{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x04,0x08,0x00,0x04,0x08,0x00,0x04,0x08,0x00,0x04,0x3E,0x00,0x06,0x00,0x00,0x06,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00},/*"F",38*/
{0x00,0x00,0x00,0x00,0x3F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x18,0x04,0x00,0x08,0x04,0x02,0x08,0x04,0x02,0x08,0x02,0x03,0xF0,0x07,0x83,0xF0,0x00,0x02,0x00,0x00,0x02,0x00},/*"G",39*/
{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x04,0x08,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08},/*"H",40*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00},/*"I",41*/
{0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x07,0x00,0x00,0x01,0x04,0x00,0x01,0x04,0x00,0x01,0x04,0x00,0x03,0x07,0xFF,0xFE,0x07,0xFF,0xFC,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00},/*"J",42*/
{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x0C,0x08,0x00,0x18,0x00,0x00,0x3E,0x00,0x04,0xC7,0x80,0x05,0x03,0xC8,0x06,0x00,0xF8,0x04,0x00,0x38,0x04,0x00,0x18,0x00,0x00,0x08},/*"K",43*/
{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x18,0x00,0x00,0x60,0x00,0x00,0x00},/*"L",44*/
{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0x80,0x08,0x07,0xFC,0x00,0x00,0x7F,0xC0,0x00,0x03,0xF8,0x00,0x07,0xC0,0x00,0x78,0x00,0x07,0x80,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08},/*"M",45*/
{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0x00,0x08,0x03,0xC0,0x00,0x00,0xE0,0x00,0x00,0x38,0x00,0x00,0x1E,0x00,0x00,0x07,0x00,0x00,0x01,0xC0,0x04,0x00,0xF0,0x07,0xFF,0xF8,0x04,0x00,0x00},/*"N",46*/
{0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x18,0x04,0x00,0x08,0x04,0x00,0x08,0x06,0x00,0x18,0x03,0x00,0x30,0x01,0xFF,0xE0,0x00,0x7F,0x80,0x00,0x00,0x00},/*"O",47*/
{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x04,0x08,0x04,0x04,0x00,0x04,0x04,0x00,0x04,0x04,0x00,0x04,0x04,0x00,0x06,0x0C,0x00,0x03,0xF8,0x00,0x01,0xF0,0x00,0x00,0x00,0x00},/*"P",48*/
{0x00,0x00,0x00,0x00,0x7F,0x80,0x01,0xFF,0xE0,0x03,0x80,0x70,0x06,0x00,0x88,0x04,0x00,0x88,0x04,0x00,0xC8,0x06,0x00,0x3C,0x03,0x00,0x3E,0x01,0xFF,0xE6,0x00,0x7F,0x84,0x00,0x00,0x00},/*"Q",49*/
{0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x08,0x08,0x04,0x08,0x00,0x04,0x0C,0x00,0x04,0x0F,0x00,0x04,0x0B,0xC0,0x06,0x10,0xF0,0x03,0xF0,0x38,0x01,0xE0,0x08,0x00,0x00,0x08},/*"R",50*/
{0x00,0x00,0x00,0x01,0xE0,0xF8,0x03,0xF0,0x30,0x06,0x30,0x10,0x04,0x18,0x08,0x04,0x18,0x08,0x04,0x0C,0x08,0x04,0x0C,0x08,0x02,0x06,0x18,0x02,0x07,0xF0,0x07,0x81,0xE0,0x00,0x00,0x00},/*"S",51*/
{0x01,0x80,0x00,0x06,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x08,0x07,0xFF,0xF8,0x07,0xFF,0xF8,0x04,0x00,0x08,0x04,0x00,0x00,0x04,0x00,0x00,0x06,0x00,0x00,0x01,0x80,0x00},/*"T",52*/
{0x04,0x00,0x00,0x07,0xFF,0xE0,0x07,0xFF,0xF0,0x04,0x00,0x18,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x04,0x00,0x10,0x07,0xFF,0xE0,0x04,0x00,0x00},/*"U",53*/
{0x04,0x00,0x00,0x06,0x00,0x00,0x07,0xE0,0x00,0x07,0xFE,0x00,0x04,0x1F,0xE0,0x00,0x01,0xF8,0x00,0x00,0x38,0x00,0x01,0xE0,0x04,0x3E,0x00,0x07,0xC0,0x00,0x06,0x00,0x00,0x04,0x00,0x00},/*"V",54*/
{0x04,0x00,0x00,0x07,0xE0,0x00,0x07,0xFF,0xC0,0x04,0x1F,0xF8,0x00,0x07,0xC0,0x07,0xF8,0x00,0x07,0xFF,0x80,0x04,0x3F,0xF8,0x00,0x07,0xC0,0x04,0xF8,0x00,0x07,0x00,0x00,0x04,0x00,0x00},/*"W",55*/
{0x00,0x00,0x00,0x04,0x00,0x08,0x06,0x00,0x18,0x07,0xC0,0x78,0x05,0xF1,0xC8,0x00,0x3E,0x00,0x00,0x1F,0x80,0x04,0x63,0xE8,0x07,0x80,0xF8,0x06,0x00,0x18,0x04,0x00,0x08,0x00,0x00,0x00},/*"X",56*/
{0x04,0x00,0x00,0x06,0x00,0x00,0x07,0x80,0x00,0x07,0xE0,0x08,0x04,0x7C,0x08,0x00,0x1F,0xF8,0x00,0x07,0xF8,0x00,0x18,0x08,0x04,0xE0,0x08,0x07,0x00,0x00,0x06,0x00,0x00,0x04,0x00,0x00},/*"Y",57*/
{0x00,0x00,0x00,0x01,0x00,0x08,0x06,0x00,0x38,0x04,0x00,0xF8,0x04,0x03,0xE8,0x04,0x0F,0x08,0x04,0x7C,0x08,0x05,0xF0,0x08,0x07,0xC0,0x08,0x07,0x00,0x18,0x04,0x00,0x60,0x00,0x00,0x00},/*"Z",58*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xFE,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x00,0x00,0x00},/*"[",59*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x07,0x00,0x00,0x00,0xC0,0x00,0x00,0x38,0x00,0x00,0x06,0x00,0x00,0x01,0xC0,0x00,0x00,0x30,0x00,0x00,0x0E,0x00,0x00,0x01,0x00,0x00,0x00},/*"\",60*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x20,0x00,0x02,0x3F,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"]",61*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x10,0x00,0x00,0x30,0x00,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01},/*"_",63*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x19,0xF8,0x00,0x1B,0x18,0x00,0x22,0x08,0x00,0x26,0x08,0x00,0x24,0x08,0x00,0x24,0x10,0x00,0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x00,0x08,0x00,0x00,0x18},/*"a",65*/
{0x00,0x00,0x00,0x04,0x00,0x00,0x07,0xFF,0xF8,0x0F,0xFF,0xF0,0x00,0x18,0x18,0x00,0x10,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x30,0x18,0x00,0x1F,0xF0,0x00,0x0F,0xC0,0x00,0x00,0x00},/*"b",66*/
{0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1F,0xF0,0x00,0x18,0x30,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x3C,0x08,0x00,0x1C,0x10,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00},/*"c",67*/
{0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1F,0xF0,0x00,0x38,0x18,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x04,0x10,0x10,0x07,0xFF,0xF8,0x0F,0xFF,0xF0,0x00,0x00,0x10,0x00,0x00,0x00},/*"d",68*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1F,0xF0,0x00,0x12,0x30,0x00,0x22,0x18,0x00,0x22,0x08,0x00,0x22,0x08,0x00,0x32,0x08,0x00,0x1E,0x10,0x00,0x0E,0x20,0x00,0x00,0x00},/*"e",69*/
{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x08,0x00,0x20,0x08,0x01,0xFF,0xF8,0x03,0xFF,0xF8,0x06,0x20,0x08,0x04,0x20,0x08,0x04,0x20,0x08,0x07,0x20,0x00,0x03,0x00,0x00,0x00,0x00,0x00},/*"f",70*/
{0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x0E,0x6E,0x00,0x1F,0xF3,0x00,0x31,0xB1,0x00,0x20,0xB1,0x00,0x20,0xB1,0x00,0x31,0x91,0x00,0x1F,0x13,0x00,0x2E,0x1E,0x00,0x20,0x0E,0x00,0x30,0x00},/*"g",71*/
{0x00,0x00,0x00,0x04,0x00,0x08,0x07,0xFF,0xF8,0x0F,0xFF,0xF8,0x00,0x10,0x08,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x00,0x08,0x00,0x00,0x00},/*"h",72*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x06,0x3F,0xF8,0x06,0x3F,0xF8,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00},/*"i",73*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0x20,0x01,0x00,0x20,0x01,0x00,0x20,0x03,0x06,0x3F,0xFE,0x06,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"j",74*/
{0x00,0x00,0x00,0x04,0x00,0x08,0x07,0xFF,0xF8,0x0F,0xFF,0xF8,0x00,0x01,0x88,0x00,0x03,0x00,0x00,0x2F,0xC0,0x00,0x38,0xF8,0x00,0x20,0x38,0x00,0x20,0x08,0x00,0x00,0x08,0x00,0x00,0x00},/*"k",75*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0x08,0x07,0xFF,0xF8,0x0F,0xFF,0xF8,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00},/*"l",76*/
{0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x10,0x08,0x00,0x20,0x00,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x10,0x08,0x00,0x20,0x00,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x00,0x08},/*"m",77*/
{0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x10,0x08,0x00,0x10,0x00,0x00,0x20,0x00,0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x00,0x08,0x00,0x00,0x00},/*"n",78*/
{0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x0F,0xF0,0x00,0x18,0x30,0x00,0x30,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x30,0x08,0x00,0x18,0x30,0x00,0x0F,0xF0,0x00,0x07,0xC0,0x00,0x00,0x00},/*"o",79*/
{0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x3F,0xFF,0x00,0x3F,0xFF,0x00,0x10,0x11,0x00,0x20,0x09,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x30,0x38,0x00,0x1F,0xF0,0x00,0x0F,0xC0,0x00,0x00,0x00},/*"p",80*/
{0x00,0x00,0x00,0x00,0x07,0xC0,0x00,0x1F,0xF0,0x00,0x38,0x18,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x09,0x00,0x10,0x11,0x00,0x1F,0xFF,0x00,0x3F,0xFF,0x00,0x00,0x01,0x00,0x00,0x00},/*"q",81*/
{0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x3F,0xF8,0x00,0x3F,0xF8,0x00,0x08,0x08,0x00,0x10,0x08,0x00,0x20,0x08,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x78,0x00,0x1E,0x18,0x00,0x33,0x08,0x00,0x23,0x08,0x00,0x21,0x08,0x00,0x21,0x88,0x00,0x21,0x98,0x00,0x30,0xF0,0x00,0x38,0x60,0x00,0x00,0x00},/*"s",83*/
{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0xFF,0xF0,0x03,0xFF,0xF8,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00},/*"t",84*/
{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x3F,0xF0,0x00,0x7F,0xF8,0x00,0x00,0x18,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x20,0x10,0x00,0x3F,0xF8,0x00,0x7F,0xF0,0x00,0x00,0x10,0x00,0x00,0x00},/*"u",85*/
{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x30,0x00,0x00,0x3C,0x00,0x00,0x3F,0x80,0x00,0x23,0xF0,0x00,0x00,0x78,0x00,0x00,0x70,0x00,0x23,0x80,0x00,0x3C,0x00,0x00,0x30,0x00,0x00,0x20,0x00},/*"v",86*/
{0x00,0x20,0x00,0x00,0x3C,0x00,0x00,0x3F,0xE0,0x00,0x23,0xF8,0x00,0x00,0xE0,0x00,0x27,0x00,0x00,0x3E,0x00,0x00,0x3F,0xE0,0x00,0x21,0xF8,0x00,0x01,0xE0,0x00,0x3E,0x00,0x00,0x20,0x00},/*"w",87*/
{0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x20,0x08,0x00,0x38,0x38,0x00,0x3E,0x68,0x00,0x27,0x80,0x00,0x03,0xC8,0x00,0x2C,0xF8,0x00,0x38,0x38,0x00,0x20,0x18,0x00,0x20,0x08,0x00,0x00,0x00},/*"x",88*/
{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x30,0x03,0x00,0x3C,0x01,0x00,0x3F,0x83,0x00,0x23,0xEC,0x00,0x00,0x70,0x00,0x23,0x80,0x00,0x3C,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x00,0x00},/*"y",89*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x00,0x20,0x38,0x00,0x20,0xF8,0x00,0x23,0xE8,0x00,0x2F,0x88,0x00,0x3E,0x08,0x00,0x38,0x08,0x00,0x20,0x18,0x00,0x00,0x70,0x00,0x00,0x00},/*"z",90*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x14,0x00,0x1F,0xF7,0xFC,0x30,0x00,0x06,0x20,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00},/*"{",91*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"|",92*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x02,0x30,0x00,0x06,0x1F,0xF7,0xFC,0x00,0x14,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
{0x00,0x00,0x00,0x18,0x00,0x00,0x60,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x0C,0x00,0x00,0x10,0x00,0x00},/*"~",94*/
};
/* 32*32 ASCII字符集点阵 */
const unsigned char asc2_3216[95][64]={
{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,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x00,0xC0,0x07,0xFF,0xE1,0xE0,0x07,0xF0,0x01,0xE0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x01,0xC0,0x00,0x00,0x07,0x80,0x00,0x00,0x1F,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1C,0x20,0x00,0x00,0x01,0xC0,0x00,0x00,0x07,0x80,0x00,0x00,0x1F,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x00,0x18,0x0C,0x00,0x00,0x18,0x0F,0xE0,0x00,0x1F,0xFC,0x00,0x03,0xF8,0x0C,0x00,0x00,0x18,0x0C,0x00,0x00,0x18,0x0C,0x00,0x00,0x18,0x0C,0x00,0x00,0x18,0x0C,0x00,0x00,0x18,0x0F,0xE0,0x00,0x1F,0xFC,0x00,0x03,0xF8,0x0C,0x00,0x00,0x18,0x0C,0x00,0x00,0x18,0x0C,0x00,0x00,0x00,0x00,0x00},/*"#",3*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x78,0x07,0xC0,0x00,0xFC,0x06,0x40,0x01,0x0E,0x00,0x20,0x03,0x07,0x00,0x20,0x02,0x03,0x80,0x20,0x0F,0xFF,0xFF,0xFC,0x02,0x01,0xC0,0x20,0x02,0x00,0xE0,0x60,0x01,0x30,0x70,0x40,0x01,0xF0,0x3F,0x80,0x00,0xF0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"$",4*/
{0x00,0xFE,0x00,0x00,0x01,0xFF,0x00,0x00,0x03,0x01,0x80,0x00,0x02,0x00,0x80,0x60,0x03,0x01,0x81,0xC0,0x01,0xFF,0x07,0x00,0x00,0xFE,0x18,0x00,0x00,0x00,0xE0,0x00,0x00,0x03,0xBF,0x00,0x00,0x0C,0xFF,0xC0,0x00,0x71,0x80,0x60,0x01,0xC1,0x00,0x20,0x03,0x01,0x80,0x60,0x00,0x00,0xFF,0xC0,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00},/*"%",5*/
{0x00,0x00,0x1F,0x00,0x00,0x00,0x7F,0xC0,0x00,0xFC,0xC0,0xC0,0x01,0xFF,0x80,0x60,0x03,0x03,0xE0,0x20,0x02,0x02,0x78,0x20,0x02,0x06,0x1E,0x20,0x03,0xFC,0x07,0x40,0x01,0xF0,0x03,0x80,0x00,0x01,0x03,0xC0,0x00,0x01,0x1C,0x60,0x00,0x01,0xE0,0x20,0x00,0x01,0x00,0x20,0x00,0x01,0x00,0x40,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00},/*"&",6*/
{0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x1C,0x60,0x00,0x00,0x1C,0x40,0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{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,0x07,0xF8,0x00,0x00,0x3F,0xFF,0x00,0x00,0x78,0x07,0xC0,0x01,0xC0,0x00,0xE0,0x03,0x00,0x00,0x30,0x04,0x00,0x00,0x08,0x08,0x00,0x00,0x04,0x10,0x00,0x00,0x02,0x00,0x00,0x00,0x00},/*"(",8*/
{0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x02,0x08,0x00,0x00,0x04,0x04,0x00,0x00,0x08,0x03,0x00,0x00,0x30,0x01,0xC0,0x00,0xE0,0x00,0x78,0x07,0xC0,0x00,0x3F,0xFF,0x00,0x00,0x07,0xF8,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},/*")",9*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x18,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x03,0x60,0x00,0x00,0x61,0x43,0x80,0x00,0xFF,0xFF,0x80,0x00,0x61,0x43,0x00,0x00,0x03,0x60,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x0E,0x38,0x00,0x00,0x0C,0x18,0x00,0x00,0x00,0x00,0x00},/*"*",10*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x7F,0xFF,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xE3,0x00,0x00,0x00,0xE2,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x78,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,0x00,0x00,0x00,0x00},/*",",12*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0xC0,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,0x00,0x00,0x00,0x00},/*".",14*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xE0,0x00,0x00,0x03,0x80,0x00,0x00,0x0E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xE0,0x00,0x00,0x03,0x80,0x00,0x00,0x0E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xE0,0x00,0x00,0x03,0x80,0x00,0x00,0x0E,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"/",15*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x00,0x00,0x7F,0xFF,0x00,0x00,0xF0,0x07,0x80,0x01,0x80,0x00,0xC0,0x03,0x00,0x00,0x60,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0x00,0x00,0x60,0x01,0x80,0x00,0xC0,0x00,0xE0,0x03,0x80,0x00,0x7F,0xFF,0x00,0x00,0x0F,0xF8,0x00,0x00,0x00,0x00,0x00},/*"0",16*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x20,0x00,0x80,0x00,0x20,0x00,0x80,0x00,0x20,0x00,0x80,0x00,0x60,0x01,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"1",17*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0xE0,0x00,0x98,0x01,0x60,0x01,0x00,0x02,0x60,0x02,0x00,0x04,0x60,0x02,0x00,0x08,0x60,0x02,0x00,0x10,0x60,0x02,0x00,0x20,0x60,0x02,0x00,0x40,0x60,0x03,0x00,0x80,0x60,0x01,0x83,0x00,0x60,0x01,0xFE,0x00,0xE0,0x00,0x7C,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"2",18*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x80,0x01,0xF0,0x07,0xC0,0x01,0x00,0x00,0x40,0x02,0x00,0x00,0x20,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x20,0x03,0x03,0x80,0x20,0x01,0x86,0x80,0x40,0x01,0xFC,0xC0,0xC0,0x00,0x78,0x7F,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"3",19*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x48,0x00,0x00,0x01,0x88,0x00,0x00,0x06,0x08,0x00,0x00,0x0C,0x08,0x10,0x00,0x30,0x08,0x10,0x00,0x40,0x08,0x10,0x01,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xF0,0x03,0xFF,0xFF,0xF0,0x00,0x00,0x08,0x10,0x00,0x00,0x08,0x10,0x00,0x00,0x08,0x10,0x00,0x00,0x00,0x00},/*"4",20*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x1F,0x86,0x40,0x03,0xE1,0x00,0x20,0x03,0x02,0x00,0x20,0x03,0x04,0x00,0x20,0x03,0x04,0x00,0x20,0x03,0x04,0x00,0x20,0x03,0x04,0x00,0x20,0x03,0x06,0x00,0x40,0x03,0x03,0x01,0xC0,0x03,0x01,0xFF,0x80,0x03,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"5",21*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFC,0x00,0x00,0x3F,0xFF,0x00,0x00,0x70,0xC3,0x80,0x00,0x81,0x80,0xC0,0x01,0x01,0x00,0x60,0x03,0x02,0x00,0x20,0x02,0x02,0x00,0x20,0x02,0x02,0x00,0x20,0x02,0x02,0x00,0x20,0x02,0x03,0x00,0x40,0x01,0xC1,0x80,0xC0,0x00,0xC0,0xFF,0x80,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00},/*"6",22*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0x80,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x07,0xE0,0x03,0x00,0x3F,0xE0,0x03,0x01,0xC0,0x00,0x03,0x06,0x00,0x00,0x03,0x18,0x00,0x00,0x03,0x60,0x00,0x00,0x03,0x80,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"7",23*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x78,0x3F,0x80,0x00,0xFC,0x60,0xC0,0x01,0x8E,0xC0,0x40,0x03,0x07,0x80,0x20,0x02,0x03,0x00,0x20,0x02,0x01,0x80,0x20,0x02,0x01,0x80,0x20,0x02,0x01,0xC0,0x20,0x03,0x01,0xE0,0x40,0x01,0x86,0x70,0xC0,0x00,0xFC,0x3F,0x80,0x00,0x78,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"8",24*/
{0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0xFF,0x81,0xC0,0x01,0xC0,0xC1,0xC0,0x01,0x00,0x60,0x20,0x02,0x00,0x20,0x20,0x02,0x00,0x20,0x20,0x02,0x00,0x20,0x20,0x02,0x00,0x20,0x60,0x02,0x00,0x40,0xC0,0x01,0x00,0xC1,0x80,0x00,0xC1,0x8F,0x00,0x00,0x7F,0xFE,0x00,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"9",25*/
{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,0x03,0x00,0xC0,0x00,0x07,0x81,0xE0,0x00,0x07,0x81,0xE0,0x00,0x03,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/
{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,0x06,0x00,0x66,0x00,0x06,0x00,0x78,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},/*";",27*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0xC0,0x00,0x00,0x03,0x60,0x00,0x00,0x06,0x30,0x00,0x00,0x0C,0x18,0x00,0x00,0x18,0x0C,0x00,0x00,0x30,0x06,0x00,0x00,0x60,0x03,0x00,0x00,0xC0,0x01,0x80,0x01,0x00,0x00,0x40,0x02,0x00,0x00,0x20,0x04,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"<",28*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x00,0x00,0x00},/*"=",29*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x10,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x40,0x00,0xC0,0x01,0x80,0x00,0x60,0x03,0x00,0x00,0x30,0x06,0x00,0x00,0x18,0x0C,0x00,0x00,0x0C,0x18,0x00,0x00,0x06,0x30,0x00,0x00,0x03,0x60,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*">",30*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x01,0xF8,0x00,0x00,0x02,0x38,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0xC0,0x04,0x00,0x79,0xE0,0x04,0x00,0x81,0xE0,0x04,0x01,0x00,0xC0,0x04,0x03,0x00,0x00,0x02,0x02,0x00,0x00,0x03,0x06,0x00,0x00,0x01,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00},/*"?",31*/
{0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x00,0x00,0x3F,0xFE,0x00,0x00,0x70,0x07,0x80,0x00,0xC0,0x00,0xC0,0x01,0x01,0xF8,0x40,0x03,0x07,0xFC,0x20,0x02,0x1E,0x04,0x20,0x02,0x30,0x08,0x20,0x02,0x20,0x30,0x20,0x02,0x3F,0xFC,0x20,0x01,0x3F,0x04,0x40,0x01,0x80,0x0C,0xC0,0x00,0xE0,0x31,0x80,0x00,0x1F,0xC2,0x00,0x00,0x00,0x00,0x00},/*"@",32*/
{0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x03,0xE0,0x00,0x00,0x3E,0x20,0x00,0x03,0xE0,0x20,0x00,0x3E,0x20,0x00,0x03,0xE0,0x20,0x00,0x03,0x80,0x20,0x00,0x07,0xFC,0x20,0x00,0x00,0x3F,0xE0,0x00,0x00,0x03,0xFE,0x20,0x00,0x00,0x3F,0xE0,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00},/*"A",33*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x20,0x03,0x03,0x00,0x20,0x01,0x86,0x80,0x60,0x01,0xFC,0xC0,0xC0,0x00,0xF8,0x7F,0x80,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00},/*"B",34*/
{0x00,0x00,0x00,0x00,0x00,0x07,0xF8,0x00,0x00,0x3F,0xFF,0x00,0x00,0x70,0x07,0x80,0x00,0xC0,0x00,0xC0,0x01,0x00,0x00,0x40,0x03,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x40,0x01,0x80,0x00,0xC0,0x03,0xC0,0x01,0x80,0x00,0x30,0x06,0x00,0x00,0x00,0x00,0x00},/*"C",35*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0x00,0x00,0x60,0x01,0x00,0x00,0x40,0x01,0x80,0x00,0xC0,0x00,0xF0,0x07,0x80,0x00,0x7F,0xFE,0x00,0x00,0x0F,0xF8,0x00,0x00,0x00,0x00,0x00},/*"D",36*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x20,0x02,0x03,0x80,0x20,0x02,0x0F,0xE0,0x20,0x03,0x00,0x00,0x60,0x03,0xC0,0x00,0xE0,0x00,0x60,0x03,0x00,0x00,0x00,0x00,0x00},/*"E",37*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x00,0x02,0x01,0x00,0x00,0x02,0x01,0x00,0x00,0x02,0x01,0x00,0x00,0x02,0x03,0x80,0x00,0x03,0x0F,0xE0,0x00,0x03,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x60,0x00,0x00},/*"F",38*/
{0x00,0x00,0x00,0x00,0x00,0x07,0xF8,0x00,0x00,0x3F,0xFE,0x00,0x00,0x70,0x07,0x80,0x01,0xC0,0x01,0xC0,0x01,0x00,0x00,0x40,0x03,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x01,0x00,0x20,0x20,0x01,0x00,0x20,0x40,0x03,0xC0,0x3F,0x80,0x00,0x30,0x3F,0x80,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00},/*"G",39*/
{0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x00,0x80,0x20,0x02,0x00,0x80,0x20,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x02,0x00,0x80,0x20,0x02,0x00,0x80,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x00,0x00,0x00,0x00},/*"H",40*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"I",41*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x03,0x02,0x00,0x00,0x06,0x03,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xF8,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"J",42*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x00,0xC0,0x20,0x02,0x01,0x00,0x20,0x00,0x07,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x30,0xF8,0x00,0x02,0x60,0x3E,0x20,0x03,0x80,0x0F,0x20,0x03,0x00,0x03,0xE0,0x02,0x00,0x00,0xE0,0x02,0x00,0x00,0x20,0x00,0x00,0x00,0x20},/*"K",43*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00},/*"L",44*/
{0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xE0,0x00,0x20,0x03,0xFF,0x00,0x20,0x00,0x1F,0xF0,0x00,0x00,0x01,0xFF,0x80,0x00,0x00,0x0F,0xE0,0x00,0x00,0x1E,0x00,0x00,0x03,0xE0,0x00,0x00,0x3E,0x00,0x20,0x03,0xE0,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20},/*"M",45*/
{0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0x80,0x00,0x20,0x03,0xF0,0x00,0x20,0x00,0xFC,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x07,0xC0,0x00,0x00,0x01,0xF0,0x00,0x00,0x00,0x7C,0x00,0x02,0x00,0x1F,0x80,0x02,0x00,0x07,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"N",46*/
{0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x00,0x00,0x3F,0xFE,0x00,0x00,0xF0,0x07,0x80,0x01,0x80,0x00,0xC0,0x01,0x00,0x00,0x40,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x01,0x00,0x00,0x40,0x01,0x80,0x00,0xC0,0x00,0xF0,0x03,0x80,0x00,0x3F,0xFE,0x00,0x00,0x0F,0xF8,0x00,0x00,0x00,0x00,0x00},/*"O",47*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x00,0x80,0x20,0x02,0x00,0x80,0x20,0x02,0x00,0x80,0x00,0x02,0x00,0x80,0x00,0x02,0x00,0x80,0x00,0x02,0x00,0x80,0x00,0x03,0x01,0x80,0x00,0x01,0x83,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00},/*"P",48*/
{0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x00,0x00,0x7F,0xFF,0x00,0x00,0xF0,0x03,0x80,0x01,0x80,0x01,0xC0,0x01,0x00,0x06,0x40,0x02,0x00,0x04,0x20,0x02,0x00,0x04,0x20,0x02,0x00,0x06,0x20,0x02,0x00,0x03,0xE0,0x01,0x00,0x00,0xF8,0x01,0x80,0x00,0x5C,0x00,0xE0,0x03,0x8C,0x00,0x3F,0xFF,0x0C,0x00,0x0F,0xFC,0x18,0x00,0x00,0x00,0x00},/*"Q",49*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x01,0x00,0x20,0x02,0x01,0x00,0x20,0x02,0x01,0x80,0x00,0x02,0x01,0xE0,0x00,0x02,0x01,0xFC,0x00,0x03,0x03,0x3F,0x80,0x01,0x86,0x07,0xE0,0x01,0xFC,0x00,0xE0,0x00,0xF8,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00},/*"R",50*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x06,0x00,0x00,0xFE,0x01,0xE0,0x01,0x86,0x00,0xC0,0x03,0x03,0x00,0x40,0x02,0x03,0x00,0x20,0x02,0x01,0x80,0x20,0x02,0x01,0x80,0x20,0x02,0x01,0xC0,0x20,0x02,0x00,0xC0,0x20,0x01,0x00,0xE0,0x60,0x01,0x80,0x70,0xC0,0x03,0xE0,0x3F,0x80,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00},/*"S",51*/
{0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x03,0x80,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x03,0xFF,0xFF,0xE0,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*"T",52*/
{0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0xFF,0xFF,0x00,0x03,0xFF,0xFF,0xC0,0x02,0x00,0x00,0x40,0x02,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x40,0x02,0x00,0x00,0x80,0x03,0xFF,0xFF,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"U",53*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xFC,0x00,0x00,0x02,0x3F,0xC0,0x00,0x00,0x03,0xF8,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0x07,0xE0,0x00,0x00,0x07,0x80,0x00,0x00,0x78,0x00,0x02,0x03,0xC0,0x00,0x02,0x3C,0x00,0x00,0x03,0xC0,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00},/*"V",54*/
{0x02,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xFF,0x80,0x00,0x02,0x3F,0xFE,0x00,0x02,0x00,0x7F,0xE0,0x00,0x00,0x0F,0x00,0x02,0x00,0xF0,0x00,0x03,0xEF,0x00,0x00,0x03,0xFF,0x80,0x00,0x02,0x0F,0xFE,0x00,0x00,0x00,0x3F,0xE0,0x00,0x00,0x1F,0x00,0x02,0x07,0xE0,0x00,0x03,0xF8,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x00,0x00},/*"W",55*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0x80,0x00,0xE0,0x03,0xF0,0x03,0x20,0x02,0xFC,0x0C,0x20,0x02,0x1F,0x30,0x00,0x00,0x07,0xC0,0x00,0x00,0x07,0xF0,0x00,0x02,0x18,0x7C,0x00,0x02,0x60,0x1F,0x20,0x03,0x80,0x03,0xE0,0x02,0x00,0x00,0xE0,0x02,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00},/*"X",56*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xF8,0x00,0x00,0x02,0x3E,0x00,0x20,0x02,0x0F,0xC0,0x20,0x00,0x01,0xFF,0xE0,0x00,0x00,0x7F,0xE0,0x00,0x03,0x80,0x20,0x02,0x1C,0x00,0x20,0x02,0x70,0x00,0x00,0x03,0x80,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"Y",57*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x60,0x00,0xE0,0x03,0x80,0x03,0xE0,0x03,0x00,0x0F,0xA0,0x02,0x00,0x3E,0x20,0x02,0x00,0xF8,0x20,0x02,0x03,0xE0,0x20,0x02,0x0F,0x80,0x20,0x02,0x3E,0x00,0x20,0x02,0x78,0x00,0x20,0x03,0xE0,0x00,0x60,0x03,0x80,0x00,0xE0,0x02,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"Z",58*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFC,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"[",59*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"\",60*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x1F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"]",61*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01},/*"_",63*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,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},/*"`",64*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x01,0x8F,0xC0,0x00,0x03,0x8C,0x60,0x00,0x06,0x18,0x20,0x00,0x04,0x10,0x20,0x00,0x04,0x10,0x20,0x00,0x04,0x20,0x20,0x00,0x04,0x20,0x40,0x00,0x06,0x20,0x40,0x00,0x03,0xFF,0xC0,0x00,0x01,0xFF,0xE0,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00},/*"a",65*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x00,0x01,0x80,0xC0,0x00,0x02,0x00,0x60,0x00,0x02,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x06,0x00,0x40,0x00,0x03,0x00,0xC0,0x00,0x01,0xFF,0x80,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00},/*"b",66*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x01,0xFF,0x80,0x00,0x03,0x81,0xC0,0x00,0x02,0x00,0x40,0x00,0x06,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x06,0x00,0x20,0x00,0x03,0xC0,0x40,0x00,0x01,0xC0,0x80,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"c",67*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x01,0xFF,0x80,0x00,0x03,0x80,0xC0,0x00,0x06,0x00,0x60,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x02,0x04,0x00,0x40,0x02,0x02,0x00,0x80,0x03,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00},/*"d",68*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x01,0xFF,0x80,0x00,0x03,0x11,0xC0,0x00,0x02,0x10,0x40,0x00,0x04,0x10,0x60,0x00,0x04,0x10,0x20,0x00,0x04,0x10,0x20,0x00,0x04,0x10,0x20,0x00,0x06,0x10,0x20,0x00,0x03,0x10,0x40,0x00,0x01,0xF0,0xC0,0x00,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"e",69*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x7F,0xFF,0xE0,0x01,0xFF,0xFF,0xE0,0x01,0x04,0x00,0x20,0x03,0x04,0x00,0x20,0x02,0x04,0x00,0x20,0x02,0x04,0x00,0x20,0x02,0x04,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x01,0xC0,0x00,0x00},/*"f",70*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0xE3,0x3E,0x00,0x03,0xFF,0xC2,0x00,0x02,0x0C,0xC3,0x00,0x04,0x04,0xC1,0x00,0x04,0x04,0xC1,0x00,0x04,0x04,0xC1,0x00,0x04,0x04,0xC1,0x00,0x06,0x0C,0xC1,0x00,0x03,0xF8,0xC3,0x00,0x05,0xF0,0x62,0x00,0x06,0x00,0x7E,0x00,0x06,0x00,0x3C,0x00,0x00,0x00,0x00},/*"g",71*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x00,0x01,0x00,0x20,0x00,0x02,0x00,0x20,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x20,0x00,0x06,0x00,0x20,0x00,0x03,0xFF,0xE0,0x00,0x01,0xFF,0xE0,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20},/*"h",72*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x03,0x87,0xFF,0xE0,0x03,0x8F,0xFF,0xE0,0x03,0x80,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"i",73*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x04,0x00,0x03,0x00,0x04,0x00,0x06,0x03,0x87,0xFF,0xFC,0x03,0x8F,0xFF,0xF8,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"j",74*/
{0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x00,0x00,0x08,0x20,0x00,0x00,0x10,0x20,0x00,0x00,0x30,0x00,0x00,0x00,0xFC,0x00,0x00,0x05,0x8E,0x00,0x00,0x07,0x07,0xA0,0x00,0x06,0x01,0xE0,0x00,0x04,0x00,0xE0,0x00,0x04,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00},/*"k",75*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x03,0xFF,0xFF,0xE0,0x07,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"l",76*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x20,0x00,0x07,0xFF,0xE0,0x00,0x0F,0xFF,0xE0,0x00,0x02,0x00,0x20,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x20,0x00,0x07,0xFF,0xE0,0x00,0x03,0xFF,0xE0,0x00,0x02,0x00,0x20,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x20,0x00,0x07,0xFF,0xE0,0x00,0x03,0xFF,0xE0,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00},/*"m",77*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x07,0xFF,0xE0,0x00,0x0F,0xFF,0xE0,0x00,0x01,0x00,0x20,0x00,0x02,0x00,0x20,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x20,0x00,0x06,0x00,0x20,0x00,0x03,0xFF,0xE0,0x00,0x01,0xFF,0xE0,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20},/*"n",78*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xFF,0x80,0x00,0x03,0x81,0xC0,0x00,0x02,0x00,0x40,0x00,0x06,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x06,0x00,0x20,0x00,0x02,0x00,0x40,0x00,0x03,0x81,0xC0,0x00,0x01,0xFF,0x80,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00},/*"o",79*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x07,0xFF,0xFF,0x00,0x0F,0xFF,0xFF,0x00,0x01,0x00,0xC1,0x00,0x02,0x00,0x41,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x06,0x00,0x40,0x00,0x03,0x01,0xC0,0x00,0x01,0xFF,0x80,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00},/*"p",80*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x01,0xFF,0x80,0x00,0x03,0x80,0xC0,0x00,0x02,0x00,0x60,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x02,0x00,0x41,0x00,0x03,0x00,0xC1,0x00,0x03,0xFF,0xFF,0x00,0x07,0xFF,0xFF,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01},/*"q",81*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x0F,0xFF,0xE0,0x00,0x0F,0xFF,0xE0,0x00,0x00,0xC0,0x20,0x00,0x01,0x00,0x20,0x00,0x02,0x00,0x20,0x00,0x06,0x00,0x20,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x00,0x01,0xC0,0xE0,0x00,0x03,0xE0,0x40,0x00,0x06,0x30,0x20,0x00,0x04,0x30,0x20,0x00,0x04,0x18,0x20,0x00,0x04,0x18,0x20,0x00,0x04,0x18,0x20,0x00,0x04,0x0C,0x20,0x00,0x02,0x0C,0x60,0x00,0x03,0x07,0xC0,0x00,0x07,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"s",83*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0xFF,0xFF,0xC0,0x00,0x04,0x00,0x60,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x40,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"t",84*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0xFF,0x80,0x00,0x0F,0xFF,0xC0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x40,0x00,0x04,0x00,0x80,0x00,0x07,0xFF,0xE0,0x00,0x0F,0xFF,0xC0,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40},/*"u",85*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0xF0,0x00,0x00,0x04,0xFE,0x00,0x00,0x04,0x1F,0xC0,0x00,0x00,0x03,0xE0,0x00,0x00,0x03,0x80,0x00,0x00,0x1C,0x00,0x00,0x04,0x60,0x00,0x00,0x07,0x80,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"v",86*/
{0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0xC0,0x00,0x00,0x07,0xFC,0x00,0x00,0x04,0x3F,0x80,0x00,0x00,0x03,0xE0,0x00,0x04,0x0F,0x80,0x00,0x06,0xF0,0x00,0x00,0x07,0xF0,0x00,0x00,0x07,0xFF,0x80,0x00,0x04,0x0F,0xE0,0x00,0x00,0x03,0x80,0x00,0x04,0x3C,0x00,0x00,0x07,0xC0,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00},/*"w",87*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x04,0x00,0x20,0x00,0x04,0x00,0x60,0x00,0x07,0x00,0xE0,0x00,0x07,0x83,0x20,0x00,0x07,0xE6,0x00,0x00,0x04,0xF8,0x00,0x00,0x00,0x3C,0x00,0x00,0x04,0x5E,0x20,0x00,0x05,0x87,0xA0,0x00,0x06,0x01,0xE0,0x00,0x04,0x00,0x60,0x00,0x04,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00},/*"x",88*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x03,0x00,0x07,0x00,0x03,0x00,0x07,0xE0,0x01,0x00,0x04,0xF8,0x01,0x00,0x04,0x1F,0x02,0x00,0x00,0x07,0xFC,0x00,0x00,0x00,0xE0,0x00,0x00,0x07,0x00,0x00,0x04,0x38,0x00,0x00,0x07,0xC0,0x00,0x00,0x06,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00},/*"y",89*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x60,0x00,0x06,0x00,0xE0,0x00,0x04,0x03,0xE0,0x00,0x04,0x07,0xA0,0x00,0x04,0x0E,0x20,0x00,0x04,0x3C,0x20,0x00,0x04,0x70,0x20,0x00,0x05,0xE0,0x20,0x00,0x07,0x80,0x20,0x00,0x07,0x00,0x60,0x00,0x04,0x00,0xE0,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"z",90*/
{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,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x40,0x00,0x07,0xFE,0x3F,0xF8,0x08,0x00,0x00,0x04,0x10,0x00,0x00,0x02,0x10,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"{",91*/
{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,0xFF,0xFF,0xFF,0xFF,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},/*"|",92*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x02,0x10,0x00,0x00,0x02,0x08,0x00,0x00,0x04,0x07,0xFE,0x3F,0xF8,0x00,0x01,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,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},/*"}",93*/
{0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
};
#endif