STM32开发踩坑——基于CubeMx+Gcc移植正点原子3.5‘TFTLCD(开发环境:正点F103精英版+3.5‘TFTLCD)

成立这个专栏的目的是,记录自己嵌入式开发遇到的问题,与成功的解决方法,方便自己回顾。

最近在学习王维波老师的《STM32Cube高效开发教程》,王老师移植的是普中科技的驱动,而我手动移植了一下正点原子的lcd驱动,其中也踩了不少坑(部分现象还百度不出结果),值得记录一下。

准备环节:正点原子3.5'TFTLCD的官方例程(参考下载链接:3.5寸TFTLCD电阻触摸屏320*480 — 正点原子资料下载中心 1.0.0 文档)依据其新资料进行移植

,F103精英板、CubeMX、Gcc开发环境。

第一步:打开CubeMX,新建项目,选择单片机型号以及项目名称。

第二步:CubeMX初始化RCC、SYS相关(这些参数设置都是根据你的开发板而来的)

STM32开发踩坑——基于CubeMx+Gcc移植正点原子3.5‘TFTLCD(开发环境:正点F103精英版+3.5‘TFTLCD)_第1张图片

STM32开发踩坑——基于CubeMx+Gcc移植正点原子3.5‘TFTLCD(开发环境:正点F103精英版+3.5‘TFTLCD)_第2张图片

 时钟树设置,工程设置

STM32开发踩坑——基于CubeMx+Gcc移植正点原子3.5‘TFTLCD(开发环境:正点F103精英版+3.5‘TFTLCD)_第3张图片STM32开发踩坑——基于CubeMx+Gcc移植正点原子3.5‘TFTLCD(开发环境:正点F103精英版+3.5‘TFTLCD)_第4张图片

  第四步:FSMC的配置(各个开发板差异化明显,注意甄别)

STM32开发踩坑——基于CubeMx+Gcc移植正点原子3.5‘TFTLCD(开发环境:正点F103精英版+3.5‘TFTLCD)_第5张图片

 上述参数的填写主要依据还是我们自己手上的开发版FSMC的实际电气连接STM32开发踩坑——基于CubeMx+Gcc移植正点原子3.5‘TFTLCD(开发环境:正点F103精英版+3.5‘TFTLCD)_第6张图片

 例如:此处中,LCD (RS)Register Select,书上的标号为A6,但是基于正点原子的开发板实际原理图来看,应该是选择A10(RS---FSMC A10)

FSMC具体参数配置,这个不太明白其中的含义,希望有人能解答下

STM32开发踩坑——基于CubeMx+Gcc移植正点原子3.5‘TFTLCD(开发环境:正点F103精英版+3.5‘TFTLCD)_第7张图片

 其中GPIO设置中,我们需要增加背光脚的控制(LCD BL)

STM32开发踩坑——基于CubeMx+Gcc移植正点原子3.5‘TFTLCD(开发环境:正点F103精英版+3.5‘TFTLCD)_第8张图片

 点击生成代码即可。

开始驱动移植(修修改改)

STM32开发踩坑——基于CubeMx+Gcc移植正点原子3.5‘TFTLCD(开发环境:正点F103精英版+3.5‘TFTLCD)_第9张图片

 将下载下来的模块文件(因为此时不需要触屏,暂不移植触屏)导入到我们的工程当中,为了方便查看,放入到工程新建文件夹{TFTLCD}中

1.修改头文件,修改包含路径,注释掉不存在的头文件,增加替代头文件

atk_md0350.c中

#include "atk_md0350.h"

#include "atk_md0350_font.h"

#include "atk_md0350_fsmc.h"

// #include "./SYSTEM/delay/delay.h"

atk_md0350.h中

// #include "./SYSTEM/sys/sys.h"

#include "main.h"

由于不需要触摸,此处屏蔽掉

/* 定义是否使用ATK-MD0350模块触摸 */

#define ATK_MD0350_USING_TOUCH 0

atk_md0350_font.h 中

#include "atk_md0350.h"

atk_md0350_fsmc.c中

 #include "atk_md0350_fsmc.h"

atk_md0350_fsmc.h中

// #include "./SYSTEM/sys/sys.h"

#include "main.h"

 2,在atk_md0350.c文件中修改atk_md0350_init函数:由于硬件初始化交给了CubeMx,所以可以适当注释掉原文件中硬件初始化代码

/**
 * @brief       ATK-MD0350模块初始化
 * @param       无
 * @retval      ATK_MD0350_EOK  : ATK_MD0350模块初始化成功
 *              ATK_MD0350_ERROR: ATK_MD0350模块初始化失败
 */
uint8_t atk_md0350_init(void)
{
    uint16_t chip_id;

    // atk_md0350_hw_init();               /* ATK-MD0350模块硬件初始化 */
    // atk_md0350_fsmc_init();             /* ATK-MD0350模块FSMC接口初始化 */
    chip_id = atk_md0350_get_chip_id(); /* 获取ATK-MD0350模块驱动器ID */
    if (chip_id != ATK_MD0350_CHIP_ID) {
        return ATK_MD0350_ERROR;
    } else {
        g_atk_md0350_sta.chip_id = chip_id;
        g_atk_md0350_sta.width   = ATK_MD0350_LCD_WIDTH;
        g_atk_md0350_sta.height  = ATK_MD0350_LCD_HEIGHT;
    }
    atk_md0350_reg_init();
    atk_md0350_set_disp_dir(ATK_MD0350_LCD_DISP_DIR_0);
    atk_md0350_clear(ATK_MD0350_WHITE);
    atk_md0350_display_on();
    atk_md0350_backlight_on();
#if (ATK_MD0350_USING_TOUCH != 0)
    atk_md0350_touch_init();
#endif

    return ATK_MD0350_EOK;
}

3,在atk_md0350.c文件中修改背光函数:原因同上

/**
 * @brief       开启ATK-MD0350模块LCD背光
 * @param       无
 * @retval      无
 */
void atk_md0350_backlight_on(void)
{
    HAL_GPIO_WritePin(lcd_bl_GPIO_Port, lcd_bl_Pin, GPIO_PIN_SET);
    //ATK_MD0350_BL(1);
}

/**
 * @brief       关闭ATK-MD0350模块LCD背光
 * @param       无
 * @retval      无
 */
void atk_md0350_backlight_off(void)
{
    HAL_GPIO_WritePin(lcd_bl_GPIO_Port, lcd_bl_Pin, GPIO_PIN_RESET);
    //ATK_MD0350_BL(0);
}

4,部分延时函数修改

delay_ms()修改为HAL_Delay()

atk_md0350.c中__nop()修改为__NOP()

static inline uint16_t atk_md0350_fsmc_read_dat(void) /* ATK-MD0350模块通过FSMC接口读数据 */

{

    uint16_t dat;

    __NOP();

    __NOP();

    dat = ATK_MD0350_FSMC_DAT_REG;

    return dat;

}

 开始在main中调用,添加改好的头文件

#include "atk_md0350.h"

 在MX初始化后,延时一段时间(我的异常现象就是这么解决的),调用模块的初始化,显示函数即可。

    MX_GPIO_Init();
    MX_FSMC_Init();
    /* USER CODE BEGIN 2 */
    HAL_Delay(50);
    atk_md0350_init();
    atk_md0350_display_on();
    atk_md0350_clear(ATK_MD0350_RED);

    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1) {
        atk_md0350_show_string(10, 10, ATK_MD0350_LCD_WIDTH, 32, "Hello world!!!", ATK_MD0350_LCD_FONT_12, ATK_MD0350_WHITE);
        atk_md0350_show_string(10, 42, ATK_MD0350_LCD_WIDTH, 24, "STM32!!!", ATK_MD0350_LCD_FONT_24, ATK_MD0350_WHITE);
        atk_md0350_show_string(10, 66, ATK_MD0350_LCD_WIDTH, 16, "Hello world!!!", ATK_MD0350_LCD_FONT_16, ATK_MD0350_WHITE);
        HAL_GPIO_TogglePin(red_led_GPIO_Port, red_led_Pin);
        HAL_Delay(500);
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
    }

嫌麻烦的话可以直接copy我的,可以直接使用

atk_md0350.c

/**
 ****************************************************************************************************
 * @file        atk_md0350.c
 * @author      正点原子团队(ALIENTEK)
 * @version     V1.0
 * @date        2022-06-21
 * @brief       ATK-MD0350模块驱动代码
 * @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:正点原子 STM32F103开发板
 * 在线视频:www.yuanzige.com
 * 技术论坛:www.openedv.com
 * 公司网址:www.alientek.com
 * 购买地址:openedv.taobao.com
 *
 ****************************************************************************************************
 */

#include "atk_md0350.h"
#include "atk_md0350_font.h"
#include "atk_md0350_fsmc.h"
// #include "./SYSTEM/delay/delay.h"

/* ATK-MD0350模块LCD驱动器ID */
#define ATK_MD0350_CHIP_ID 0x5310

/* ATK-MD0350模块LCD扫描方向 */
#define ATK_MD0350_SCAN_DIR_L2R_U2D (0x0000)
#define ATK_MD0350_SCAN_DIR_L2R_D2U (0x0080)
#define ATK_MD0350_SCAN_DIR_R2L_U2D (0x0040)
#define ATK_MD0350_SCAN_DIR_R2L_D2U (0x00C0)
#define ATK_MD0350_SCAN_DIR_U2D_L2R (0x0020)
#define ATK_MD0350_SCAN_DIR_U2D_R2L (0x0060)
#define ATK_MD0350_SCAN_DIR_D2U_L2R (0x00A0)
#define ATK_MD0350_SCAN_DIR_D2U_R2L (0x00E0)

/* ATK-MD0350模块状态数据结构体 */
static struct
{
    uint16_t chip_id;                   /* 驱动器ID */
    uint16_t width;                     /* LCD宽度 */
    uint16_t height;                    /* LCD高度 */
    atk_md0350_lcd_scan_dir_t scan_dir; /* LCD扫描方向 */
    atk_md0350_lcd_disp_dir_t disp_dir; /* LCD显示方向 */
} g_atk_md0350_sta = {0};

/**
 * @brief       ATK-MD0350模块硬件初始化
 * @param       无
 * @retval      无
 */
static void atk_md0350_hw_init(void)
{
    GPIO_InitTypeDef gpio_init_struct = {0};

    /* 使能时钟 */
    ATK_MD0350_BL_GPIO_CLK_ENABLE();

    /* 初始化BL引脚 */
    gpio_init_struct.Pin   = ATK_MD0350_BL_GPIO_PIN;
    gpio_init_struct.Mode  = GPIO_MODE_OUTPUT_PP;
    gpio_init_struct.Pull  = GPIO_PULLUP;
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_BL_GPIO_PORT, &gpio_init_struct);

    ATK_MD0350_BL(0);
}

/**
 * @brief       获取ATK-MD0350模块驱动器ID
 * @param       无
 * @retval      无
 */
static inline uint16_t atk_md0350_get_chip_id(void)
{
    uint16_t chip_id;

    atk_md0350_fsmc_write_cmd(0xD4);
    chip_id = atk_md0350_fsmc_read_dat();
    chip_id = atk_md0350_fsmc_read_dat();
    chip_id = atk_md0350_fsmc_read_dat() << 8;
    chip_id |= (atk_md0350_fsmc_read_dat()) & 0x00FF;

    return chip_id;
}

/**
 * @brief       ATK-MD0350模块寄存器初始化
 * @param       无
 * @retval      无
 */
static void atk_md0350_reg_init(void)
{
    atk_md0350_fsmc_write_cmd(0xED);
    atk_md0350_fsmc_write_dat(0x01);
    atk_md0350_fsmc_write_dat(0xFE);
    atk_md0350_fsmc_write_cmd(0xEE);
    atk_md0350_fsmc_write_dat(0xDE);
    atk_md0350_fsmc_write_dat(0x21);
    atk_md0350_fsmc_write_cmd(0xF1);
    atk_md0350_fsmc_write_dat(0x01);
    atk_md0350_fsmc_write_cmd(0xDF);
    atk_md0350_fsmc_write_dat(0x10);
    atk_md0350_fsmc_write_cmd(0xC4);
    atk_md0350_fsmc_write_dat(0x8F);
    atk_md0350_fsmc_write_cmd(0xC6);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xE2);
    atk_md0350_fsmc_write_dat(0xE2);
    atk_md0350_fsmc_write_dat(0xE2);
    atk_md0350_fsmc_write_cmd(0xBF);
    atk_md0350_fsmc_write_dat(0xAA);
    atk_md0350_fsmc_write_cmd(0xB0);
    atk_md0350_fsmc_write_dat(0x0D);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x0D);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x11);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x19);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x21);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x2D);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x3D);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x5D);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x5D);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xB1);
    atk_md0350_fsmc_write_dat(0x80);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x8B);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x96);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xB2);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x02);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x03);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xB3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xB4);
    atk_md0350_fsmc_write_dat(0x8B);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x96);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xA1);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xB5);
    atk_md0350_fsmc_write_dat(0x02);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x03);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x04);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xB6);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xB7);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x3F);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x5E);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x64);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x8C);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xAC);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xDC);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x70);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x90);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xEB);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xDC);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xB8);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xBA);
    atk_md0350_fsmc_write_dat(0x24);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xC1);
    atk_md0350_fsmc_write_dat(0x20);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x54);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xFF);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xC2);
    atk_md0350_fsmc_write_dat(0x0A);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x04);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xC3);
    atk_md0350_fsmc_write_dat(0x3C);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x3A);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x39);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x37);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x3C);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x36);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x32);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x2F);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x2C);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x29);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x26);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x24);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x24);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x23);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x3C);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x36);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x32);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x2F);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x2C);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x29);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x26);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x24);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x24);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x23);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xC4);
    atk_md0350_fsmc_write_dat(0x62);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x05);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x84);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xF0);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x18);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xA4);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x18);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x50);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x0C);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x17);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x95);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xF3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xE6);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xC5);
    atk_md0350_fsmc_write_dat(0x32);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x44);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x65);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x76);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x88);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xC6);
    atk_md0350_fsmc_write_dat(0x20);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x17);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x01);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xC7);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xC8);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xC9);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xE0);
    atk_md0350_fsmc_write_dat(0x16);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x1C);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x21);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x36);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x46);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x52);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x64);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x7A);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x8B);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x99);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xA8);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xB9);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xC4);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xCA);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xD2);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xD9);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xE0);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xF3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xE1);
    atk_md0350_fsmc_write_dat(0x16);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x1C);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x22);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x36);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x45);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x52);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x64);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x7A);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x8B);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x99);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xA8);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xB9);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xC4);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xCA);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xD2);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xD8);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xE0);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xF3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xE2);
    atk_md0350_fsmc_write_dat(0x05);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x0B);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x1B);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x34);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x44);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x4F);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x61);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x79);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x88);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x97);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xA6);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xB7);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xC2);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xC7);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xD1);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xD6);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xDD);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xF3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xE3);
    atk_md0350_fsmc_write_dat(0x05);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xA);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x1C);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x33);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x44);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x50);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x62);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x78);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x88);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x97);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xA6);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xB7);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xC2);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xC7);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xD1);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xD5);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xDD);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xF3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xE4);
    atk_md0350_fsmc_write_dat(0x01);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x01);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x02);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x2A);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x3C);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x4B);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x5D);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x74);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x84);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x93);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xA2);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xB3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xBE);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xC4);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xCD);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xD3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xDD);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xF3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xE5);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x02);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x29);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x3C);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x4B);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x5D);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x74);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x84);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x93);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xA2);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xB3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xBE);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xC4);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xCD);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xD3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xDC);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xF3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xE6);
    atk_md0350_fsmc_write_dat(0x11);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x34);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x56);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x76);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x77);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x66);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x88);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x99);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xBB);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x99);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x66);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x55);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x55);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x45);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x43);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x44);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xE7);
    atk_md0350_fsmc_write_dat(0x32);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x55);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x76);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x66);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x67);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x67);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x87);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x99);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xBB);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x99);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x77);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x44);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x56);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x23);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x33);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x45);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xE8);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x99);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x87);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x88);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x77);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x66);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x88);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xAA);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0xBB);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x99);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x66);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x55);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x55);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x44);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x44);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x55);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xE9);
    atk_md0350_fsmc_write_dat(0xAA);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0x00);
    atk_md0350_fsmc_write_dat(0xAA);
    atk_md0350_fsmc_write_cmd(0xCF);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xF0);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x50);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xF3);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0xF9);
    atk_md0350_fsmc_write_dat(0x06);
    atk_md0350_fsmc_write_dat(0x10);
    atk_md0350_fsmc_write_dat(0x29);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0x3A);
    atk_md0350_fsmc_write_dat(0x55);
    atk_md0350_fsmc_write_cmd(0x11);
    HAL_Delay(100);
    // delay_ms(100);
    atk_md0350_fsmc_write_cmd(0x29);
    atk_md0350_fsmc_write_cmd(0x35);
    atk_md0350_fsmc_write_dat(0x00);
    atk_md0350_fsmc_write_cmd(0x51);
    atk_md0350_fsmc_write_dat(0xFF);
    atk_md0350_fsmc_write_cmd(0x53);
    atk_md0350_fsmc_write_dat(0x2C);
    atk_md0350_fsmc_write_cmd(0x55);
    atk_md0350_fsmc_write_dat(0x82);
    atk_md0350_fsmc_write_cmd(0x2C);
}

/**
 * @brief       设置ATK-MD0350模块列地址
 * @param       无
 * @retval      无
 */
static void atk_md0350_set_column_address(uint16_t sc, uint16_t ec)
{
    atk_md0350_fsmc_write_cmd(0x2A);
    atk_md0350_fsmc_write_dat((uint8_t)(sc >> 8) & 0xFF);
    atk_md0350_fsmc_write_dat((uint8_t)sc & 0xFF);
    atk_md0350_fsmc_write_dat((uint8_t)(ec >> 8) & 0xFF);
    atk_md0350_fsmc_write_dat((uint8_t)ec & 0xFF);
}

/**
 * @brief       设置ATK-MD0350模块页地址
 * @param       无
 * @retval      无
 */
static void atk_md0350_set_page_address(uint16_t sp, uint16_t ep)
{
    atk_md0350_fsmc_write_cmd(0x2B);
    atk_md0350_fsmc_write_dat((uint8_t)(sp >> 8) & 0xFF);
    atk_md0350_fsmc_write_dat((uint8_t)sp & 0xFF);
    atk_md0350_fsmc_write_dat((uint8_t)(ep >> 8) & 0xFF);
    atk_md0350_fsmc_write_dat((uint8_t)ep & 0xFF);
}

/**
 * @brief       开始写ATK-MD0350模块显存
 * @param       无
 * @retval      无
 */
static void atk_md0350_start_write_memory(void)
{
    atk_md0350_fsmc_write_cmd(0x2C);
}

/**
 * @brief       开始读ATK-MD0350模块显存
 * @param       无
 * @retval      无
 */
static void atk_md0350_start_read_memory(void)
{
    atk_md0350_fsmc_write_cmd(0x2E);
}

/**
 * @brief       平方函数,x^y
 * @param       x: 底数
 *              y: 指数
 * @retval      x^y
 */
static uint32_t atk_md0350_pow(uint8_t x, uint8_t y)
{
    uint8_t loop;
    uint32_t res = 1;

    for (loop = 0; loop < y; loop++) {
        res *= x;
    }

    return res;
}

/**
 * @brief       ATK-MD0350模块初始化
 * @param       无
 * @retval      ATK_MD0350_EOK  : ATK_MD0350模块初始化成功
 *              ATK_MD0350_ERROR: ATK_MD0350模块初始化失败
 */
uint8_t atk_md0350_init(void)
{
    uint16_t chip_id;

    // atk_md0350_hw_init();               /* ATK-MD0350模块硬件初始化 */
    // atk_md0350_fsmc_init();             /* ATK-MD0350模块FSMC接口初始化 */
    chip_id = atk_md0350_get_chip_id(); /* 获取ATK-MD0350模块驱动器ID */
    if (chip_id != ATK_MD0350_CHIP_ID) {
        return ATK_MD0350_ERROR;
    } else {
        g_atk_md0350_sta.chip_id = chip_id;
        g_atk_md0350_sta.width   = ATK_MD0350_LCD_WIDTH;
        g_atk_md0350_sta.height  = ATK_MD0350_LCD_HEIGHT;
    }
    atk_md0350_reg_init();
    atk_md0350_set_disp_dir(ATK_MD0350_LCD_DISP_DIR_0);
    atk_md0350_clear(ATK_MD0350_WHITE);
    atk_md0350_display_on();
    atk_md0350_backlight_on();
#if (ATK_MD0350_USING_TOUCH != 0)
    atk_md0350_touch_init();
#endif

    return ATK_MD0350_EOK;
}

/**
 * @brief       获取ATK-MD0350模块LCD宽度
 * @param       无
 * @retval      ATK-MD0350模块LCD宽度
 */
uint16_t atk_md0350_get_lcd_width(void)
{
    return g_atk_md0350_sta.width;
}

/**
 * @brief       获取ATK-MD0350模块LCD高度
 * @param       无
 * @retval      ATK-MD0350模块LCD高度
 */
uint16_t atk_md0350_get_lcd_height(void)
{
    return g_atk_md0350_sta.height;
}

/**
 * @brief       开启ATK-MD0350模块LCD背光
 * @param       无
 * @retval      无
 */
void atk_md0350_backlight_on(void)
{
    HAL_GPIO_WritePin(lcd_bl_GPIO_Port, lcd_bl_Pin, GPIO_PIN_SET);
    //ATK_MD0350_BL(1);
}

/**
 * @brief       关闭ATK-MD0350模块LCD背光
 * @param       无
 * @retval      无
 */
void atk_md0350_backlight_off(void)
{
    HAL_GPIO_WritePin(lcd_bl_GPIO_Port, lcd_bl_Pin, GPIO_PIN_RESET);
    //ATK_MD0350_BL(0);
}

/**
 * @brief       开启ATK-MD0350模块LCD显示
 * @param       无
 * @retval      无
 */
void atk_md0350_display_on(void)
{
    atk_md0350_fsmc_write_cmd(0x29);
}

/**
 * @brief       关闭ATK-MD0350模块LCD显示
 * @param       无
 * @retval      无
 */
void atk_md0350_display_off(void)
{
    atk_md0350_fsmc_write_cmd(0x28);
}

/**
 * @brief       设置ATK-MD0350模块LCD扫描方向
 * @param       scan_dir: ATK_MD0350_LCD_SCAN_DIR_L2R_U2D: 从左到右,从上到下
 *                        ATK_MD0350_LCD_SCAN_DIR_L2R_D2U: 从左到右,从下到上
 *                        ATK_MD0350_LCD_SCAN_DIR_R2L_U2D: 从右到左,从上到下
 *                        ATK_MD0350_LCD_SCAN_DIR_R2L_D2U: 从右到左,从下到上
 *                        ATK_MD0350_LCD_SCAN_DIR_U2D_L2R: 从上到下,从左到右
 *                        ATK_MD0350_LCD_SCAN_DIR_U2D_R2L: 从上到下,从右到左
 *                        ATK_MD0350_LCD_SCAN_DIR_D2U_L2R: 从下到上,从左到右
 *                        ATK_MD0350_LCD_SCAN_DIR_D2U_R2L: 从下到上,从右到左
 * @retval      ATK_MD0350_EOK   : 设置ATK-MD0350模块LCD扫描方向成功
 *              ATK_MD0350_ERROR : 设置ATK-MD0350模块LCD扫描方向失败
 *               ATK_MD0350_EINVAL: 传入参数错误
 */
uint8_t atk_md0350_set_scan_dir(atk_md0350_lcd_scan_dir_t scan_dir)
{
    uint16_t reg36;

    switch (g_atk_md0350_sta.disp_dir) {
        case ATK_MD0350_LCD_DISP_DIR_0: {
            reg36 = (uint16_t)scan_dir;
            break;
        }
        case ATK_MD0350_LCD_DISP_DIR_90: {
            switch (scan_dir) {
                case ATK_MD0350_LCD_SCAN_DIR_L2R_U2D: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_U2D_R2L;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_L2R_D2U: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_U2D_L2R;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_R2L_U2D: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_D2U_R2L;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_R2L_D2U: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_D2U_L2R;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_U2D_L2R: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_R2L_U2D;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_U2D_R2L: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_R2L_D2U;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_D2U_L2R: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_L2R_U2D;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_D2U_R2L: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_L2R_D2U;
                    break;
                }
                default: {
                    return ATK_MD0350_EINVAL;
                }
            }
            break;
        }
        case ATK_MD0350_LCD_DISP_DIR_180: {
            switch (scan_dir) {
                case ATK_MD0350_LCD_SCAN_DIR_L2R_U2D: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_R2L_D2U;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_L2R_D2U: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_R2L_U2D;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_R2L_U2D: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_L2R_D2U;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_R2L_D2U: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_L2R_U2D;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_U2D_L2R: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_D2U_R2L;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_U2D_R2L: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_D2U_L2R;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_D2U_L2R: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_U2D_R2L;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_D2U_R2L: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_U2D_L2R;
                    break;
                }
                default: {
                    return ATK_MD0350_EINVAL;
                }
            }
            break;
        }
        case ATK_MD0350_LCD_DISP_DIR_270: {
            switch (scan_dir) {
                case ATK_MD0350_LCD_SCAN_DIR_L2R_U2D: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_D2U_L2R;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_L2R_D2U: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_D2U_R2L;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_R2L_U2D: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_U2D_L2R;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_R2L_D2U: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_U2D_R2L;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_U2D_L2R: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_L2R_D2U;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_U2D_R2L: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_L2R_U2D;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_D2U_L2R: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_R2L_D2U;
                    break;
                }
                case ATK_MD0350_LCD_SCAN_DIR_D2U_R2L: {
                    reg36 = ATK_MD0350_LCD_SCAN_DIR_R2L_U2D;
                    break;
                }
                default: {
                    return ATK_MD0350_EINVAL;
                }
            }
            break;
        }
        default: {
            return ATK_MD0350_ERROR;
        }
    }

    g_atk_md0350_sta.scan_dir = (atk_md0350_lcd_scan_dir_t)reg36;
    atk_md0350_fsmc_write_reg(0x36, reg36);
    atk_md0350_set_column_address(0, g_atk_md0350_sta.width - 1);
    atk_md0350_set_page_address(0, g_atk_md0350_sta.height - 1);

    return ATK_MD0350_EOK;
}

/**
 * @brief       设置ATK-MD0350模块LCD显示方向
 * @param       disp_dir: ATK_MD0350_LCD_DISP_DIR_0  : LCD顺时针旋转0°显示内容
 *                        ATK_MD0350_LCD_DISP_DIR_90 : LCD顺时针旋转90°显示内容
 *                        ATK_MD0350_LCD_DISP_DIR_180: LCD顺时针旋转180°显示内容
 *                        ATK_MD0350_LCD_DISP_DIR_270: LCD顺时针旋转270°显示内容
 * @retval      ATK_MD0350_EOK   : 设置ATK-MD0350模块LCD显示方向成功
 *              ATK_MD0350_EINVAL: 传入参数错误
 */
uint8_t atk_md0350_set_disp_dir(atk_md0350_lcd_disp_dir_t disp_dir)
{
    switch (disp_dir) {
        case ATK_MD0350_LCD_DISP_DIR_0: {
            g_atk_md0350_sta.width  = ATK_MD0350_LCD_WIDTH;
            g_atk_md0350_sta.height = ATK_MD0350_LCD_HEIGHT;
            break;
        }
        case ATK_MD0350_LCD_DISP_DIR_90: {
            g_atk_md0350_sta.width  = ATK_MD0350_LCD_HEIGHT;
            g_atk_md0350_sta.height = ATK_MD0350_LCD_WIDTH;
            break;
        }
        case ATK_MD0350_LCD_DISP_DIR_180: {
            g_atk_md0350_sta.width  = ATK_MD0350_LCD_WIDTH;
            g_atk_md0350_sta.height = ATK_MD0350_LCD_HEIGHT;
            break;
        }
        case ATK_MD0350_LCD_DISP_DIR_270: {
            g_atk_md0350_sta.width  = ATK_MD0350_LCD_HEIGHT;
            g_atk_md0350_sta.height = ATK_MD0350_LCD_WIDTH;
            break;
        }
        default: {
            return ATK_MD0350_EINVAL;
        }
    }

    g_atk_md0350_sta.disp_dir = disp_dir;
    atk_md0350_set_scan_dir(ATK_MD0350_LCD_SCAN_DIR_L2R_U2D);

    return ATK_MD0350_EOK;
}

/**
 * @brief       获取ATK-MD0350模块LCD扫描方向
 * @param       无
 * @retval      ATK-MD0350模块LCD扫描方向
 */
atk_md0350_lcd_scan_dir_t atk_md0350_get_scan_dir(void)
{
    return g_atk_md0350_sta.scan_dir;
}

/**
 * @brief       获取ATK-MD0350模块LCD显示方向
 * @param       无
 * @retval      ATK-MD0350模块LCD显示方向
 */
atk_md0350_lcd_disp_dir_t atk_md0350_get_disp_dir(void)
{
    return g_atk_md0350_sta.disp_dir;
}

/**
 * @brief       ATK-MD0350模块LCD区域填充
 * @param       xs   : 区域起始X坐标
 *              ys   : 区域起始Y坐标
 *              xe   : 区域终止X坐标
 *              ye   : 区域终止Y坐标
 *              color: 区域填充颜色
 * @retval      无
 */
void atk_md0350_fill(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye, uint16_t color)
{
    uint16_t x_index;
    uint16_t y_index;

    atk_md0350_set_column_address(xs, xe);
    atk_md0350_set_page_address(ys, ye);
    atk_md0350_start_write_memory();
    for (y_index = ys; y_index <= ye; y_index++) {
        for (x_index = xs; x_index <= xe; x_index++) {
            atk_md0350_fsmc_write_dat(color);
        }
    }
}

/**
 * @brief       ATK-MD0350模块LCD清屏
 * @param       color: 清屏颜色
 * @retval      无
 */
void atk_md0350_clear(uint16_t color)
{
    atk_md0350_fill(0, 0, ATK_MD0350_LCD_WIDTH - 1, ATK_MD0350_LCD_HEIGHT - 1, color);
}

/**
 * @brief       ATK-MD0350模块LCD画点
 * @param       x    : 待画点的X坐标
 *              y    : 待画点的Y坐标
 *              color: 待画点的颜色
 * @retval      无
 */
void atk_md0350_draw_point(uint16_t x, uint16_t y, uint16_t color)
{
    atk_md0350_set_column_address(x, x);
    atk_md0350_set_page_address(y, y);
    atk_md0350_start_write_memory();
    atk_md0350_fsmc_write_dat(color);
}

/**
 * @brief       ATK-MD0350模块LCD读点
 * @param       x    : 待读点的X坐标
 *              y    : 待读点的Y坐标
 * @retval      待读点的颜色
 */
uint16_t atk_md0350_read_point(uint16_t x, uint16_t y)
{
    uint16_t color;
    uint8_t color_r;
    uint8_t color_g;
    uint8_t color_b;

    if ((x >= g_atk_md0350_sta.width) || (y >= g_atk_md0350_sta.height)) {
        return ATK_MD0350_EINVAL;
    }

    atk_md0350_set_column_address(x, x);
    atk_md0350_set_page_address(y, y);
    atk_md0350_start_read_memory();

    color   = atk_md0350_fsmc_read_dat(); /* Dummy */
    color   = atk_md0350_fsmc_read_dat(); /* [15:11]: R, [7:2]:G */
    color_r = (uint8_t)(color >> 11) & 0x1F;
    color_g = (uint8_t)(color >> 2) & 0x3F;
    color   = atk_md0350_fsmc_read_dat(); /* [15:11]: B */
    color_b = (uint8_t)(color >> 11) & 0x1F;

    return (uint16_t)(color_r << 11) | (color_g << 5) | color_b;
}

/**
 * @brief       ATK-MD0350模块LCD画线段
 * @param       x1   : 待画线段端点1的X坐标
 *              y1   : 待画线段端点1的Y坐标
 *              x2   : 待画线段端点2的X坐标
 *              y2   : 待画线段端点2的Y坐标
 *              color: 待画线段的颜色
 * @retval      无
 */
void atk_md0350_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color)
{
    uint16_t x_delta;
    uint16_t y_delta;
    int16_t x_sign;
    int16_t y_sign;
    int16_t error;
    int16_t error2;

    x_delta = (x1 < x2) ? (x2 - x1) : (x1 - x2);
    y_delta = (y1 < y2) ? (y2 - y1) : (y1 - y2);
    x_sign  = (x1 < x2) ? 1 : -1;
    y_sign  = (y1 < y2) ? 1 : -1;
    error   = x_delta - y_delta;

    atk_md0350_draw_point(x2, y2, color);

    while ((x1 != x2) || (y1 != y2)) {
        atk_md0350_draw_point(x1, y1, color);

        error2 = error << 1;
        if (error2 > -y_delta) {
            error -= y_delta;
            x1 += x_sign;
        }

        if (error2 < x_delta) {
            error += x_delta;
            y1 += y_sign;
        }
    }
}

/**
 * @brief       ATK-MD0350模块LCD画矩形框
 * @param       x1   : 待画矩形框端点1的X坐标
 *              y1   : 待画矩形框端点1的Y坐标
 *              x2   : 待画矩形框端点2的X坐标
 *              y2   : 待画矩形框端点2的Y坐标
 *              color: 待画矩形框的颜色
 * @retval      无
 */
void atk_md0350_draw_rect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color)
{
    atk_md0350_draw_line(x1, y1, x2, y1, color);
    atk_md0350_draw_line(x1, y2, x2, y2, color);
    atk_md0350_draw_line(x1, y1, x1, y2, color);
    atk_md0350_draw_line(x2, y1, x2, y2, color);
}

/**
 * @brief       ATK-MD0350模块LCD画圆形框
 * @param       x    : 待画圆形框原点的X坐标
 *              y    : 待画圆形框原点的Y坐标
 *              r    : 待画圆形框的半径
 *              color: 待画圆形框的颜色
 * @retval      无
 */
void atk_md0350_draw_circle(uint16_t x, uint16_t y, uint16_t r, uint16_t color)
{
    int32_t x_t;
    int32_t y_t;
    int32_t error;
    int32_t error2;

    x_t   = -r;
    y_t   = 0;
    error = 2 - 2 * r;

    do {
        atk_md0350_draw_point(x - x_t, y + y_t, color);
        atk_md0350_draw_point(x + x_t, y + y_t, color);
        atk_md0350_draw_point(x + x_t, y - y_t, color);
        atk_md0350_draw_point(x - x_t, y - y_t, color);

        error2 = error;
        if (error2 <= y_t) {
            y_t++;
            error = error + (y_t * 2 + 1);
            if ((-x_t == y_t) && (error2 <= x_t)) {
                error2 = 0;
            }
        }

        if (error2 > x_t) {
            x_t++;
            error = error + (x_t * 2 + 1);
        }
    } while (x_t <= 0);
}

/**
 * @brief       ATK-MD0350模块LCD显示1个字符
 * @param       x    : 待显示字符的X坐标
 *              y    : 待显示字符的Y坐标
 *              ch   : 待显示字符
 *              font : 待显示字符的字体
 *              color: 待显示字符的颜色
 * @retval      无
 */
void atk_md0350_show_char(uint16_t x, uint16_t y, char ch, atk_md0350_lcd_font_t font, uint16_t color)
{
    const uint8_t *ch_code;
    uint8_t ch_width;
    uint8_t ch_height;
    uint8_t ch_size;
    uint8_t ch_offset;
    uint8_t byte_index;
    uint8_t byte_code;
    uint8_t bit_index;
    uint8_t width_index  = 0;
    uint8_t height_index = 0;

    ch_offset = ch - ' ';

    switch (font) {
#if (ATK_MD0350_FONT_12 != 0)
        case ATK_MD0350_LCD_FONT_12: {
            ch_code   = atk_md0350_font_1206[ch_offset];
            ch_width  = ATK_MD0350_FONT_12_CHAR_WIDTH;
            ch_height = ATK_MD0350_FONT_12_CHAR_HEIGHT;
            ch_size   = ATK_MD0350_FONT_12_CHAR_SIZE;
            break;
        }
#endif
#if (ATK_MD0350_FONT_16 != 0)
        case ATK_MD0350_LCD_FONT_16: {
            ch_code   = atk_md0350_font_1608[ch_offset];
            ch_width  = ATK_MD0350_FONT_16_CHAR_WIDTH;
            ch_height = ATK_MD0350_FONT_16_CHAR_HEIGHT;
            ch_size   = ATK_MD0350_FONT_16_CHAR_SIZE;
            break;
        }
#endif
#if (ATK_MD0350_FONT_24 != 0)
        case ATK_MD0350_LCD_FONT_24: {
            ch_code   = atk_md0350_font_2412[ch_offset];
            ch_width  = ATK_MD0350_FONT_24_CHAR_WIDTH;
            ch_height = ATK_MD0350_FONT_24_CHAR_HEIGHT;
            ch_size   = ATK_MD0350_FONT_24_CHAR_SIZE;
            break;
        }
#endif
#if (ATK_MD0350_FONT_32 != 0)
        case ATK_MD0350_LCD_FONT_32: {
            ch_code   = atk_md0350_font_3216[ch_offset];
            ch_width  = ATK_MD0350_FONT_32_CHAR_WIDTH;
            ch_height = ATK_MD0350_FONT_32_CHAR_HEIGHT;
            ch_size   = ATK_MD0350_FONT_32_CHAR_SIZE;
            break;
        }
#endif
        default: {
            return;
        }
    }

    if ((x + ch_width > ATK_MD0350_LCD_WIDTH) || (y + ch_height > ATK_MD0350_LCD_HEIGHT)) {
        return;
    }

    for (byte_index = 0; byte_index < ch_size; byte_index++) {
        byte_code = ch_code[byte_index];
        for (bit_index = 0; bit_index < 8; bit_index++) {
            if ((byte_code & 0x80) != 0) {
                atk_md0350_draw_point(x + width_index, y + height_index, color);
            }
            width_index++;
            if (width_index == ch_width) {
                width_index = 0;
                height_index++;
                break;
            }
            byte_code <<= 1;
        }
    }
}

/**
 * @brief       ATK-MD0350模块LCD显示字符串
 * @note        会自动换行和换页
 * @param       x     : 待显示字符串的X坐标
 *              y     : 待显示字符串的Y坐标
 *              width : 待显示字符串的显示高度
 *              height: 待显示字符串的显示宽度
 *              str   : 待显示字符串
 *              font  : 待显示字符串的字体
 *              color : 待显示字符串的颜色
 * @retval      无
 */
void atk_md0350_show_string(uint16_t x, uint16_t y, uint16_t width, uint16_t height, char *str, atk_md0350_lcd_font_t font, uint16_t color)
{
    uint8_t ch_width;
    uint8_t ch_height;
    uint16_t x_raw;
    uint16_t y_raw;
    uint16_t x_limit;
    uint16_t y_limit;

    switch (font) {
#if (ATK_MD0350_FONT_12 != 0)
        case ATK_MD0350_LCD_FONT_12: {
            ch_width  = ATK_MD0350_FONT_12_CHAR_WIDTH;
            ch_height = ATK_MD0350_FONT_12_CHAR_HEIGHT;
            break;
        }
#endif
#if (ATK_MD0350_FONT_16 != 0)
        case ATK_MD0350_LCD_FONT_16: {
            ch_width  = ATK_MD0350_FONT_16_CHAR_WIDTH;
            ch_height = ATK_MD0350_FONT_16_CHAR_HEIGHT;
            break;
        }
#endif
#if (ATK_MD0350_FONT_24 != 0)
        case ATK_MD0350_LCD_FONT_24: {
            ch_width  = ATK_MD0350_FONT_24_CHAR_WIDTH;
            ch_height = ATK_MD0350_FONT_24_CHAR_HEIGHT;
            break;
        }
#endif
#if (ATK_MD0350_FONT_32 != 0)
        case ATK_MD0350_LCD_FONT_32: {
            ch_width  = ATK_MD0350_FONT_32_CHAR_WIDTH;
            ch_height = ATK_MD0350_FONT_32_CHAR_HEIGHT;
            break;
        }
#endif
        default: {
            return;
        }
    }

    x_raw   = x;
    y_raw   = y;
    x_limit = ((x + width + 1) > ATK_MD0350_LCD_WIDTH) ? ATK_MD0350_LCD_WIDTH : (x + width + 1);
    y_limit = ((y + height + 1) > ATK_MD0350_LCD_HEIGHT) ? ATK_MD0350_LCD_HEIGHT : (y + height + 1);

    while ((*str >= ' ') && (*str <= '~')) {
        if (x + ch_width >= x_limit) {
            x = x_raw;
            y += ch_height;
        }

        if (y + ch_height >= y_limit) {
            y = x_raw;
            x = y_raw;
        }

        atk_md0350_show_char(x, y, *str, font, color);

        x += ch_width;
        str++;
    }
}

/**
 * @brief       ATK-MD0350模块LCD显示数字,可控制显示高位0
 * @param       x    : 待显示数字的X坐标
 *              y    : 待显示数字的Y坐标
 *              num  : 待显示数字
 *              len  : 待显示数字的位数
 *              mode : ATK_MD0350_NUM_SHOW_NOZERO: 数字高位0不显示
 *                     ATK_MD0350_NUM_SHOW_ZERO  : 数字高位0显示
 *              font : 待显示数字的字体
 *              color: 待显示数字的颜色
 * @retval      无
 */
void atk_md0350_show_xnum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, atk_md0350_num_mode_t mode, atk_md0350_lcd_font_t font, uint16_t color)
{
    uint8_t ch_width;
    uint8_t len_index;
    uint8_t num_index;
    uint8_t first_nozero = 0;
    char pad;

    switch (font) {
#if (ATK_MD0350_FONT_12 != 0)
        case ATK_MD0350_LCD_FONT_12: {
            ch_width = ATK_MD0350_FONT_12_CHAR_WIDTH;
            break;
        }
#endif
#if (ATK_MD0350_FONT_16 != 0)
        case ATK_MD0350_LCD_FONT_16: {
            ch_width = ATK_MD0350_FONT_16_CHAR_WIDTH;
            break;
        }
#endif
#if (ATK_MD0350_FONT_24 != 0)
        case ATK_MD0350_LCD_FONT_24: {
            ch_width = ATK_MD0350_FONT_24_CHAR_WIDTH;
            break;
        }
#endif
#if (ATK_MD0350_FONT_32 != 0)
        case ATK_MD0350_LCD_FONT_32: {
            ch_width = ATK_MD0350_FONT_32_CHAR_WIDTH;
            break;
        }
#endif
        default: {
            return;
        }
    }

    switch (mode) {
        case ATK_MD0350_NUM_SHOW_NOZERO: {
            pad = ' ';
            break;
        }
        case ATK_MD0350_NUM_SHOW_ZERO: {
            pad = '0';
            break;
        }
        default: {
            return;
        }
    }

    for (len_index = 0; len_index < len; len_index++) {
        num_index = (num / atk_md0350_pow(10, len - len_index - 1)) % 10;
        if ((first_nozero == 0) && (len_index < (len - 1))) {
            if (num_index == 0) {
                atk_md0350_show_char(x + ch_width * len_index, y, pad, font, color);
                continue;
            } else {
                first_nozero = 1;
            }
        }

        atk_md0350_show_char(x + ch_width * len_index, y, num_index + '0', font, color);
    }
}

/**
 * @brief       ATK-MD0350模块LCD显示数字,不显示高位0
 * @param       x    : 待显示数字的X坐标
 *              y    : 待显示数字的Y坐标
 *              num  : 待显示数字
 *              len  : 待显示数字的位数
 *              font : 待显示数字的字体
 *              color: 待显示数字的颜色
 * @retval      无
 */
void atk_md0350_show_num(uint16_t x, uint16_t y, uint32_t num, uint8_t len, atk_md0350_lcd_font_t font, uint16_t color)
{
    atk_md0350_show_xnum(x, y, num, len, ATK_MD0350_NUM_SHOW_NOZERO, font, color);
}

/**
 * @brief       ATK-MD0350模块LCD图片
 * @note        图片取模方式: 水平扫描、RGB565、高位在前
 * @param       x     : 待显示图片的X坐标
 *              y     : 待显示图片的Y坐标
 *              width : 待显示图片的宽度
 *              height: 待显示图片的高度
 *              pic   : 待显示图片数组首地址
 * @retval      无
 */
void atk_md0350_show_pic(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t *pic)
{
    uint16_t x_index;
    uint16_t y_index;

    if ((x + width > ATK_MD0350_LCD_WIDTH) || (y + height > ATK_MD0350_LCD_HEIGHT)) {
        return;
    }

    atk_md0350_set_column_address(x, x + width - 1);
    atk_md0350_set_page_address(y, y + height - 1);
    atk_md0350_start_write_memory();
    for (y_index = y; y_index <= (y + height); y_index++) {
        for (x_index = x; x_index <= (x + width); x_index++) {
            atk_md0350_fsmc_write_dat(*pic);
            pic++;
        }
    }
}

atk_md0350.h

/**
 ****************************************************************************************************
 * @file        atk_md0350.h
 * @author      正点原子团队(ALIENTEK)
 * @version     V1.0
 * @date        2022-06-21
 * @brief       ATK-MD0350模块驱动代码
 * @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:正点原子 STM32F103开发板
 * 在线视频:www.yuanzige.com
 * 技术论坛:www.openedv.com
 * 公司网址:www.alientek.com
 * 购买地址:openedv.taobao.com
 *
 ****************************************************************************************************
 */

#ifndef __ATK_MD0350_H
#define __ATK_MD0350_H

// #include "./SYSTEM/sys/sys.h"
#include "main.h"

/* 定义ATK-MD0350模块LCD尺寸 */
#define ATK_MD0350_LCD_WIDTH  320
#define ATK_MD0350_LCD_HEIGHT 480

/* 定义是否使用ATK-MD0350模块触摸 */
#define ATK_MD0350_USING_TOUCH 0

/* 定义ATK-MD0350模块启用的字体 */
#define ATK_MD0350_FONT_12 1
#define ATK_MD0350_FONT_16 1
#define ATK_MD0350_FONT_24 1
#define ATK_MD0350_FONT_32 1

/* 默认启用触摸 */
#ifndef ATK_MD0350_USING_TOUCH
#define ATK_MD0350_USING_TOUCH 1
#endif

/* 默认启用12号字体 */
#if ((ATK_MD0350_FONT_12 == 0) && (ATK_MD0350_FONT_16 == 0) && (ATK_MD0350_FONT_24 == 0) && (ATK_MD0350_FONT_32 == 0))
#undef ATK_MD0350_FONT_12
#defien ATK_MD0350_FONT_12 1
#endif

/* 包含头文件 */
#if (ATK_MD0350_USING_TOUCH != 0)
#include "./BSP/ATK_MD0350/atk_md0350_touch.h"
#endif

/* 引脚定义 */
#define ATK_MD0350_BL_GPIO_PORT GPIOB
#define ATK_MD0350_BL_GPIO_PIN  GPIO_PIN_0
#define ATK_MD0350_BL_GPIO_CLK_ENABLE() \
    do {                                \
        __HAL_RCC_GPIOB_CLK_ENABLE();   \
    } while (0)

/* IO操作 */
#define ATK_MD0350_BL(x)                                                                                                                                                           \
    do {                                                                                                                                                                           \
        x ? HAL_GPIO_WritePin(ATK_MD0350_BL_GPIO_PORT, ATK_MD0350_BL_GPIO_PIN, GPIO_PIN_SET) : HAL_GPIO_WritePin(ATK_MD0350_BL_GPIO_PORT, ATK_MD0350_BL_GPIO_PIN, GPIO_PIN_RESET); \
    } while (0)

/* ATK-MD0350模块LCD扫描方向枚举 */
typedef enum {
    ATK_MD0350_LCD_SCAN_DIR_L2R_U2D = 0x0000, /* 从左到右,从上到下 */
    ATK_MD0350_LCD_SCAN_DIR_L2R_D2U = 0x0080, /* 从左到右,从下到上 */
    ATK_MD0350_LCD_SCAN_DIR_R2L_U2D = 0x0040, /* 从右到左,从上到下 */
    ATK_MD0350_LCD_SCAN_DIR_R2L_D2U = 0x00C0, /* 从右到左,从下到上 */
    ATK_MD0350_LCD_SCAN_DIR_U2D_L2R = 0x0020, /* 从上到下,从左到右 */
    ATK_MD0350_LCD_SCAN_DIR_U2D_R2L = 0x0060, /* 从上到下,从右到左 */
    ATK_MD0350_LCD_SCAN_DIR_D2U_L2R = 0x00A0, /* 从下到上,从左到右 */
    ATK_MD0350_LCD_SCAN_DIR_D2U_R2L = 0x00E0, /* 从下到上,从右到左 */
} atk_md0350_lcd_scan_dir_t;

/* ATK-MD0350模块LCD旋转方向枚举 */
typedef enum {
    ATK_MD0350_LCD_DISP_DIR_0 = 0x00, /* LCD顺时针旋转0°显示内容 */
    ATK_MD0350_LCD_DISP_DIR_90,       /* LCD顺时针旋转90°显示内容 */
    ATK_MD0350_LCD_DISP_DIR_180,      /* LCD顺时针旋转180°显示内容 */
    ATK_MD0350_LCD_DISP_DIR_270,      /* LCD顺时针旋转270°显示内容 */
} atk_md0350_lcd_disp_dir_t;

/* ATK-MD0350模块LCD显示字体枚举 */
typedef enum {
#if (ATK_MD0350_FONT_12 != 0)
    ATK_MD0350_LCD_FONT_12, /* 12号字体 */
#endif
#if (ATK_MD0350_FONT_16 != 0)
    ATK_MD0350_LCD_FONT_16, /* 16号字体 */
#endif
#if (ATK_MD0350_FONT_24 != 0)
    ATK_MD0350_LCD_FONT_24, /* 24号字体 */
#endif
#if (ATK_MD0350_FONT_32 != 0)
    ATK_MD0350_LCD_FONT_32, /* 32号字体 */
#endif
} atk_md0350_lcd_font_t;

/* ATK-MD0350模块LCD显示数字模式枚举 */
typedef enum {
    ATK_MD0350_NUM_SHOW_NOZERO = 0x00, /* 数字高位0不显示 */
    ATK_MD0350_NUM_SHOW_ZERO,          /* 数字高位0显示 */
} atk_md0350_num_mode_t;

/* 常用颜色定义(RGB565) */
#define ATK_MD0350_WHITE   0xFFFF
#define ATK_MD0350_BLACK   0x0000
#define ATK_MD0350_BLUE    0x001F
#define ATK_MD0350_BRED    0XF81F
#define ATK_MD0350_GRED    0XFFE0
#define ATK_MD0350_GBLUE   0X07FF
#define ATK_MD0350_RED     0xF800
#define ATK_MD0350_MAGENTA 0xF81F
#define ATK_MD0350_GREEN   0x07E0
#define ATK_MD0350_CYAN    0x7FFF
#define ATK_MD0350_YELLOW  0xFFE0
#define ATK_MD0350_BROWN   0XBC40
#define ATK_MD0350_BRRED   0XFC07
#define ATK_MD0350_GRAY    0X8430

/* 错误代码 */
#define ATK_MD0350_EOK    0 /* 没有错误 */
#define ATK_MD0350_ERROR  1 /* 错误 */
#define ATK_MD0350_EINVAL 2 /* 非法参数 */

/* 操作函数 */
uint8_t atk_md0350_init(void);                                                                                                                        /* ATK-MD0350模块初始化 */
uint16_t atk_md0350_get_lcd_width(void);                                                                                                              /* 获取ATK-MD0350模块LCD宽度 */
uint16_t atk_md0350_get_lcd_height(void);                                                                                                             /* 获取ATK-MD0350模块LCD高度 */
void atk_md0350_backlight_on(void);                                                                                                                   /* 开启ATK-MD0350模块LCD背光 */
void atk_md0350_backlight_off(void);                                                                                                                  /* 关闭ATK-MD0350模块LCD背光 */
void atk_md0350_display_on(void);                                                                                                                     /* 开启ATK-MD0350模块LCD显示 */
void atk_md0350_display_off(void);                                                                                                                    /* 关闭ATK-MD0350模块LCD显示 */
uint8_t atk_md0350_set_scan_dir(atk_md0350_lcd_scan_dir_t scan_dir);                                                                                  /* 设置ATK-MD0350模块LCD扫描方向 */
uint8_t atk_md0350_set_disp_dir(atk_md0350_lcd_disp_dir_t disp_dir);                                                                                  /* 设置ATK-MD0350模块LCD显示方向 */
atk_md0350_lcd_scan_dir_t atk_md0350_get_scan_dir(void);                                                                                              /* 获取ATK-MD0350模块LCD扫描方向 */
atk_md0350_lcd_disp_dir_t atk_md0350_get_disp_dir(void);                                                                                              /* 获取ATK-MD0350模块LCD显示方向 */
void atk_md0350_fill(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye, uint16_t color);                                                             /* ATK-MD0350模块LCD区域填充 */
void atk_md0350_clear(uint16_t color);                                                                                                                /* ATK-MD0350模块LCD清屏 */
void atk_md0350_draw_point(uint16_t x, uint16_t y, uint16_t color);                                                                                   /* ATK-MD0350模块LCD画点 */
uint16_t atk_md0350_read_point(uint16_t x, uint16_t y);                                                                                               /* ATK-MD0350模块LCD读点 */
void atk_md0350_draw_line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);                                                        /* ATK-MD0350模块LCD画线段 */
void atk_md0350_draw_rect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);                                                        /* ATK-MD0350模块LCD画矩形框 */
void atk_md0350_draw_circle(uint16_t x, uint16_t y, uint16_t r, uint16_t color);                                                                      /* ATK-MD0350模块LCD画圆形框 */
void atk_md0350_show_char(uint16_t x, uint16_t y, char ch, atk_md0350_lcd_font_t font, uint16_t color);                                               /* ATK-MD0350模块LCD显示1个字符 */
void atk_md0350_show_string(uint16_t x, uint16_t y, uint16_t width, uint16_t height, char *str, atk_md0350_lcd_font_t font, uint16_t color);          /* ATK-MD0350模块LCD显示字符串 */
void atk_md0350_show_xnum(uint16_t x, uint16_t y, uint32_t num, uint8_t len, atk_md0350_num_mode_t mode, atk_md0350_lcd_font_t font, uint16_t color); /* ATK-MD0350模块LCD显示数字,可控制显示高位0 */
void atk_md0350_show_num(uint16_t x, uint16_t y, uint32_t num, uint8_t len, atk_md0350_lcd_font_t font, uint16_t color);                              /* ATK-MD0350模块LCD显示数字,不显示高位0 */
void atk_md0350_show_pic(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t *pic);                                                      /* ATK-MD0350模块LCD图片 */

#endif

atk_md0350_font.h

/**
 ****************************************************************************************************
 * @file        atk_md0350_font.h
 * @author      正点原子团队(ALIENTEK)
 * @version     V1.0
 * @date        2022-06-21
 * @brief       ATK-MD0350模块体取模文件
 * @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:正点原子 STM32F103开发板
 * 在线视频:www.yuanzige.com
 * 技术论坛:www.openedv.com
 * 公司网址:www.alientek.com
 * 购买地址:openedv.taobao.com
 *
 ****************************************************************************************************
 */

#ifndef __ATK_MD0350_FONT_H
#define __ATK_MD0350_FONT_H

#include "atk_md0350.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...)
 */

#if (ATK_MD0350_FONT_12 != 0)
#define ATK_MD0350_FONT_12_CHAR_WIDTH   6
#define ATK_MD0350_FONT_12_CHAR_HEIGHT  12
#define ATK_MD0350_FONT_12_CHAR_SIZE    12
/* 12*6 ASCII字符点阵 */
const uint8_t atk_md0350_font_1206[95][ATK_MD0350_FONT_12_CHAR_SIZE] = {
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* " ",0 */
    {0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00},   /* "!",1 */
    {0x28, 0x28, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* """,2 */
    {0x00, 0x00, 0x50, 0x50, 0xF8, 0x50, 0x50, 0xF8, 0x50, 0x50, 0x00, 0x00},   /* "#",3 */
    {0x00, 0x20, 0x70, 0xA8, 0xA0, 0x60, 0x30, 0x28, 0xA8, 0x70, 0x20, 0x00},   /* "$",4 */
    {0x00, 0x00, 0x48, 0xA8, 0xB0, 0xA8, 0x74, 0x34, 0x54, 0x48, 0x00, 0x00},   /* "%",5 */
    {0x00, 0x00, 0x20, 0x50, 0x50, 0x6C, 0xA8, 0xA8, 0x94, 0x68, 0x00, 0x00},   /* "&",6 */
    {0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "'",7 */
    {0x08, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x08, 0x00},   /* "(",8 */
    {0x40, 0x20, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x20, 0x40, 0x00},   /* ")",9 */
    {0x00, 0x00, 0x00, 0x20, 0xA8, 0x70, 0x70, 0xA8, 0x20, 0x00, 0x00, 0x00},   /* "*",10 */
    {0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00},   /* "+",11 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x80, 0x00},   /* ",",12 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "-",13 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00},   /* ".",14 */
    {0x00, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x80, 0x00},   /* "/",15 */
    {0x00, 0x00, 0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00},   /* "0",16 */
    {0x00, 0x00, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, 0x00},   /* "1",17 */
    {0x00, 0x00, 0x70, 0x88, 0x88, 0x10, 0x20, 0x40, 0x80, 0xF8, 0x00, 0x00},   /* "2",18 */
    {0x00, 0x00, 0x70, 0x88, 0x08, 0x30, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00},   /* "3",19 */
    {0x00, 0x00, 0x10, 0x30, 0x30, 0x50, 0x90, 0xF8, 0x10, 0x38, 0x00, 0x00},   /* "4",20 */
    {0x00, 0x00, 0xF8, 0x80, 0x80, 0xF0, 0x88, 0x08, 0x88, 0x70, 0x00, 0x00},   /* "5",21 */
    {0x00, 0x00, 0x30, 0x48, 0x80, 0xB0, 0xC8, 0x88, 0x88, 0x70, 0x00, 0x00},   /* "6",22 */
    {0x00, 0x00, 0x78, 0x08, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00},   /* "7",23 */
    {0x00, 0x00, 0x70, 0x88, 0x88, 0x70, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00},   /* "8",24 */
    {0x00, 0x00, 0x70, 0x88, 0x88, 0x98, 0x68, 0x08, 0x90, 0x60, 0x00, 0x00},   /* "9",25 */
    {0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00},   /* ":",26 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00},   /* ";",27 */
    {0x00, 0x00, 0x08, 0x10, 0x20, 0x40, 0x40, 0x20, 0x10, 0x08, 0x00, 0x00},   /* "<",28 */
    {0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "=",29 */
    {0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00},   /* ">",30 */
    {0x00, 0x00, 0x70, 0x88, 0x88, 0x10, 0x20, 0x20, 0x00, 0x20, 0x00, 0x00},   /* "?",31 */
    {0x00, 0x00, 0x38, 0x44, 0x94, 0xB4, 0xB4, 0xB8, 0x44, 0x38, 0x00, 0x00},   /* "@",32 */
    {0x00, 0x00, 0x20, 0x20, 0x30, 0x50, 0x50, 0x78, 0x48, 0xCC, 0x00, 0x00},   /* "A",33 */
    {0x00, 0x00, 0xF0, 0x48, 0x48, 0x70, 0x48, 0x48, 0x48, 0xF0, 0x00, 0x00},   /* "B",34 */
    {0x00, 0x00, 0x78, 0x88, 0x80, 0x80, 0x80, 0x80, 0x88, 0x70, 0x00, 0x00},   /* "C",35 */
    {0x00, 0x00, 0xF0, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0xF0, 0x00, 0x00},   /* "D",36 */
    {0x00, 0x00, 0xF8, 0x48, 0x50, 0x70, 0x50, 0x40, 0x48, 0xF8, 0x00, 0x00},   /* "E",37 */
    {0x00, 0x00, 0xF8, 0x48, 0x50, 0x70, 0x50, 0x40, 0x40, 0xE0, 0x00, 0x00},   /* "F",38 */
    {0x00, 0x00, 0x38, 0x48, 0x80, 0x80, 0x9C, 0x88, 0x48, 0x30, 0x00, 0x00},   /* "G",39 */
    {0x00, 0x00, 0xCC, 0x48, 0x48, 0x78, 0x48, 0x48, 0x48, 0xCC, 0x00, 0x00},   /* "H",40 */
    {0x00, 0x00, 0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xF8, 0x00, 0x00},   /* "I",41 */
    {0x00, 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x90, 0xE0},   /* "J",42 */
    {0x00, 0x00, 0xEC, 0x48, 0x50, 0x60, 0x50, 0x48, 0x48, 0xEC, 0x00, 0x00},   /* "K",43 */
    {0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x44, 0xFC, 0x00, 0x00},   /* "L",44 */
    {0x00, 0x00, 0xDC, 0xD8, 0xD8, 0xD8, 0xA8, 0xA8, 0xA8, 0xAC, 0x00, 0x00},   /* "M",45 */
    {0x00, 0x00, 0xDC, 0x48, 0x68, 0x68, 0x58, 0x58, 0x48, 0xE8, 0x00, 0x00},   /* "N",46 */
    {0x00, 0x00, 0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00},   /* "O",47 */
    {0x00, 0x00, 0xF0, 0x48, 0x48, 0x70, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00},   /* "P",48 */
    {0x00, 0x00, 0x70, 0x88, 0x88, 0x88, 0x88, 0xE8, 0x98, 0x70, 0x18, 0x00},   /* "Q",49 */
    {0x00, 0x00, 0xF0, 0x48, 0x48, 0x70, 0x50, 0x48, 0x48, 0xEC, 0x00, 0x00},   /* "R",50 */
    {0x00, 0x00, 0x78, 0x88, 0x80, 0x60, 0x10, 0x08, 0x88, 0xF0, 0x00, 0x00},   /* "S",51 */
    {0x00, 0x00, 0xF8, 0xA8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, 0x00},   /* "T",52 */
    {0x00, 0x00, 0xCC, 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, 0x30, 0x00, 0x00},   /* "U",53 */
    {0x00, 0x00, 0xCC, 0x48, 0x48, 0x50, 0x50, 0x30, 0x20, 0x20, 0x00, 0x00},   /* "V",54 */
    {0x00, 0x00, 0xA8, 0xA8, 0xA8, 0xA8, 0x70, 0x50, 0x50, 0x50, 0x00, 0x00},   /* "W",55 */
    {0x00, 0x00, 0xD8, 0x50, 0x50, 0x20, 0x20, 0x50, 0x50, 0xD8, 0x00, 0x00},   /* "X",56 */
    {0x00, 0x00, 0xD8, 0x50, 0x50, 0x50, 0x20, 0x20, 0x20, 0x70, 0x00, 0x00},   /* "Y",57 */
    {0x00, 0x00, 0xF8, 0x90, 0x10, 0x20, 0x20, 0x40, 0x48, 0xF8, 0x00, 0x00},   /* "Z",58 */
    {0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, 0x00},   /* "[",59 */
    {0x00, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x08, 0x08, 0x00},   /* "\",60 */
    {0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x70, 0x00},   /* "]",61 */
    {0x20, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "^",62 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC},   /* "_",63 */
    {0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "`",64 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x48, 0x38, 0x48, 0x3C, 0x00, 0x00},   /* "a",65 */
    {0x00, 0xC0, 0x40, 0x40, 0x40, 0x70, 0x48, 0x48, 0x48, 0x70, 0x00, 0x00},   /* "b",66 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x48, 0x40, 0x48, 0x30, 0x00, 0x00},   /* "c",67 */
    {0x00, 0x18, 0x08, 0x08, 0x08, 0x38, 0x48, 0x48, 0x48, 0x3C, 0x00, 0x00},   /* "d",68 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x48, 0x78, 0x40, 0x38, 0x00, 0x00},   /* "e",69 */
    {0x00, 0x18, 0x24, 0x20, 0x20, 0x78, 0x20, 0x20, 0x20, 0x78, 0x00, 0x00},   /* "f",70 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x48, 0x30, 0x40, 0x38, 0x44, 0x38},   /* "g",71 */
    {0x00, 0xC0, 0x40, 0x40, 0x40, 0x70, 0x48, 0x48, 0x48, 0xEC, 0x00, 0x00},   /* "h",72 */
    {0x00, 0x20, 0x20, 0x00, 0x00, 0x60, 0x20, 0x20, 0x20, 0x70, 0x00, 0x00},   /* "i",73 */
    {0x00, 0x10, 0x10, 0x00, 0x00, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0xE0},   /* "j",74 */
    {0x00, 0xC0, 0x40, 0x40, 0x40, 0x58, 0x50, 0x60, 0x50, 0xC8, 0x00, 0x00},   /* "k",75 */
    {0x00, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xF8, 0x00, 0x00},   /* "l",76 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xA8, 0xA8, 0xA8, 0xA8, 0x00, 0x00},   /* "m",77 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x48, 0x48, 0x48, 0xEC, 0x00, 0x00},   /* "n",78 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x48, 0x48, 0x48, 0x30, 0x00, 0x00},   /* "o",79 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x48, 0x48, 0x48, 0x70, 0x40, 0xE0},   /* "p",80 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x48, 0x48, 0x48, 0x38, 0x08, 0x1C},   /* "q",81 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x60, 0x40, 0x40, 0xE0, 0x00, 0x00},   /* "r",82 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x40, 0x30, 0x08, 0x78, 0x00, 0x00},   /* "s",83 */
    {0x00, 0x00, 0x00, 0x20, 0x20, 0x78, 0x20, 0x20, 0x20, 0x38, 0x00, 0x00},   /* "t",84 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x48, 0x48, 0x48, 0x3C, 0x00, 0x00},   /* "u",85 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x50, 0x50, 0x20, 0x20, 0x00, 0x00},   /* "v",86 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xA8, 0x70, 0x50, 0x50, 0x00, 0x00},   /* "w",87 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x50, 0x20, 0x50, 0xD8, 0x00, 0x00},   /* "x",88 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x48, 0x48, 0x30, 0x10, 0x20, 0xC0},   /* "y",89 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x10, 0x20, 0x20, 0x78, 0x00, 0x00},   /* "z",90 */
    {0x18, 0x10, 0x10, 0x10, 0x10, 0x30, 0x10, 0x10, 0x10, 0x10, 0x18, 0x00},   /* "{",91 */
    {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},   /* "|",92 */
    {0x60, 0x20, 0x20, 0x20, 0x20, 0x10, 0x20, 0x20, 0x20, 0x20, 0x60, 0x00},   /* "}",93 */
    {0x68, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "~",94 */
};
#endif  /* ATK_MD0350_FONT_12 */

#if (ATK_MD0350_FONT_16 != 0)
#define ATK_MD0350_FONT_16_CHAR_WIDTH   8
#define ATK_MD0350_FONT_16_CHAR_HEIGHT  16
#define ATK_MD0350_FONT_16_CHAR_SIZE    16
/* 16*8 ASCII字符点阵 */
const uint8_t atk_md0350_font_1608[95][ATK_MD0350_FONT_16_CHAR_SIZE] = {
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* " ",0 */
    {0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00},   /* "!",1 */
    {0x00, 0x12, 0x24, 0x24, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* """,2 */
    {0x00, 0x00, 0x00, 0x12, 0x12, 0x12, 0x7E, 0x24, 0x24, 0x24, 0x7E, 0x24, 0x24, 0x24, 0x00, 0x00},   /* "#",3 */
    {0x00, 0x00, 0x08, 0x3C, 0x4A, 0x4A, 0x48, 0x38, 0x0C, 0x0A, 0x0A, 0x4A, 0x4A, 0x3C, 0x08, 0x08},   /* "$",4 */
    {0x00, 0x00, 0x00, 0x44, 0xA4, 0xA8, 0xA8, 0xB0, 0x54, 0x1A, 0x2A, 0x2A, 0x4A, 0x44, 0x00, 0x00},   /* "%",5 */
    {0x00, 0x00, 0x00, 0x30, 0x48, 0x48, 0x48, 0x50, 0x6E, 0xA4, 0x94, 0x98, 0x89, 0x76, 0x00, 0x00},   /* "&",6 */
    {0x00, 0x60, 0x20, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "'",7 */
    {0x00, 0x02, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x02, 0x00},   /* "(",8 */
    {0x00, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x40, 0x00},   /* ")",9 */
    {0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0xD6, 0x38, 0x38, 0xD6, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00},   /* "*",10 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x7F, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00},   /* "+",11 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x20, 0x40},   /* ",",12 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "-",13 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00},   /* ".",14 */
    {0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x00},   /* "/",15 */
    {0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00},   /* "0",16 */
    {0x00, 0x00, 0x00, 0x08, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00},   /* "1",17 */
    {0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x02, 0x04, 0x08, 0x10, 0x20, 0x42, 0x7E, 0x00, 0x00},   /* "2",18 */
    {0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x02, 0x04, 0x18, 0x04, 0x02, 0x42, 0x42, 0x3C, 0x00, 0x00},   /* "3",19 */
    {0x00, 0x00, 0x00, 0x04, 0x0C, 0x0C, 0x14, 0x24, 0x24, 0x44, 0x7F, 0x04, 0x04, 0x1F, 0x00, 0x00},   /* "4",20 */
    {0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x78, 0x44, 0x02, 0x02, 0x42, 0x44, 0x38, 0x00, 0x00},   /* "5",21 */
    {0x00, 0x00, 0x00, 0x18, 0x24, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x22, 0x1C, 0x00, 0x00},   /* "6",22 */
    {0x00, 0x00, 0x00, 0x7E, 0x42, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00},   /* "7",23 */
    {0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x24, 0x18, 0x24, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00},   /* "8",24 */
    {0x00, 0x00, 0x00, 0x38, 0x44, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x02, 0x02, 0x24, 0x18, 0x00, 0x00},   /* "9",25 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00},   /* ":",26 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10},   /* ";",27 */
    {0x00, 0x00, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00},   /* "<",28 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "=",29 */
    {0x00, 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00},   /* ">",30 */
    {0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x62, 0x04, 0x08, 0x08, 0x08, 0x00, 0x18, 0x18, 0x00, 0x00},   /* "?",31 */
    {0x00, 0x00, 0x00, 0x38, 0x44, 0x5A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x5C, 0x42, 0x3C, 0x00, 0x00},   /* "@",32 */
    {0x00, 0x00, 0x00, 0x10, 0x10, 0x18, 0x28, 0x28, 0x24, 0x3C, 0x44, 0x42, 0x42, 0xE7, 0x00, 0x00},   /* "A",33 */
    {0x00, 0x00, 0x00, 0xF8, 0x44, 0x44, 0x44, 0x78, 0x44, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00},   /* "B",34 */
    {0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x42, 0x44, 0x38, 0x00, 0x00},   /* "C",35 */
    {0x00, 0x00, 0x00, 0xF8, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00},   /* "D",36 */
    {0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x42, 0x42, 0xFC, 0x00, 0x00},   /* "E",37 */
    {0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00},   /* "F",38 */
    {0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x80, 0x80, 0x80, 0x8E, 0x84, 0x44, 0x44, 0x38, 0x00, 0x00},   /* "G",39 */
    {0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00},   /* "H",40 */
    {0x00, 0x00, 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00},   /* "I",41 */
    {0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0xF0},   /* "J",42 */
    {0x00, 0x00, 0x00, 0xEE, 0x44, 0x48, 0x50, 0x70, 0x50, 0x48, 0x48, 0x44, 0x44, 0xEE, 0x00, 0x00},   /* "K",43 */
    {0x00, 0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0xFE, 0x00, 0x00},   /* "L",44 */
    {0x00, 0x00, 0x00, 0xEE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x54, 0x54, 0x54, 0x54, 0xD6, 0x00, 0x00},   /* "M",45 */
    {0x00, 0x00, 0x00, 0xC7, 0x62, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x4A, 0x46, 0x46, 0xE2, 0x00, 0x00},   /* "N",46 */
    {0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00},   /* "O",47 */
    {0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00},   /* "P",48 */
    {0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0xB2, 0x4C, 0x38, 0x06, 0x00},   /* "Q",49 */
    {0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x7C, 0x48, 0x48, 0x44, 0x44, 0x42, 0xE3, 0x00, 0x00},   /* "R",50 */
    {0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x40, 0x20, 0x18, 0x04, 0x02, 0x42, 0x42, 0x7C, 0x00, 0x00},   /* "S",51 */
    {0x00, 0x00, 0x00, 0xFE, 0x92, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00},   /* "T",52 */
    {0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00},   /* "U",53 */
    {0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x44, 0x24, 0x24, 0x28, 0x28, 0x18, 0x10, 0x10, 0x00, 0x00},   /* "V",54 */
    {0x00, 0x00, 0x00, 0xD6, 0x54, 0x54, 0x54, 0x54, 0x54, 0x6C, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00},   /* "W",55 */
    {0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x18, 0x18, 0x18, 0x24, 0x24, 0x42, 0xE7, 0x00, 0x00},   /* "X",56 */
    {0x00, 0x00, 0x00, 0xEE, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00},   /* "Y",57 */
    {0x00, 0x00, 0x00, 0x7E, 0x84, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x42, 0x42, 0xFC, 0x00, 0x00},   /* "Z",58 */
    {0x00, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1E, 0x00},   /* "[",59 */
    {0x00, 0x00, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02},   /* "\",60 */
    {0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x78, 0x00},   /* "]",61 */
    {0x00, 0x18, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "^",62 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF},   /* "_",63 */
    {0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "`",64 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x0C, 0x34, 0x44, 0x4C, 0x36, 0x00, 0x00},   /* "a",65 */
    {0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x64, 0x58, 0x00, 0x00},   /* "b",66 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x40, 0x40, 0x40, 0x22, 0x1C, 0x00, 0x00},   /* "c",67 */
    {0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x3E, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00},   /* "d",68 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00},   /* "e",69 */
    {0x00, 0x00, 0x00, 0x00, 0x0C, 0x12, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00},   /* "f",70 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x44, 0x44, 0x38, 0x40, 0x3C, 0x42, 0x42, 0x3C},   /* "g",71 */
    {0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00},   /* "h",72 */
    {0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00},   /* "i",73 */
    {0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x1C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x78},   /* "j",74 */
    {0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x4E, 0x48, 0x50, 0x70, 0x48, 0x44, 0xEE, 0x00, 0x00},   /* "k",75 */
    {0x00, 0x00, 0x00, 0x10, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00},   /* "l",76 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x49, 0x49, 0x49, 0x49, 0x49, 0xED, 0x00, 0x00},   /* "m",77 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00},   /* "n",78 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00},   /* "o",79 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x64, 0x42, 0x42, 0x42, 0x64, 0x58, 0x40, 0xE0},   /* "p",80 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x26, 0x42, 0x42, 0x42, 0x26, 0x1A, 0x02, 0x07},   /* "q",81 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x32, 0x20, 0x20, 0x20, 0x20, 0xF8, 0x00, 0x00},   /* "r",82 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, 0x40, 0x3C, 0x02, 0x42, 0x7C, 0x00, 0x00},   /* "s",83 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x12, 0x0C, 0x00, 0x00},   /* "t",84 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00},   /* "u",85 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x00, 0x00},   /* "v",86 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x89, 0x4A, 0x5A, 0x54, 0x24, 0x24, 0x00, 0x00},   /* "w",87 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x24, 0x18, 0x18, 0x18, 0x24, 0x6E, 0x00, 0x00},   /* "x",88 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x18, 0x18, 0x10, 0x10, 0x60},   /* "y",89 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x44, 0x08, 0x10, 0x10, 0x22, 0x7E, 0x00, 0x00},   /* "z",90 */
    {0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00},   /* "{",91 */
    {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08},   /* "|",92 */
    {0x00, 0xC0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0xC0, 0x00},   /* "}",93 */
    {0x20, 0x5A, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "~",94 */
};
#endif /* ATK_MD0350_FONT_16 */

#if (ATK_MD0350_FONT_24 != 0)
#define ATK_MD0350_FONT_24_CHAR_WIDTH   12
#define ATK_MD0350_FONT_24_CHAR_HEIGHT  24
#define ATK_MD0350_FONT_24_CHAR_SIZE    48
/* 24*12 ASCII字符点阵 */
const uint8_t atk_md0350_font_2412[95][ATK_MD0350_FONT_24_CHAR_SIZE] = {
    {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, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "!",1 */
    {0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x06, 0x60, 0x0C, 0xC0, 0x19, 0x80, 0x11, 0x00, 0x22, 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},   /* """,2 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x08, 0x40, 0x08, 0x40, 0x08, 0x40, 0x7F, 0xE0, 0x7F, 0xE0, 0x10, 0x40, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x7F, 0xE0, 0x7F, 0xE0, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x20, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "#",3 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0F, 0x80, 0x1A, 0xC0, 0x32, 0xC0, 0x33, 0xC0, 0x32, 0x00, 0x1A, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x03, 0x80, 0x02, 0xC0, 0x32, 0xC0, 0x3A, 0xC0, 0x32, 0xC0, 0x12, 0x80, 0x0F, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00},   /* "$",4 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x50, 0x80, 0x89, 0x00, 0x89, 0x00, 0x89, 0x00, 0x8A, 0x00, 0x8A, 0x00, 0x5C, 0x00, 0x75, 0xC0, 0x05, 0x40, 0x0A, 0x20, 0x0A, 0x20, 0x12, 0x20, 0x12, 0x20, 0x12, 0x20, 0x21, 0x40, 0x21, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "%",5 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x34, 0x00, 0x19, 0xE0, 0x38, 0x80, 0x58, 0x80, 0xCC, 0x80, 0xCC, 0x80, 0xC6, 0x80, 0xC7, 0x00, 0xC3, 0x10, 0x63, 0x90, 0x3C, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "&",6 */
    {0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 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, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00},   /* "(",8 */
    {0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00},   /* ")",9 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x62, 0x30, 0x72, 0xF0, 0x0B, 0x80, 0x0F, 0x80, 0x7A, 0xF0, 0x62, 0x30, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "*",10 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7F, 0xF0, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "+",11 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00},   /* ",",12 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "-",13 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* ".",14 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x60, 0x00, 0x40, 0x00, 0xC0, 0x00, 0x80, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x00, 0x20, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00, 0x00},   /* "/",15 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x19, 0x80, 0x30, 0xC0, 0x30, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0xC0, 0x30, 0xC0, 0x19, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "0",16 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "1",17 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x21, 0x80, 0x40, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x00, 0xC0, 0x00, 0x80, 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x40, 0x20, 0x40, 0x60, 0x40, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "2",18 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x63, 0x00, 0x61, 0x80, 0x61, 0x80, 0x01, 0x80, 0x01, 0x80, 0x03, 0x00, 0x0E, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x61, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "3",19 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x03, 0x80, 0x05, 0x80, 0x05, 0x80, 0x09, 0x80, 0x11, 0x80, 0x11, 0x80, 0x21, 0x80, 0x41, 0x80, 0x7F, 0xF0, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "4",20 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2F, 0x00, 0x31, 0x80, 0x20, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x41, 0x80, 0x21, 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "5",21 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x18, 0xC0, 0x30, 0xC0, 0x30, 0x00, 0x20, 0x00, 0x60, 0x00, 0x67, 0x80, 0x68, 0xC0, 0x70, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x20, 0x60, 0x30, 0x40, 0x18, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "6",22 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x30, 0x60, 0x20, 0x40, 0x20, 0x80, 0x00, 0x80, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "7",23 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x30, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x40, 0x38, 0xC0, 0x0F, 0x00, 0x13, 0x80, 0x30, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0xC0, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "8",24 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x30, 0x80, 0x30, 0xC0, 0x60, 0x40, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0x31, 0x60, 0x1E, 0x60, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x30, 0x80, 0x31, 0x80, 0x1E, 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, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 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, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00},   /* ";",27 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "<",28 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "=",29 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* ">",30 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x18, 0x60, 0x20, 0x30, 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0xE0, 0x01, 0x80, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "?",31 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x18, 0xC0, 0x30, 0x40, 0x33, 0xA0, 0x26, 0xA0, 0x66, 0xA0, 0x65, 0xA0, 0x6D, 0x20, 0x6D, 0x20, 0x6D, 0x20, 0x6D, 0x20, 0x6D, 0x40, 0x27, 0x80, 0x30, 0x20, 0x30, 0x40, 0x18, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "@",32 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0A, 0x00, 0x0B, 0x00, 0x09, 0x00, 0x09, 0x00, 0x11, 0x00, 0x11, 0x80, 0x10, 0x80, 0x1F, 0x80, 0x20, 0xC0, 0x20, 0xC0, 0x20, 0x40, 0x40, 0x40, 0x40, 0x60, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "A",33 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x31, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x31, 0x80, 0x3F, 0x00, 0x30, 0xC0, 0x30, 0x40, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xC0, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "B",34 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x18, 0xC0, 0x30, 0x60, 0x30, 0x20, 0x20, 0x20, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x20, 0x30, 0x20, 0x30, 0x40, 0x18, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "C",35 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x31, 0x80, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xC0, 0x30, 0xC0, 0x31, 0x80, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "D",36 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x60, 0xC0, 0x60, 0x20, 0x60, 0x20, 0x60, 0x00, 0x61, 0x00, 0x61, 0x00, 0x7F, 0x00, 0x61, 0x00, 0x61, 0x00, 0x61, 0x00, 0x60, 0x00, 0x60, 0x20, 0x60, 0x20, 0x60, 0x40, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "E",37 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x60, 0xC0, 0x60, 0x20, 0x60, 0x20, 0x60, 0x00, 0x61, 0x00, 0x61, 0x00, 0x7F, 0x00, 0x61, 0x00, 0x61, 0x00, 0x61, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "F",38 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x18, 0x80, 0x30, 0x40, 0x30, 0x40, 0x20, 0x40, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x63, 0xF0, 0x60, 0xC0, 0x60, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x18, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "G",39 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7F, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "H",40 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "I",41 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x63, 0x00, 0x66, 0x00, 0x3C, 0x00},   /* "J",42 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xC0, 0x61, 0x80, 0x63, 0x00, 0x62, 0x00, 0x64, 0x00, 0x68, 0x00, 0x6C, 0x00, 0x74, 0x00, 0x76, 0x00, 0x62, 0x00, 0x63, 0x00, 0x61, 0x00, 0x61, 0x80, 0x60, 0x80, 0x60, 0xC0, 0xF1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "K",43 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x20, 0x60, 0x20, 0x60, 0x40, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "L",44 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE0, 0x61, 0xC0, 0x61, 0xC0, 0x71, 0xC0, 0x71, 0xC0, 0x72, 0xC0, 0x72, 0xC0, 0x52, 0xC0, 0x5A, 0xC0, 0x5A, 0xC0, 0x5C, 0xC0, 0x4C, 0xC0, 0x4C, 0xC0, 0x4C, 0xC0, 0x48, 0xC0, 0xE1, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "M",45 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xF0, 0x30, 0x40, 0x38, 0x40, 0x38, 0x40, 0x2C, 0x40, 0x2C, 0x40, 0x26, 0x40, 0x26, 0x40, 0x22, 0x40, 0x23, 0x40, 0x21, 0x40, 0x21, 0xC0, 0x21, 0xC0, 0x20, 0xC0, 0x20, 0xC0, 0xF8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "N",46 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x19, 0x80, 0x30, 0xC0, 0x30, 0x40, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0x40, 0x30, 0xC0, 0x19, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "O",47 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x60, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x61, 0xC0, 0x7F, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "P",48 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x19, 0x80, 0x30, 0xC0, 0x30, 0x40, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x6E, 0x60, 0x32, 0x40, 0x33, 0xC0, 0x19, 0x80, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0xC0, 0x00, 0x00},   /* "Q",49 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x60, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xC0, 0x7F, 0x00, 0x62, 0x00, 0x63, 0x00, 0x61, 0x00, 0x61, 0x80, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0x60, 0xF0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "R",50 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x40, 0x30, 0xC0, 0x60, 0x40, 0x60, 0x40, 0x60, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xC0, 0x00, 0xE0, 0x40, 0x60, 0x40, 0x60, 0x60, 0x60, 0x30, 0xC0, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "S",51 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x46, 0x20, 0x86, 0x10, 0x86, 0x10, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "T",52 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xE0, 0x30, 0x40, 0x30, 0x40, 0x30, 0x40, 0x30, 0x40, 0x30, 0x40, 0x30, 0x40, 0x30, 0x40, 0x30, 0x40, 0x30, 0x40, 0x30, 0x40, 0x30, 0x40, 0x30, 0x40, 0x30, 0x40, 0x18, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "U",53 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xE0, 0x60, 0x40, 0x20, 0x80, 0x20, 0x80, 0x30, 0x80, 0x30, 0x80, 0x11, 0x00, 0x11, 0x00, 0x19, 0x00, 0x19, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "V",54 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x70, 0x46, 0x20, 0x42, 0x20, 0x62, 0x20, 0x62, 0x20, 0x26, 0x40, 0x26, 0x40, 0x27, 0x40, 0x27, 0x40, 0x39, 0x40, 0x39, 0x80, 0x19, 0x80, 0x19, 0x80, 0x11, 0x80, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "W",55 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xE0, 0x30, 0x80, 0x10, 0x80, 0x18, 0x80, 0x09, 0x00, 0x0D, 0x00, 0x06, 0x00, 0x04, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0B, 0x00, 0x09, 0x00, 0x11, 0x80, 0x10, 0x80, 0x20, 0xC0, 0x71, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "X",56 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xF0, 0x60, 0x20, 0x20, 0x40, 0x30, 0x40, 0x10, 0x80, 0x18, 0x80, 0x1D, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x1F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "Y",57 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x30, 0x40, 0x60, 0xC0, 0x40, 0x80, 0x01, 0x80, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x18, 0x00, 0x10, 0x20, 0x30, 0x20, 0x20, 0x40, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "Z",58 */
    {0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x07, 0xC0, 0x00, 0x00},   /* "[",59 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20},   /* "\",60 */
    {0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x00, 0x00},   /* "]",61 */
    {0x00, 0x00, 0x06, 0x00, 0x09, 0x00, 0x10, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "^",62 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF0},   /* "_",63 */
    {0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x06, 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},   /* "`",64 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x30, 0xC0, 0x30, 0xC0, 0x00, 0xC0, 0x07, 0xC0, 0x38, 0xC0, 0x70, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x71, 0xD0, 0x3E, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "a",65 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x70, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x33, 0x80, 0x3C, 0xC0, 0x38, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x40, 0x38, 0xC0, 0x27, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "b",66 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x31, 0x80, 0x31, 0x80, 0x61, 0x80, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x40, 0x30, 0x40, 0x30, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "c",67 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x1E, 0xC0, 0x31, 0xC0, 0x30, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x20, 0xC0, 0x31, 0xE0, 0x1E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "d",68 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x18, 0xC0, 0x10, 0x40, 0x30, 0x60, 0x30, 0x60, 0x3F, 0xE0, 0x30, 0x00, 0x30, 0x00, 0x18, 0x20, 0x18, 0x40, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "e",69 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x06, 0x60, 0x0C, 0x60, 0x0C, 0x00, 0x0C, 0x00, 0x7F, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "f",70 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x1B, 0x60, 0x31, 0x80, 0x31, 0x80, 0x31, 0x80, 0x19, 0x80, 0x1F, 0x00, 0x30, 0x00, 0x3F, 0x00, 0x33, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x71, 0xC0, 0x1F, 0x00},   /* "g",71 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x70, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x37, 0x80, 0x38, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x79, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "h",72 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "i",73 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x33, 0x00, 0x3E, 0x00},   /* "j",74 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x70, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 0xC0, 0x31, 0x00, 0x31, 0x00, 0x32, 0x00, 0x36, 0x00, 0x3A, 0x00, 0x31, 0x00, 0x31, 0x80, 0x30, 0x80, 0x30, 0xC0, 0x79, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "k",75 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "l",76 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xE0, 0x77, 0x60, 0x66, 0x60, 0x66, 0x60, 0x66, 0x60, 0x66, 0x60, 0x66, 0x60, 0x66, 0x60, 0x66, 0x60, 0x66, 0x60, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "m",77 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x80, 0x38, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x79, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "n",78 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x19, 0x80, 0x30, 0xC0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x30, 0xC0, 0x30, 0xC0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "o",79 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x80, 0x38, 0xC0, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0x60, 0x30, 0xC0, 0x38, 0xC0, 0x37, 0x80, 0x30, 0x00, 0x30, 0x00, 0x7C, 0x00},   /* "p",80 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x40, 0x31, 0xC0, 0x30, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x60, 0xC0, 0x20, 0xC0, 0x31, 0xC0, 0x1E, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x03, 0xE0},   /* "q",81 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xC0, 0x1A, 0x60, 0x1C, 0x60, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "r",82 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0x38, 0xC0, 0x30, 0x40, 0x30, 0x40, 0x1C, 0x00, 0x0F, 0x00, 0x03, 0xC0, 0x20, 0xC0, 0x20, 0xC0, 0x31, 0xC0, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "s",83 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x7F, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x40, 0x0C, 0x40, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "t",84 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x71, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x30, 0xC0, 0x39, 0xE0, 0x1E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "u",85 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xE0, 0x30, 0x40, 0x10, 0x80, 0x10, 0x80, 0x18, 0x80, 0x09, 0x00, 0x0D, 0x00, 0x0D, 0x00, 0x06, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "v",86 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0x70, 0x46, 0x20, 0x62, 0x20, 0x26, 0x40, 0x26, 0x40, 0x37, 0x40, 0x39, 0x80, 0x19, 0x80, 0x19, 0x80, 0x19, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "w",87 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xE0, 0x18, 0x80, 0x08, 0x80, 0x0D, 0x00, 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x09, 0x00, 0x10, 0x80, 0x10, 0xC0, 0x79, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "x",88 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xE0, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x09, 0x00, 0x09, 0x00, 0x0D, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, 0x24, 0x00, 0x38, 0x00},   /* "y",89 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x21, 0x80, 0x23, 0x00, 0x22, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x18, 0x40, 0x10, 0x40, 0x30, 0xC0, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "z",90 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0xC0, 0x00, 0x00},   /* "{",91 */
    {0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00},   /* "|",92 */
    {0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x30, 0x00, 0x00, 0x00},   /* "}",93 */
    {0x00, 0x00, 0x38, 0x00, 0x44, 0x20, 0x43, 0x20, 0x01, 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},   /* "~",94 */
};
#endif /* ATK_MD0350_FONT_24 */

#if (ATK_MD0350_FONT_32 != 0)
#define ATK_MD0350_FONT_32_CHAR_WIDTH   16
#define ATK_MD0350_FONT_32_CHAR_HEIGHT  32
#define ATK_MD0350_FONT_32_CHAR_SIZE    64
/* 32*16 ASCII字符点阵 */
const uint8_t atk_md0350_font_3216[95][ATK_MD0350_FONT_32_CHAR_SIZE] = {
    {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, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "!",1 */
    {0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x07, 0x38, 0x07, 0x38, 0x0E, 0x70, 0x0C, 0x60, 0x18, 0xC0, 0x31, 0x80, 0x21, 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},   /* """,2 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x7F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x7F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x18, 0x30, 0x10, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "#",3 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0xC0, 0x0D, 0x30, 0x09, 0x18, 0x19, 0x18, 0x19, 0x38, 0x19, 0x38, 0x1D, 0x00, 0x0D, 0x00, 0x0F, 0x00, 0x07, 0x00, 0x03, 0xC0, 0x01, 0xE0, 0x01, 0xF0, 0x01, 0x30, 0x01, 0x38, 0x01, 0x18, 0x39, 0x18, 0x39, 0x18, 0x31, 0x18, 0x31, 0x30, 0x19, 0x60, 0x07, 0xC0, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00},   /* "$",4 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x10, 0x6C, 0x10, 0x44, 0x20, 0xC6, 0x20, 0xC6, 0x40, 0xC6, 0x40, 0xC6, 0x40, 0xC6, 0x80, 0xC6, 0x80, 0x44, 0x80, 0x6D, 0x38, 0x39, 0x6C, 0x02, 0x44, 0x02, 0xC6, 0x02, 0xC6, 0x04, 0xC6, 0x04, 0xC6, 0x08, 0xC6, 0x08, 0xC6, 0x08, 0x44, 0x10, 0x6C, 0x10, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "%",5 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x19, 0x00, 0x31, 0x80, 0x31, 0x80, 0x31, 0x80, 0x31, 0x80, 0x31, 0x00, 0x33, 0x00, 0x3A, 0x00, 0x1C, 0x00, 0x38, 0x7C, 0x3C, 0x10, 0x4C, 0x10, 0xCE, 0x10, 0xC6, 0x20, 0xC7, 0x20, 0xC3, 0x20, 0xC1, 0xC0, 0xC1, 0xC2, 0x60, 0xE6, 0x31, 0x7C, 0x1E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "&",6 */
    {0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x30, 0x00, 0x60, 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},   /* "'",7 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x18, 0x00, 0x30, 0x00, 0x20, 0x00, 0x60, 0x00, 0x40, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x40, 0x00, 0x60, 0x00, 0x20, 0x00, 0x30, 0x00, 0x18, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00},   /* "(",8 */
    {0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00},   /* ")",9 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x30, 0xC6, 0x38, 0x8E, 0x1C, 0x9C, 0x06, 0xB0, 0x01, 0xC0, 0x01, 0xC0, 0x06, 0xB0, 0x1C, 0x9C, 0x38, 0x8E, 0x31, 0x86, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "*",10 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x3F, 0xFE, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "+",11 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x30, 0x00, 0x60, 0x00},   /* ",",12 */
    {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, 0x7F, 0xFE, 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},   /* "-",13 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* ".",14 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x18, 0x00, 0x10, 0x00, 0x30, 0x00, 0x20, 0x00, 0x60, 0x00, 0x40, 0x00, 0xC0, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x06, 0x00, 0x04, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x18, 0x00, 0x10, 0x00, 0x30, 0x00, 0x20, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "/",15 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x06, 0x20, 0x0C, 0x30, 0x18, 0x18, 0x18, 0x18, 0x18, 0x08, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x18, 0x08, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x30, 0x06, 0x20, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "0",16 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x1F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x03, 0xC0, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "1",17 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x08, 0x38, 0x10, 0x18, 0x20, 0x0C, 0x20, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x02, 0x00, 0x04, 0x04, 0x08, 0x04, 0x10, 0x04, 0x20, 0x0C, 0x3F, 0xF8, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "2",18 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x18, 0x60, 0x30, 0x30, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x03, 0xC0, 0x00, 0x70, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x08, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "3",19 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0xE0, 0x00, 0xE0, 0x01, 0x60, 0x01, 0x60, 0x02, 0x60, 0x04, 0x60, 0x04, 0x60, 0x08, 0x60, 0x08, 0x60, 0x10, 0x60, 0x30, 0x60, 0x20, 0x60, 0x40, 0x60, 0x7F, 0xFC, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "4",20 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x0F, 0xFC, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x13, 0xE0, 0x14, 0x30, 0x18, 0x18, 0x10, 0x08, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x20, 0x18, 0x20, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "5",21 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x18, 0x0C, 0x18, 0x08, 0x18, 0x18, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x00, 0x33, 0xE0, 0x36, 0x30, 0x38, 0x18, 0x38, 0x08, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x18, 0x0C, 0x18, 0x08, 0x0C, 0x18, 0x0E, 0x30, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "6",22 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x1F, 0xFC, 0x10, 0x08, 0x30, 0x10, 0x20, 0x10, 0x20, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "7",23 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x38, 0x0C, 0x38, 0x08, 0x1E, 0x18, 0x0F, 0x20, 0x07, 0xC0, 0x18, 0xF0, 0x30, 0x78, 0x30, 0x38, 0x60, 0x1C, 0x60, 0x0C, 0x60, 0x0C, 0x60, 0x0C, 0x60, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "8",24 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x18, 0x20, 0x30, 0x10, 0x30, 0x18, 0x60, 0x08, 0x60, 0x0C, 0x60, 0x0C, 0x60, 0x0C, 0x60, 0x0C, 0x60, 0x0C, 0x70, 0x1C, 0x30, 0x2C, 0x18, 0x6C, 0x0F, 0x8C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x18, 0x00, 0x10, 0x30, 0x30, 0x30, 0x60, 0x30, 0xC0, 0x0F, 0x80, 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, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0x80, 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, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x01, 0x80, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00},   /* ";",27 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "<",28 */
    {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, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "=",29 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* ">",30 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x0C, 0x18, 0x18, 0x0C, 0x10, 0x06, 0x30, 0x06, 0x38, 0x06, 0x38, 0x06, 0x38, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x70, 0x00, 0xC0, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x03, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "?",31 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x06, 0x10, 0x0C, 0x08, 0x18, 0x04, 0x30, 0xD4, 0x31, 0xB2, 0x21, 0x32, 0x63, 0x32, 0x63, 0x22, 0x66, 0x22, 0x66, 0x22, 0x66, 0x22, 0x66, 0x62, 0x66, 0x64, 0x66, 0x64, 0x26, 0xE8, 0x33, 0x30, 0x30, 0x02, 0x10, 0x04, 0x18, 0x0C, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "@",32 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x04, 0xC0, 0x04, 0xC0, 0x04, 0xC0, 0x04, 0xC0, 0x0C, 0x40, 0x08, 0x60, 0x08, 0x60, 0x08, 0x60, 0x08, 0x20, 0x1F, 0xF0, 0x10, 0x30, 0x10, 0x30, 0x10, 0x30, 0x20, 0x18, 0x20, 0x18, 0x20, 0x18, 0x60, 0x1C, 0xF8, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "A",33 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x18, 0x38, 0x18, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x1F, 0xE0, 0x18, 0x18, 0x18, 0x0C, 0x18, 0x04, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x0C, 0x18, 0x18, 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "B",34 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x06, 0x1C, 0x08, 0x0C, 0x18, 0x06, 0x30, 0x02, 0x30, 0x02, 0x30, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x30, 0x02, 0x30, 0x02, 0x10, 0x04, 0x18, 0x08, 0x0C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "C",35 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x18, 0x70, 0x18, 0x18, 0x18, 0x08, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x04, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x60, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "D",36 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFC, 0x18, 0x0C, 0x18, 0x04, 0x18, 0x02, 0x18, 0x02, 0x18, 0x00, 0x18, 0x00, 0x18, 0x10, 0x18, 0x10, 0x18, 0x30, 0x1F, 0xF0, 0x18, 0x30, 0x18, 0x10, 0x18, 0x10, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x02, 0x18, 0x02, 0x18, 0x04, 0x18, 0x0C, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "E",37 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFC, 0x18, 0x1C, 0x18, 0x04, 0x18, 0x02, 0x18, 0x02, 0x18, 0x00, 0x18, 0x00, 0x18, 0x10, 0x18, 0x10, 0x18, 0x30, 0x1F, 0xF0, 0x18, 0x30, 0x18, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "F",38 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x08, 0x10, 0x18, 0x18, 0x30, 0x08, 0x30, 0x08, 0x20, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x7E, 0x60, 0x18, 0x60, 0x18, 0x20, 0x18, 0x30, 0x18, 0x30, 0x18, 0x10, 0x18, 0x18, 0x18, 0x0C, 0x20, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "G",39 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, 0xFC, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "H",40 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "I",41 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x70, 0x60, 0x70, 0xC0, 0x71, 0x80, 0x3F, 0x00},   /* "J",42 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7C, 0x18, 0x30, 0x18, 0x20, 0x18, 0x60, 0x18, 0x40, 0x18, 0x80, 0x18, 0x80, 0x19, 0x00, 0x19, 0x00, 0x1B, 0x00, 0x1D, 0x80, 0x1D, 0x80, 0x18, 0xC0, 0x18, 0xC0, 0x18, 0x60, 0x18, 0x60, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "K",43 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x02, 0x18, 0x02, 0x18, 0x04, 0x18, 0x0C, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "L",44 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x1C, 0x38, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x2C, 0x4C, 0x2C, 0x4C, 0x26, 0x4C, 0x26, 0x4C, 0x26, 0x4C, 0x26, 0x8C, 0x22, 0x8C, 0x23, 0x8C, 0x23, 0x8C, 0x23, 0x0C, 0x23, 0x0C, 0x21, 0x0C, 0xF1, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "M",45 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x38, 0x04, 0x38, 0x04, 0x2C, 0x04, 0x2C, 0x04, 0x26, 0x04, 0x26, 0x04, 0x23, 0x04, 0x23, 0x04, 0x21, 0x84, 0x21, 0x84, 0x20, 0xC4, 0x20, 0xC4, 0x20, 0x64, 0x20, 0x64, 0x20, 0x34, 0x20, 0x34, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x0C, 0x20, 0x0C, 0xF8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "N",46 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x18, 0x18, 0x10, 0x08, 0x30, 0x0C, 0x30, 0x0C, 0x60, 0x04, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x20, 0x06, 0x30, 0x0C, 0x30, 0x0C, 0x10, 0x08, 0x18, 0x18, 0x0C, 0x30, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "O",47 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xF0, 0x18, 0x18, 0x18, 0x0C, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x06, 0x18, 0x0C, 0x18, 0x18, 0x1F, 0xE0, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "P",48 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x18, 0x18, 0x10, 0x08, 0x30, 0x0C, 0x30, 0x0C, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x27, 0x84, 0x38, 0xCC, 0x38, 0x6C, 0x18, 0x78, 0x0C, 0x70, 0x03, 0xE0, 0x00, 0x32, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x00},   /* "Q",49 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x18, 0x38, 0x18, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x1F, 0xE0, 0x18, 0xC0, 0x18, 0xC0, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "R",50 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC8, 0x18, 0x78, 0x30, 0x18, 0x60, 0x18, 0x60, 0x08, 0x60, 0x08, 0x60, 0x00, 0x70, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x18, 0x00, 0x1C, 0x40, 0x0C, 0x40, 0x0C, 0x60, 0x0C, 0x20, 0x0C, 0x30, 0x18, 0x38, 0x30, 0x27, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "S",51 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x31, 0x84, 0x21, 0x86, 0x41, 0x82, 0x41, 0x82, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "T",52 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3E, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x18, 0x10, 0x1C, 0x20, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "U",53 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x1E, 0x18, 0x0C, 0x18, 0x08, 0x18, 0x08, 0x18, 0x08, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x20, 0x06, 0x20, 0x06, 0x20, 0x06, 0x20, 0x06, 0x40, 0x03, 0x40, 0x03, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "V",54 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xCF, 0x61, 0x86, 0x61, 0x84, 0x21, 0x84, 0x20, 0x84, 0x30, 0xC4, 0x31, 0xC4, 0x31, 0xC4, 0x31, 0xC8, 0x31, 0xC8, 0x11, 0xC8, 0x12, 0x48, 0x1A, 0x68, 0x1A, 0x68, 0x1A, 0x70, 0x1C, 0x70, 0x0C, 0x70, 0x0C, 0x70, 0x0C, 0x30, 0x0C, 0x20, 0x08, 0x20, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "W",55 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x3E, 0x18, 0x08, 0x18, 0x10, 0x0C, 0x10, 0x0C, 0x20, 0x06, 0x20, 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xC0, 0x02, 0xC0, 0x02, 0x60, 0x04, 0x60, 0x04, 0x70, 0x08, 0x30, 0x08, 0x30, 0x18, 0x18, 0x10, 0x1C, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "X",56 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x3E, 0x38, 0x08, 0x18, 0x08, 0x18, 0x10, 0x0C, 0x10, 0x0C, 0x10, 0x0C, 0x20, 0x06, 0x20, 0x06, 0x20, 0x03, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "Y",57 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x1C, 0x0C, 0x18, 0x0C, 0x30, 0x18, 0x20, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x02, 0x18, 0x06, 0x30, 0x04, 0x30, 0x1C, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "Z",58 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00},   /* "[",59 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x18, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x00},   /* "\",60 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x3F, 0xC0, 0x00, 0x00, 0x00, 0x00},   /* "]",61 */
    {0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x03, 0xE0, 0x06, 0x20, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "^",62 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xFF, 0xFF},   /* "_",63 */
    {0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x03, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "`",64 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x18, 0x30, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x00, 0x38, 0x07, 0xD8, 0x1C, 0x18, 0x30, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x18, 0x60, 0x19, 0x30, 0x79, 0x1F, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "a",65 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x78, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x19, 0xE0, 0x1A, 0x38, 0x1C, 0x18, 0x1C, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x08, 0x1C, 0x18, 0x1C, 0x30, 0x13, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "b",66 */
    {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, 0x03, 0xE0, 0x0E, 0x10, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x18, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x04, 0x18, 0x04, 0x18, 0x08, 0x0C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "c",67 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x78, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x07, 0xD8, 0x0C, 0x38, 0x18, 0x18, 0x18, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x10, 0x18, 0x18, 0x38, 0x0C, 0x5E, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "d",68 */
    {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, 0x03, 0xC0, 0x0C, 0x30, 0x08, 0x18, 0x18, 0x08, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, 0xFC, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x18, 0x04, 0x18, 0x08, 0x0E, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "e",69 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x01, 0x86, 0x01, 0x06, 0x03, 0x06, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x3F, 0xF8, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "f",70 */
    {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, 0x03, 0xEE, 0x0C, 0x36, 0x08, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x08, 0x18, 0x0C, 0x30, 0x0F, 0xE0, 0x18, 0x00, 0x18, 0x00, 0x1F, 0xC0, 0x0F, 0xF8, 0x18, 0x1C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x18, 0x18, 0x07, 0xE0},   /* "g",71 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x78, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x19, 0xE0, 0x1A, 0x30, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "h",72 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "i",73 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x78, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0xF0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x18, 0x60, 0x18, 0x40, 0x0F, 0x80},   /* "j",74 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x78, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x7C, 0x18, 0x30, 0x18, 0x20, 0x18, 0x40, 0x18, 0x80, 0x19, 0x80, 0x1B, 0x80, 0x1E, 0xC0, 0x1C, 0xC0, 0x18, 0x60, 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x1C, 0x7E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "k",75 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "l",76 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xEF, 0x3C, 0x71, 0xC6, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0x61, 0x86, 0xF3, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "m",77 */
    {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, 0x09, 0xE0, 0x7A, 0x30, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "n",78 */
    {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, 0x03, 0xC0, 0x0C, 0x30, 0x08, 0x18, 0x18, 0x18, 0x10, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x30, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "o",79 */
    {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, 0x09, 0xE0, 0x7A, 0x30, 0x1C, 0x18, 0x18, 0x08, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x18, 0x1C, 0x18, 0x1E, 0x30, 0x19, 0xE0, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00},   /* "p",80 */
    {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, 0x03, 0xC8, 0x0C, 0x78, 0x18, 0x38, 0x18, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x10, 0x18, 0x18, 0x38, 0x0C, 0x78, 0x07, 0x98, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E},   /* "q",81 */
    {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, 0x06, 0x1C, 0x7E, 0x66, 0x06, 0x86, 0x07, 0x80, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x7F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "r",82 */
    {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, 0x03, 0xE4, 0x06, 0x1C, 0x0C, 0x0C, 0x0C, 0x04, 0x0C, 0x04, 0x0E, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1C, 0x10, 0x0C, 0x10, 0x0C, 0x18, 0x0C, 0x1C, 0x18, 0x13, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "s",83 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x07, 0x00, 0x3F, 0xF8, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x04, 0x03, 0x04, 0x01, 0x88, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "t",84 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x78, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x38, 0x0C, 0x5E, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "u",85 */
    {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, 0x7C, 0x3E, 0x18, 0x0C, 0x18, 0x08, 0x18, 0x18, 0x0C, 0x10, 0x0C, 0x10, 0x04, 0x20, 0x06, 0x20, 0x06, 0x20, 0x03, 0x40, 0x03, 0x40, 0x03, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "v",86 */
    {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, 0xFB, 0xCF, 0x61, 0x86, 0x21, 0x84, 0x31, 0x84, 0x31, 0x84, 0x31, 0xC8, 0x11, 0xC8, 0x1A, 0xC8, 0x1A, 0x48, 0x1A, 0x70, 0x0E, 0x70, 0x0C, 0x70, 0x0C, 0x30, 0x0C, 0x20, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "w",87 */
    {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, 0x3E, 0x7C, 0x0C, 0x10, 0x0E, 0x10, 0x06, 0x20, 0x03, 0x40, 0x03, 0x40, 0x01, 0x80, 0x01, 0x80, 0x01, 0xC0, 0x02, 0x60, 0x04, 0x60, 0x04, 0x30, 0x08, 0x18, 0x18, 0x18, 0x7C, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "x",88 */
    {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, 0x7C, 0x3E, 0x18, 0x18, 0x18, 0x10, 0x08, 0x10, 0x0C, 0x10, 0x04, 0x20, 0x06, 0x20, 0x06, 0x20, 0x02, 0x40, 0x03, 0x40, 0x01, 0x40, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x3E, 0x00, 0x3C, 0x00},   /* "y",89 */
    {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, 0x3F, 0xF8, 0x30, 0x38, 0x30, 0x30, 0x20, 0x60, 0x20, 0xE0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0E, 0x04, 0x0C, 0x04, 0x18, 0x0C, 0x30, 0x18, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "z",90 */
    {0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xC0, 0x01, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x00},   /* "{",91 */
    {0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80},   /* "|",92 */
    {0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 0xC0, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x18, 0x00, 0x00, 0x00},   /* "}",93 */
    {0x00, 0x00, 0x1E, 0x00, 0x23, 0x00, 0x41, 0x82, 0x40, 0x82, 0x00, 0xE4, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   /* "~",94 */
};
#endif /* ATK_MD0350_FONT_32 */

#endif

atk_md0350_fsmc.c

/**
 ****************************************************************************************************
 * @file        atk_md0350_fsmc.c
 * @author      正点原子团队(ALIENTEK)
 * @version     V1.0
 * @date        2022-06-21
 * @brief       ATK-MD0350模块FSMC接口驱动代码
 * @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:正点原子 STM32F103开发板
 * 在线视频:www.yuanzige.com
 * 技术论坛:www.openedv.com
 * 公司网址:www.alientek.com
 * 购买地址:openedv.taobao.com
 *
 ****************************************************************************************************
 */

#include "atk_md0350_fsmc.h"

/* ATK-MD0350模块FSMC句柄 */
static SRAM_HandleTypeDef g_sram_handle = {0};

/**
 * @brief       ATK-MD0350模块FSMC接口初始化
 * @param       无
 * @retval      无
 */
void atk_md0350_fsmc_init(void)
{
    GPIO_InitTypeDef gpio_init_struct = {0};
    FSMC_NORSRAM_TimingTypeDef read_timing = {0};
    FSMC_NORSRAM_TimingTypeDef write_timing = {0};
    
    /* 使能时钟 */
    ATK_MD0350_FSMC_CLK_ENABLE();
    ATK_MD0350_FSMC_RS_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_CS_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_RD_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_WR_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D0_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D1_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D2_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D3_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D4_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D5_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D6_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D7_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D8_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D9_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D10_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D11_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D12_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D13_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D14_GPIO_CLK_ENABLE();
    ATK_MD0350_FSMC_D15_GPIO_CLK_ENABLE();
    
    /* 初始化RS引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_RS_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_RS_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化CS引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_CS_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_CS_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化RD引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_RD_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_RD_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化WR引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_WR_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_WR_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D0引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D0_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D0_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D1引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D1_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D1_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D2引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D2_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D2_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D3引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D3_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D3_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D4引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D4_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D4_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D5引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D5_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D5_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D6引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D6_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D6_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D7引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D7_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D7_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D8引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D8_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D8_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D9引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D9_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D9_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D10引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D10_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D10_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D11引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D11_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D11_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D12引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D12_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D12_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D13引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D13_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D13_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D14引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D14_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D14_GPIO_PORT, &gpio_init_struct);
    
    /* 初始化D15引脚 */
    gpio_init_struct.Pin    = ATK_MD0350_FSMC_D15_GPIO_PIN;
    gpio_init_struct.Mode   = GPIO_MODE_AF_PP;
    gpio_init_struct.Speed  = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ATK_MD0350_FSMC_D15_GPIO_PORT, &gpio_init_struct);
    
    /* FSMC配置 */
    g_sram_handle.Instance                  = FSMC_NORSRAM_DEVICE;
    g_sram_handle.Extended                  = FSMC_NORSRAM_EXTENDED_DEVICE;
    g_sram_handle.Init.NSBank               = ATK_MD0350_FSMC_BANK;
    g_sram_handle.Init.DataAddressMux       = FSMC_DATA_ADDRESS_MUX_DISABLE;
    g_sram_handle.Init.MemoryType           = FSMC_MEMORY_TYPE_SRAM;
    g_sram_handle.Init.MemoryDataWidth      = FSMC_NORSRAM_MEM_BUS_WIDTH_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.WrapMode             = FSMC_WRAP_MODE_DISABLE;
    g_sram_handle.Init.WaitSignalActive     = FSMC_WAIT_TIMING_BEFORE_WS;
    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读时序配置 */
    read_timing.AddressSetupTime            = ATK_MD0350_FSMC_READ_AST;
    read_timing.DataSetupTime               = ATK_MD0350_FSMC_READ_DST;
    read_timing.BusTurnAroundDuration       = 0;
    read_timing.AccessMode                  = FSMC_ACCESS_MODE_A;
    /* FSMC写时序配置 */
    write_timing.AddressSetupTime           = ATK_MD0350_FSMC_WRITE_AST;
    write_timing.DataSetupTime              = ATK_MD0350_FSMC_WRITE_DST;
    write_timing.BusTurnAroundDuration      = 0;
    write_timing.AccessMode                 = FSMC_ACCESS_MODE_A;
    /* 初始化FSMC */
    HAL_SRAM_Init(&g_sram_handle, &read_timing, &write_timing);
}

atk_md0350_fsmc.h

/**
 ****************************************************************************************************
 * @file        atk_md0350_fsmc.h
 * @author      正点原子团队(ALIENTEK)
 * @version     V1.0
 * @date        2022-06-21
 * @brief       ATK-MD0350模块FSMC接口驱动代码
 * @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
 ****************************************************************************************************
 * @attention
 *
 * 实验平台:正点原子 STM32F103开发板
 * 在线视频:www.yuanzige.com
 * 技术论坛:www.openedv.com
 * 公司网址:www.alientek.com
 * 购买地址:openedv.taobao.com
 *
 ****************************************************************************************************
 */

#ifndef __ATK_MD0350_FSMC_H
#define __ATK_MD0350_FSMC_H

// #include "./SYSTEM/sys/sys.h"
#include "main.h"

/* ATK-MD0350模块FSMC接口定义 */
#define ATK_MD0350_FSMC_BANK      FSMC_NORSRAM_BANK4 /* ATK-MD0350模块所接FSMC的Bank */
#define ATK_MD0350_FSMC_BANK_ADDR (0x6C000000)
#define ATK_MD0350_FSMC_REG_SEL   (10)
#define ATK_MD0350_FSMC_READ_AST  0x00 /* 读时序的地址建立时间,单位:HCLK */
#define ATK_MD0350_FSMC_READ_DST  0x0F /* 读时序的数据建立时间,单位:HCLK */
#define ATK_MD0350_FSMC_WRITE_AST 0x00 /* 写时序的地址建立时间,单位:HCLK */
#define ATK_MD0350_FSMC_WRITE_DST 0x01 /* 写时序的数据建立时间,单位:HCLK */
#define ATK_MD0350_FSMC_CLK_ENABLE() \
    do {                             \
        __HAL_RCC_FSMC_CLK_ENABLE(); \
    } while (0) /* ATK-MD0350模块所接FSMC时钟使能 */

/* ATK-MD0350模块FSMC接口读写命令、数据地址 */
#define ATK_MD0350_FSMC_CMD_ADDR (ATK_MD0350_FSMC_BANK_ADDR | (((1U << ATK_MD0350_FSMC_REG_SEL) - 1) << 1))
#define ATK_MD0350_FSMC_DAT_ADDR (ATK_MD0350_FSMC_BANK_ADDR | ((1U << ATK_MD0350_FSMC_REG_SEL) << 1))

/* ATK-MD0350模块FSMC接口读写命令、数据 */
#define ATK_MD0350_FSMC_CMD_REG (*(volatile uint16_t *)ATK_MD0350_FSMC_CMD_ADDR)
#define ATK_MD0350_FSMC_DAT_REG (*(volatile uint16_t *)ATK_MD0350_FSMC_DAT_ADDR)

/* 引脚定义 */
#define ATK_MD0350_FSMC_RS_GPIO_PORT GPIOG
#define ATK_MD0350_FSMC_RS_GPIO_PIN  GPIO_PIN_0
#define ATK_MD0350_FSMC_RS_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOG_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_CS_GPIO_PORT GPIOG
#define ATK_MD0350_FSMC_CS_GPIO_PIN  GPIO_PIN_12
#define ATK_MD0350_FSMC_CS_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOG_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_RD_GPIO_PORT GPIOD
#define ATK_MD0350_FSMC_RD_GPIO_PIN  GPIO_PIN_4
#define ATK_MD0350_FSMC_RD_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOD_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_WR_GPIO_PORT GPIOD
#define ATK_MD0350_FSMC_WR_GPIO_PIN  GPIO_PIN_5
#define ATK_MD0350_FSMC_WR_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOD_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_D0_GPIO_PORT GPIOD
#define ATK_MD0350_FSMC_D0_GPIO_PIN  GPIO_PIN_14
#define ATK_MD0350_FSMC_D0_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOD_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_D1_GPIO_PORT GPIOD
#define ATK_MD0350_FSMC_D1_GPIO_PIN  GPIO_PIN_15
#define ATK_MD0350_FSMC_D1_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOD_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_D2_GPIO_PORT GPIOD
#define ATK_MD0350_FSMC_D2_GPIO_PIN  GPIO_PIN_0
#define ATK_MD0350_FSMC_D2_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOD_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_D3_GPIO_PORT GPIOD
#define ATK_MD0350_FSMC_D3_GPIO_PIN  GPIO_PIN_1
#define ATK_MD0350_FSMC_D3_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOD_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_D4_GPIO_PORT GPIOE
#define ATK_MD0350_FSMC_D4_GPIO_PIN  GPIO_PIN_7
#define ATK_MD0350_FSMC_D4_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOE_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_D5_GPIO_PORT GPIOE
#define ATK_MD0350_FSMC_D5_GPIO_PIN  GPIO_PIN_8
#define ATK_MD0350_FSMC_D5_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOE_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_D6_GPIO_PORT GPIOE
#define ATK_MD0350_FSMC_D6_GPIO_PIN  GPIO_PIN_9
#define ATK_MD0350_FSMC_D6_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOE_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_D7_GPIO_PORT GPIOE
#define ATK_MD0350_FSMC_D7_GPIO_PIN  GPIO_PIN_10
#define ATK_MD0350_FSMC_D7_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOE_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_D8_GPIO_PORT GPIOE
#define ATK_MD0350_FSMC_D8_GPIO_PIN  GPIO_PIN_11
#define ATK_MD0350_FSMC_D8_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOE_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_D9_GPIO_PORT GPIOE
#define ATK_MD0350_FSMC_D9_GPIO_PIN  GPIO_PIN_12
#define ATK_MD0350_FSMC_D9_GPIO_CLK_ENABLE() \
    do {                                     \
        __HAL_RCC_GPIOE_CLK_ENABLE();        \
    } while (0)
#define ATK_MD0350_FSMC_D10_GPIO_PORT GPIOE
#define ATK_MD0350_FSMC_D10_GPIO_PIN  GPIO_PIN_13
#define ATK_MD0350_FSMC_D10_GPIO_CLK_ENABLE() \
    do {                                      \
        __HAL_RCC_GPIOE_CLK_ENABLE();         \
    } while (0)
#define ATK_MD0350_FSMC_D11_GPIO_PORT GPIOE
#define ATK_MD0350_FSMC_D11_GPIO_PIN  GPIO_PIN_14
#define ATK_MD0350_FSMC_D11_GPIO_CLK_ENABLE() \
    do {                                      \
        __HAL_RCC_GPIOE_CLK_ENABLE();         \
    } while (0)
#define ATK_MD0350_FSMC_D12_GPIO_PORT GPIOE
#define ATK_MD0350_FSMC_D12_GPIO_PIN  GPIO_PIN_15
#define ATK_MD0350_FSMC_D12_GPIO_CLK_ENABLE() \
    do {                                      \
        __HAL_RCC_GPIOE_CLK_ENABLE();         \
    } while (0)
#define ATK_MD0350_FSMC_D13_GPIO_PORT GPIOD
#define ATK_MD0350_FSMC_D13_GPIO_PIN  GPIO_PIN_8
#define ATK_MD0350_FSMC_D13_GPIO_CLK_ENABLE() \
    do {                                      \
        __HAL_RCC_GPIOD_CLK_ENABLE();         \
    } while (0)
#define ATK_MD0350_FSMC_D14_GPIO_PORT GPIOD
#define ATK_MD0350_FSMC_D14_GPIO_PIN  GPIO_PIN_9
#define ATK_MD0350_FSMC_D14_GPIO_CLK_ENABLE() \
    do {                                      \
        __HAL_RCC_GPIOD_CLK_ENABLE();         \
    } while (0)
#define ATK_MD0350_FSMC_D15_GPIO_PORT GPIOD
#define ATK_MD0350_FSMC_D15_GPIO_PIN  GPIO_PIN_10
#define ATK_MD0350_FSMC_D15_GPIO_CLK_ENABLE() \
    do {                                      \
        __HAL_RCC_GPIOD_CLK_ENABLE();         \
    } while (0)

/* 操作函数 */
void atk_md0350_fsmc_init(void);                                    /* ATK-MD0350模块FSMC接口初始化 */
static inline void atk_md0350_fsmc_write_cmd(volatile uint16_t cmd) /* ATK-MD0350模块通过FSMC接口写命令 */
{
    ATK_MD0350_FSMC_CMD_REG = cmd;
}
static inline void atk_md0350_fsmc_write_dat(volatile uint16_t dat) /* ATK-MD0350模块通过FSMC接口写数据 */
{
    ATK_MD0350_FSMC_DAT_REG = dat;
}
static inline void atk_md0350_fsmc_write_reg(volatile uint16_t reg, volatile uint16_t dat) /* ATK-MD0350模块通过FSMC接口写寄存器 */
{
    ATK_MD0350_FSMC_CMD_REG = reg;
    ATK_MD0350_FSMC_DAT_REG = dat;
}
static inline uint16_t atk_md0350_fsmc_read_dat(void) /* ATK-MD0350模块通过FSMC接口读数据 */
{
    uint16_t dat;

    __NOP();
    __NOP();
    dat = ATK_MD0350_FSMC_DAT_REG;

    return dat;
}

#endif

过几天出一份精简的吧,目前为了调试,都是注释,部分代码可以更改下名称

你可能感兴趣的:(STM32,stm32,嵌入式硬件,单片机)