chrisrh 发表于 2024-3-9 09:48

【ST NUCLEO-U5A5ZJ-Q开发板测评】5、SPI和LCD

<div class='showpostmsg'> 本帖最后由 chrisrh 于 2024-3-9 09:47 编辑

<p>SPI和LCD</p>

<article data-content="[{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;idQf-1709528943549&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;8tRV-1709528943547&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;LCD用的是个7789的2.4寸LCD,自己之前画的底板,适配插焊用的18PIN接口屏幕,TB上的电阻触摸屏;&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;LRPn-1709718321464&quot;,&quot;name&quot;:&quot;image&quot;,&quot;data&quot;:{&quot;version&quot;:1,&quot;url&quot;:&quot;https://note.youdao.com/yws/res/15814/WEBRESOURCE40ea95c9128ff359d747e0a69b4c1714&quot;,&quot;width&quot;:492,&quot;height&quot;:309,&quot;fromIdentity&quot;:&quot;&quot;},&quot;nodes&quot;:[],&quot;state&quot;:{&quot;renderSource&quot;:&quot;https://note.youdao.com/yws/res/15814/WEBRESOURCE40ea95c9128ff359d747e0a69b4c1714&quot;,&quot;initialSize&quot;:{&quot;width&quot;:492,&quot;height&quot;:426},&quot;loading&quot;:false}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;hMOM-1709528950119&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Kae0-1709528950117&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;qk6F-1709528950628&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;NtQd-1709528950627&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;屏幕的驱动,在&quot;,&quot;marks&quot;:[]}]},{&quot;type&quot;:&quot;inline&quot;,&quot;id&quot;:&quot;bYK4-1709718601174&quot;,&quot;name&quot;:&quot;link&quot;,&quot;data&quot;:{&quot;href&quot;:&quot;http://www.lcdwiki.com&quot;},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;IDCN-1709718601173&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;www.lcdwiki.com&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Z2TH-1709718601175&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;查找使用,先点亮屏幕,再跟进自己的需求进行更改&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;MmDY-1709718599721&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;hBGw-1709718599719&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]},{&quot;type&quot;:&quot;inline&quot;,&quot;id&quot;:&quot;JYrv-1709718574895&quot;,&quot;name&quot;:&quot;link&quot;,&quot;data&quot;:{&quot;href&quot;:&quot;http://www.lcdwiki.com/0.96inch_IPS_ST7789_Module_SKU:MSP0964&quot;},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;sLkl-1709718574896&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;0.96inch IPS ST7789 Module SKU:MSP0964 - LCD wiki&quot;,&quot;marks&quot;:[]}]}]},{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;y55a-1709718574907&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;nlwD-1709718548357&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;mk6i-1709718548355&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;使用STM32cubeMX基于U5A5-nucleo板生成基础工程,在工程内开启SPI,选用SPI1&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;s8X7-1709822659391&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;FyuU-1709822659389&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;引脚如下:&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;7qSw-1709822751385&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;YPvl-1709822751383&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;PA5&lt;-&gt;SPI1_SCK&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;Bxfa-1709822754496&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;W32U-1709822754495&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;PA7&lt;-&gt;SPI1_MOSI&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;JVjg-1709822760833&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;ohcV-1709822760832&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;PA6&lt;-&gt;LCD_CS&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;76Jb-1709822765443&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;01oH-1709822765442&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;PB8&lt;-&gt;LCD_RST&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;yIRN-1709822789370&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;4Eem-1709822789368&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;PB9&lt;-&gt;LCD_DC&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;PGRg-1709822799600&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;rA5Z-1709822799599&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;PF12&lt;-&gt;LCD_BL&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;UmtW-1709822858124&quot;,&quot;name&quot;:&quot;image&quot;,&quot;data&quot;:{&quot;version&quot;:1,&quot;url&quot;:&quot;https://note.youdao.com/yws/res/4/WEBRESOURCEdcba694c6cd0dc4e71aee73560f7d8c4&quot;,&quot;width&quot;:691,&quot;height&quot;:237,&quot;fromIdentity&quot;:&quot;&quot;},&quot;nodes&quot;:[],&quot;state&quot;:{&quot;loading&quot;:false,&quot;renderSource&quot;:&quot;https://note.youdao.com/yws/res/4/WEBRESOURCEdcba694c6cd0dc4e71aee73560f7d8c4&quot;,&quot;initialSize&quot;:{&quot;width&quot;:1790,&quot;height&quot;:616}}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;TWHB-1709822727102&quot;,&quot;name&quot;:&quot;image&quot;,&quot;data&quot;:{&quot;version&quot;:1,&quot;url&quot;:&quot;https://note.youdao.com/yws/res/2/WEBRESOURCEbe5bdf41e3d349b5d029f9e5becfade2&quot;,&quot;width&quot;:691,&quot;height&quot;:303,&quot;fromIdentity&quot;:&quot;&quot;},&quot;nodes&quot;:[],&quot;state&quot;:{&quot;loading&quot;:false,&quot;renderSource&quot;:&quot;https://note.youdao.com/yws/res/2/WEBRESOURCEbe5bdf41e3d349b5d029f9e5becfade2&quot;,&quot;initialSize&quot;:{&quot;width&quot;:1782,&quot;height&quot;:785}}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;hFQd-1709822650831&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;zY6j-1709822650829&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;TfXu-1709821487035&quot;,&quot;name&quot;:&quot;image&quot;,&quot;data&quot;:{&quot;version&quot;:1,&quot;url&quot;:&quot;https://note.youdao.com/yws/res/2/WEBRESOURCE56d967f9447396beb4aca7fba51b6e42&quot;,&quot;width&quot;:671,&quot;height&quot;:275,&quot;fromIdentity&quot;:&quot;&quot;},&quot;nodes&quot;:[],&quot;state&quot;:{&quot;loading&quot;:false,&quot;renderSource&quot;:&quot;https://note.youdao.com/yws/res/2/WEBRESOURCE56d967f9447396beb4aca7fba51b6e42&quot;,&quot;initialSize&quot;:{&quot;width&quot;:1904,&quot;height&quot;:779}}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;FV4e-1709821414051&quot;,&quot;name&quot;:&quot;image&quot;,&quot;data&quot;:{&quot;version&quot;:1,&quot;url&quot;:&quot;https://note.youdao.com/yws/res/9/WEBRESOURCE69203c1d383a52155672887f55370049&quot;,&quot;width&quot;:325,&quot;height&quot;:147,&quot;fromIdentity&quot;:&quot;&quot;},&quot;nodes&quot;:[],&quot;state&quot;:{&quot;loading&quot;:false,&quot;renderSource&quot;:&quot;https://note.youdao.com/yws/res/9/WEBRESOURCE69203c1d383a52155672887f55370049&quot;,&quot;initialSize&quot;:{&quot;width&quot;:564,&quot;height&quot;:242}}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;1xYf-1709821414058&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;lHZT-1709821414056&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;主时钟是160Mhz,时钟里SPI也是160Mhz,在配置SPI1分频的时候选择4分频,分配到40Mhz才能正常使用SPI;&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;QI1w-1709821643074&quot;,&quot;name&quot;:&quot;image&quot;,&quot;data&quot;:{&quot;version&quot;:1,&quot;url&quot;:&quot;https://note.youdao.com/yws/res/5/WEBRESOURCE75034841888e8b8de7421a62f1798a95&quot;,&quot;width&quot;:2556,&quot;height&quot;:1315,&quot;fromIdentity&quot;:&quot;&quot;},&quot;nodes&quot;:[],&quot;state&quot;:{&quot;loading&quot;:false,&quot;renderSource&quot;:&quot;https://note.youdao.com/yws/res/5/WEBRESOURCE75034841888e8b8de7421a62f1798a95&quot;,&quot;initialSize&quot;:{&quot;width&quot;:2556,&quot;height&quot;:1315}}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;c06x-1709820918396&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;NrWZ-1709820918395&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;生成工程,在工程中添加lcd.c、lcd.h、font.h&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}},{&quot;type&quot;:&quot;block&quot;,&quot;id&quot;:&quot;dDWO-1709823405530&quot;,&quot;name&quot;:&quot;paragraph&quot;,&quot;data&quot;:{},&quot;nodes&quot;:[{&quot;type&quot;:&quot;text&quot;,&quot;id&quot;:&quot;Oj35-1709823405529&quot;,&quot;leaves&quot;:[{&quot;text&quot;:&quot;lcd.c如下&quot;,&quot;marks&quot;:[]}]}],&quot;state&quot;:{}}]">
<p>LCD用的是个7789的2.4寸LCD,自己之前画的底板,适配插焊用的18PIN接口屏幕,TB上的电阻触摸屏;</p>

<p> &nbsp;</p>

<p>屏幕的驱动,在<a href="http://www.lcdwiki.com">www.lcdwiki.com</a>查找7789更改使用的,先点亮屏幕,再跟进自己的需求进行更改</p>

<div></div>

<p>使用STM32cubeMX基于U5A5-nucleo板生成基础工程,在工程内开启SPI,选用SPI1</p>

<p>引脚如下:</p>

<ul>
        <li>PA5&lt;-&gt;SPI1_SCK</li>
        <li>PA7&lt;-&gt;SPI1_MOSI</li>
        <li>PA6&lt;-&gt;LCD_CS</li>
        <li>PB8&lt;-&gt;LCD_RST</li>
        <li>PB9&lt;-&gt;LCD_DC</li>
        <li>PF12&lt;-&gt;LCD_BL</li>
</ul>

<p> &nbsp;</p>

<p> &nbsp;</p>

<p> &nbsp;</p>

<p> &nbsp;</p>

<p>主时钟是160Mhz,时钟里SPI也是160Mhz,在配置SPI1分频的时候选择4分频,分配到40Mhz才能正常使用SPI;</p>

<p> &nbsp;</p>

<p>生成工程,在工程中添加lcd.c、lcd.h、font.h</p>

<p>lcd.c如下</p>
</article>

<pre>
<code class="language-cpp">#include &quot;lcd.h&quot;
#include &quot;stdlib.h&quot;
#include &quot;string.h&quot;
#include &quot;main.h&quot;
#include &quot;pic.h&quot;
#include &quot;font.h&quot;


//管理LCD重要参数
//默认为竖屏
_lcd_dev lcddev;

//画笔颜色,背景颜色
uint16_t POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;
uint16_t DeviceCode;

uint16_t ColorTab={RED,GREEN,BLUE,YELLOW,BRED};
extern SPI_HandleTypeDef hspi1;

/*****************************************************************************
* <a href="home.php?mod=space&amp;uid=32621" target="_blank">@name </a>       :void LCD_WR_REG(u8 data)
* <a href="home.php?mod=space&amp;uid=311857" target="_blank">@date </a>       :2018-08-09
* <a href="home.php?mod=space&amp;uid=665173" target="_blank">@FUNCTION </a>   :Write an 8-bit command to the LCD screen
* @parameters :data:Command value to be written
* @retvalue   :None
******************************************************************************/
void LCD_WR_REG(uint8_t data)
{
        LCD_CS_CLR;
        LCD_RS_CLR;
        SPI_WriteByte(data);
        LCD_CS_SET;
}

/*****************************************************************************
* @name       :void LCD_WR_DATA(u8 data)
* @date       :2018-08-09
* @function   :Write an 8-bit data to the LCD screen
* @parameters :data:data value to be written
* @retvalue   :None
******************************************************************************/
void LCD_WR_DATA(uint8_t data)
{
        LCD_CS_CLR;
        LCD_RS_SET;
        SPI_WriteByte(data);
        LCD_CS_SET;
}

/*****************************************************************************
* @name       :void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
* @date       :2018-08-09
* @function   :Write data into registers
* @parameters :LCD_Reg:Register address
                LCD_RegValue:Data to be written
* @retvalue   :None
******************************************************************************/
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{
        LCD_WR_REG(LCD_Reg);
        LCD_WR_DATA(LCD_RegValue);
}

/*****************************************************************************
* @name       :void LCD_WriteRAM_Prepare(void)
* @date       :2018-08-09
* @function   :Write GRAM
* @parameters :None
* @retvalue   :None
******************************************************************************/
void LCD_WriteRAM_Prepare(void)
{
        LCD_WR_REG(lcddev.wramcmd);
}


/*****************************************************************************
* @name       :void Lcd_WriteData_16Bit(u16 Data)
* @date       :2018-08-09
* @function   :Write an 16-bit command to the LCD screen
* @parameters :Data:Data to be written
* @retvalue   :None
******************************************************************************/
void LCD_WriteData_16Bit(uint16_t Data)
{
        LCD_CS_CLR;
        LCD_RS_SET;
        SPI_WriteByte(Data&gt;&gt;8);
        SPI_WriteByte(Data);
        LCD_CS_SET;
}

/*****************************************************************************
* @name       :void LCD_DrawPoint(u16 x,u16 y)
* @date       :2018-08-09
* @function   :Write a pixel data at a specified location
* @parameters :x:the x coordinate of the pixel
                y:the y coordinate of the pixel
* @retvalue   :None
******************************************************************************/
void LCD_DrawPoint(uint16_t x,uint16_t y)
{
        LCD_SetCursor(x,y);//设置光标位置
        LCD_WriteData_16Bit(POINT_COLOR);
}

/*****************************************************************************
* @name       :void LCD_Clear(u16 Color)
* @date       :2018-08-09
* @function   :Full screen filled LCD screen
* @parameters :color:Filled color
* @retvalue   :None
******************************************************************************/
void LCD_Clear(uint16_t Color)
{

        uint32_t i,m;
        LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);
        LCD_CS_CLR;
        LCD_RS_SET;
        for(i=0;i&lt;lcddev.height;i++)
        {
    for(m=0;m&lt;lcddev.width;m++)
    {
                        SPI_WriteByte(Color&gt;&gt;8);
                        SPI_WriteByte(Color);
                }
        }
        LCD_CS_SET;
}

/*****************************************************************************
* @name       :void LCD_GPIOInit(void)
* @date       :2018-08-09
* @function   :Initialization LCD screen GPIO
* @parameters :None
* @retvalue   :None
******************************************************************************/
void LCD_GPIOInit(void)
{
//        GPIO_InitTypeDefGPIO_InitStructure;
//        __HAL_RCC_GPIOD_CLK_ENABLE();    //使能GPIOB时钟
//
//        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //高速
//        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;   //推挽输出
//        GPIO_InitStructure.Pull = GPIO_PULLUP;         //上拉
//
//        GPIO_InitStructure.Pin = LCD_BL_PIN;
//        HAL_GPIO_Init(LCD_BL_PORT, &amp;GPIO_InitStructure);//初始化BL引脚
//
//        GPIO_InitStructure.Pin = LCD_CS_PIN;
//        HAL_GPIO_Init(LCD_CS_PORT, &amp;GPIO_InitStructure);//初始化CS引脚
//
//        GPIO_InitStructure.Pin = LCD_RS_PIN;
//        HAL_GPIO_Init(LCD_RS_PORT, &amp;GPIO_InitStructure);//初始化RS引脚
//
//        GPIO_InitStructure.Pin = LCD_RST_PIN;
//        HAL_GPIO_Init(LCD_RST_PORT, &amp;GPIO_InitStructure);//初始化RST引脚
//
        //默认所有的引脚都拉高
        LCD_BL_SET;
        LCD_CS_SET;
        LCD_RS_SET;
        LCD_RST_SET;
}

/*****************************************************************************
* @name       :void LCD_RESET(void)
* @date       :2018-08-09
* @function   :Reset LCD screen
* @parameters :None
* @retvalue   :None
******************************************************************************/
void LCD_RESET(void)
{
        LCD_RST_CLR;
        HAL_Delay(20);
        LCD_RST_SET;
        HAL_Delay(20);
}

/*****************************************************************************
* @name       :void LCD_RESET(void)
* @date       :2018-08-09
* @function   :Initialization LCD screen
* @parameters :None
* @retvalue   :None
******************************************************************************/
void LCD_Init(void)
{
        //SPI_GPIO_Init(); //硬件SPI1初始化
//        SPI_SCLK_SET;
//        SPI_MOSI_SET;
        LCD_GPIOInit();//LCD GPIO初始化
        LCD_RESET(); //LCD 复位
//************* ST7789 IPS初始化**********//
        LCD_WR_REG(0x36);
        LCD_WR_DATA(0x00);

        LCD_WR_REG(0x3A);
        LCD_WR_DATA(0x05);

        LCD_WR_REG(0xB2);
        LCD_WR_DATA(0x0C);
        LCD_WR_DATA(0x0C);
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0x33);
        LCD_WR_DATA(0x33);

        LCD_WR_REG(0xB7);
        LCD_WR_DATA(0x35);

        LCD_WR_REG(0xBB);
        LCD_WR_DATA(0x17);

        LCD_WR_REG(0xC0);
        LCD_WR_DATA(0x2C);

        LCD_WR_REG(0xC2);
        LCD_WR_DATA(0x01);

        LCD_WR_REG(0xC3);
        LCD_WR_DATA(0x12);

        LCD_WR_REG(0xC4);
        LCD_WR_DATA(0x20);

        LCD_WR_REG(0xC6);
        LCD_WR_DATA(0x0F);

        LCD_WR_REG(0xD0);
        LCD_WR_DATA(0xA4);
        LCD_WR_DATA(0xA1);

        LCD_WR_REG(0xE0);
        LCD_WR_DATA(0xD0);
        LCD_WR_DATA(0x04);
        LCD_WR_DATA(0x0D);
        LCD_WR_DATA(0x11);
        LCD_WR_DATA(0x13);
        LCD_WR_DATA(0x2B);
        LCD_WR_DATA(0x3F);
        LCD_WR_DATA(0x54);
        LCD_WR_DATA(0x4C);
        LCD_WR_DATA(0x18);
        LCD_WR_DATA(0x0D);
        LCD_WR_DATA(0x0B);
        LCD_WR_DATA(0x1F);
        LCD_WR_DATA(0x23);

        LCD_WR_REG(0xE1);
        LCD_WR_DATA(0xD0);
        LCD_WR_DATA(0x04);
        LCD_WR_DATA(0x0C);
        LCD_WR_DATA(0x11);
        LCD_WR_DATA(0x13);
        LCD_WR_DATA(0x2C);
        LCD_WR_DATA(0x3F);
        LCD_WR_DATA(0x44);
        LCD_WR_DATA(0x51);
        LCD_WR_DATA(0x2F);
        LCD_WR_DATA(0x1F);
        LCD_WR_DATA(0x1F);
        LCD_WR_DATA(0x20);
        LCD_WR_DATA(0x23);

        LCD_WR_REG(0x21);

        LCD_WR_REG(0x11);
        //Delay (120);

        LCD_WR_REG(0x29);

        LCD_direction(USE_HORIZONTAL);//设置LCD显示方向
        LCD_BL_SET;//点亮背光
        LCD_Clear(WHITE);//清全屏白色
}

/*****************************************************************************
* @name       :void LCD_SetWindows(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd)
* @date       :2018-08-09
* @function   :Setting LCD display window
* @parameters :xStar:the bebinning x coordinate of the LCD display window
                                                                yStar:the bebinning y coordinate of the LCD display window
                                                                xEnd:the endning x coordinate of the LCD display window
                                                                yEnd:the endning y coordinate of the LCD display window
* @retvalue   :None
******************************************************************************/
void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd)
{
        LCD_WR_REG(lcddev.setxcmd);
        LCD_WR_DATA((xStar+lcddev.xoffset)&gt;&gt;8);
        LCD_WR_DATA(xStar+lcddev.xoffset);
        LCD_WR_DATA((xEnd+lcddev.xoffset)&gt;&gt;8);
        LCD_WR_DATA(xEnd+lcddev.xoffset);

        LCD_WR_REG(lcddev.setycmd);
        LCD_WR_DATA((yStar+lcddev.yoffset)&gt;&gt;8);
        LCD_WR_DATA(yStar+lcddev.yoffset);
        LCD_WR_DATA((yEnd+lcddev.yoffset)&gt;&gt;8);
        LCD_WR_DATA(yEnd+lcddev.yoffset);

        LCD_WriteRAM_Prepare();        //开始写入GRAM
}

/*****************************************************************************
* @name       :void LCD_SetCursor(u16 Xpos, u16 Ypos)
* @date       :2018-08-09
* @function   :Set coordinate value
* @parameters :Xpos:thex coordinate of the pixel
                                                                Ypos:they coordinate of the pixel
* @retvalue   :None
******************************************************************************/
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
        LCD_SetWindows(Xpos,Ypos,Xpos,Ypos);
}

/*****************************************************************************
* @name       :void LCD_direction(u8 direction)
* @date       :2018-08-09
* @function   :Setting the display direction of LCD screen
* @parameters :direction:0-0 degree
                        1-90 degree
                                                                                                        2-180 degree
                                                                                                        3-270 degree
* @retvalue   :None
******************************************************************************/
void LCD_direction(uint8_t direction)
{
                        lcddev.setxcmd=0x2A;
                        lcddev.setycmd=0x2B;
                        lcddev.wramcmd=0x2C;
                        lcddev.dir = direction%4;
        switch(lcddev.dir){
                case 0:
                        lcddev.width=LCD_W;
                        lcddev.height=LCD_H;
                        lcddev.xoffset=0;
                        lcddev.yoffset=0;
                        LCD_WriteReg(0x36,0);//BGR==1,MY==0,MX==0,MV==0
                break;
                case 1:
                        lcddev.width=LCD_H;
                        lcddev.height=LCD_W;
                        lcddev.xoffset=0;
                        lcddev.yoffset=0;
                        LCD_WriteReg(0x36,(1&lt;&lt;6)|(1&lt;&lt;5));//BGR==1,MY==1,MX==0,MV==1
                break;
                case 2:
                        lcddev.width=LCD_W;
                        lcddev.height=LCD_H;
      lcddev.xoffset=0;
                        lcddev.yoffset=122;
                        LCD_WriteReg(0x36,(1&lt;&lt;6)|(1&lt;&lt;7));//BGR==1,MY==0,MX==0,MV==0
                break;
                case 3:
                        lcddev.width=LCD_H;
                        lcddev.height=LCD_W;
                        lcddev.xoffset=122;
                        lcddev.yoffset=0;
                        LCD_WriteReg(0x36,(1&lt;&lt;7)|(1&lt;&lt;5));//BGR==1,MY==1,MX==0,MV==1
                break;
                default:break;
        }
}



/*****************************************************************************
* @name       :voidSPI_WriteByte(u8 Data)
* @date       :2018-08-09
* @function   :Write a byte of data using STM32&#39;s Software SPI
* @parameters :Data:Data to be written
* @retvalue   :None
******************************************************************************/
//void SPI_WriteByte(uint8_t Data)
//{
//        uint8_t i=0;
//        for(i=8;i&gt;0;i--)
//        {
//          if(Data&amp;0x80)
//                        SPI_MOSI_SET; //输出数据
//          else
//                          SPI_MOSI_CLR;
//                        SPI_SCLK_CLR;
//                        SPI_SCLK_SET;
//                        Data&lt;&lt;=1;
//        }
//}

void SPI_WriteByte(uint8_t Data)
{
        HAL_SPI_Transmit(&amp;hspi1,&amp;Data,1,1);
//        HAL_Delay(10);
}










//////////////////////////////////////////////////////////////////
/*GUI*/
//////////////////////////////////////////////////////////////////

/*******************************************************************
* @name       :void GUI_DrawPoint(u16 x,u16 y,u16 color)
* @date       :2018-08-09
* @function   :draw a point in LCD screen
* @parameters :x:the x coordinate of the point
                y:the y coordinate of the point
                                                                color:the color value of the point
* @retvalue   :None
********************************************************************/
void GUI_DrawPoint(uint16_t x,uint16_t y,uint16_t color)
{
        LCD_SetCursor(x,y);//设置光标位置
        LCD_WriteData_16Bit(color);
}

/*******************************************************************
* @name       :void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
* @date       :2018-08-09
* @function   :fill the specified area
* @parameters :sx:the bebinning x coordinate of the specified area
                sy:the bebinning y coordinate of the specified area
                                                                ex:the ending x coordinate of the specified area
                                                                ey:the ending y coordinate of the specified area
                                                                color:the filled color value
* @retvalue   :None
********************************************************************/
void LCD_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t color)
{
        uint16_t i,j;
        uint16_t width=ex-sx+1;                 //得到填充的宽度
        uint16_t height=ey-sy+1;                //高度
        LCD_SetWindows(sx,sy,ex,ey);//设置显示窗口
        for(i=0;i&lt;height;i++)
        {
                for(j=0;j&lt;width;j++)
                LCD_WriteData_16Bit(color);        //写入数据
        }
        LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口设置为全屏
}

/*******************************************************************
* @name       :void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
* @date       :2018-08-09
* @function   :Draw a line between two points
* @parameters :x1:the bebinning x coordinate of the line
                y1:the bebinning y coordinate of the line
                                                                x2:the ending x coordinate of the line
                                                                y2:the ending y coordinate of the line
* @retvalue   :None
********************************************************************/
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
        uint16_t t;
        int32_t xerr=0,yerr=0,delta_x,delta_y,distance;
        int32_t incx,incy,uRow,uCol;

        delta_x=x2-x1; //计算坐标增量
        delta_y=y2-y1;
        uRow=x1;
        uCol=y1;
        if(delta_x&gt;0)incx=1; //设置单步方向
        else if(delta_x==0)incx=0;//垂直线
        else {incx=-1;delta_x=-delta_x;}
        if(delta_y&gt;0)incy=1;
        else if(delta_y==0)incy=0;//水平线
        else{incy=-1;delta_y=-delta_y;}
        if( delta_x&gt;delta_y)distance=delta_x; //选取基本增量坐标轴
        else distance=delta_y;
        for(t=0;t&lt;=distance+1;t++ )//画线输出
        {
                LCD_DrawPoint(uRow,uCol);//画点
                xerr+=delta_x ;
                yerr+=delta_y ;
                if(xerr&gt;distance)
                {
                        xerr-=distance;
                        uRow+=incx;
                }
                if(yerr&gt;distance)
                {
                        yerr-=distance;
                        uCol+=incy;
                }
        }
}

/*****************************************************************************
* @name       :void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
* @date       :2018-08-09
* @function   :Draw a rectangle
* @parameters :x1:the bebinning x coordinate of the rectangle
                y1:the bebinning y coordinate of the rectangle
                                                                x2:the ending x coordinate of the rectangle
                                                                y2:the ending y coordinate of the rectangle
* @retvalue   :None
******************************************************************************/
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
        LCD_DrawLine(x1,y1,x2,y1);
        LCD_DrawLine(x1,y1,x1,y2);
        LCD_DrawLine(x1,y2,x2,y2);
        LCD_DrawLine(x2,y1,x2,y2);
}

/*****************************************************************************
* @name       :void LCD_DrawFillRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
* @date       :2018-08-09
* @function   :Filled a rectangle
* @parameters :x1:the bebinning x coordinate of the filled rectangle
                y1:the bebinning y coordinate of the filled rectangle
                                                                x2:the ending x coordinate of the filled rectangle
                                                                y2:the ending y coordinate of the filled rectangle
* @retvalue   :None
******************************************************************************/
void LCD_DrawFillRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{
        LCD_Fill(x1,y1,x2,y2,POINT_COLOR);
}

/*****************************************************************************
* @name       :void Draw_Triangel(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
* @date       :2018-08-09
* @function   :Draw a triangle at a specified position
* @parameters :x0:the bebinning x coordinate of the triangular edge
                y0:the bebinning y coordinate of the triangular edge
                                                                x1:the vertex x coordinate of the triangular
                                                                y1:the vertex y coordinate of the triangular
                                                                x2:the ending x coordinate of the triangular edge
                                                                y2:the ending y coordinate of the triangular edge
* @retvalue   :None
******************************************************************************/
void Draw_Triangel(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
        LCD_DrawLine(x0,y0,x1,y1);
        LCD_DrawLine(x1,y1,x2,y2);
        LCD_DrawLine(x2,y2,x0,y0);
}

static void _swap(uint16_t *a, uint16_t *b)
{
        uint16_t tmp;
tmp = *a;
        *a = *b;
        *b = tmp;
}

/*****************************************************************************
* @name       :void Fill_Triangel(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
* @date       :2018-08-09
* @function   :filling a triangle at a specified position
* @parameters :x0:the bebinning x coordinate of the triangular edge
                y0:the bebinning y coordinate of the triangular edge
                                                                x1:the vertex x coordinate of the triangular
                                                                y1:the vertex y coordinate of the triangular
                                                                x2:the ending x coordinate of the triangular edge
                                                                y2:the ending y coordinate of the triangular edge
* @retvalue   :None
******************************************************************************/
void Fill_Triangel(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
        uint16_t a, b, y, last;
        int dx01, dy01, dx02, dy02, dx12, dy12;
        long sa = 0;
        long sb = 0;
        if (y0 &gt; y1)
        {
    _swap(&amp;y0,&amp;y1);
                _swap(&amp;x0,&amp;x1);
        }
        if (y1 &gt; y2)
        {
    _swap(&amp;y2,&amp;y1);
                _swap(&amp;x2,&amp;x1);
        }
if (y0 &gt; y1)
        {
    _swap(&amp;y0,&amp;y1);
                _swap(&amp;x0,&amp;x1);
}
        if(y0 == y2)
        {
                a = b = x0;
                if(x1 &lt; a)
    {
                        a = x1;
    }
    else if(x1 &gt; b)
    {
                        b = x1;
    }
    if(x2 &lt; a)
    {
                        a = x2;
    }
                else if(x2 &gt; b)
    {
                        b = x2;
    }
                LCD_Fill(a,y0,b,y0,POINT_COLOR);
    return;
        }
        dx01 = x1 - x0;
        dy01 = y1 - y0;
        dx02 = x2 - x0;
        dy02 = y2 - y0;
        dx12 = x2 - x1;
        dy12 = y2 - y1;

        if(y1 == y2)
        {
                last = y1;
        }
else
        {
                last = y1-1;
        }
        for(y=y0; y&lt;=last; y++)
        {
                a = x0 + sa / dy01;
                b = x0 + sb / dy02;
                sa += dx01;
    sb += dx02;
    if(a &gt; b)
    {
                        _swap(&amp;a,&amp;b);
                }
                LCD_Fill(a,y,b,y,POINT_COLOR);
        }
        sa = dx12 * (y - y1);
        sb = dx02 * (y - y0);
        for(; y&lt;=y2; y++)
        {
                a = x1 + sa / dy12;
                b = x0 + sb / dy02;
                sa += dx12;
                sb += dx02;
                if(a &gt; b)
                {
                        _swap(&amp;a,&amp;b);
                }
                LCD_Fill(a,y,b,y,POINT_COLOR);
        }
}


/*****************************************************************************
* @name       :void _draw_circle_8(int xc, int yc, int x, int y, u16 c)
* @date       :2018-08-09
* @function   :8 symmetry circle drawing algorithm (internal call)
* @parameters :xc:the x coordinate of the Circular center
                yc:the y coordinate of the Circular center
                                                                x:the x coordinate relative to the Circular center
                                                                y:the y coordinate relative to the Circular center
                                                                c:the color value of the circle
* @retvalue   :None
******************************************************************************/
void _draw_circle_8(int32_t xc, int32_t yc, int32_t x, int32_t y, uint16_t c)
{
        GUI_DrawPoint(xc + x, yc + y, c);

        GUI_DrawPoint(xc - x, yc + y, c);

        GUI_DrawPoint(xc + x, yc - y, c);

        GUI_DrawPoint(xc - x, yc - y, c);

        GUI_DrawPoint(xc + y, yc + x, c);

        GUI_DrawPoint(xc - y, yc + x, c);

        GUI_DrawPoint(xc + y, yc - x, c);

        GUI_DrawPoint(xc - y, yc - x, c);
}

/*****************************************************************************
* @name       :void gui_circle(int xc, int yc,u16 c,int r, int fill)
* @date       :2018-08-09
* @function   :Draw a circle of specified size at a specified location
* @parameters :xc:the x coordinate of the Circular center
                yc:the y coordinate of the Circular center
                                                                r:Circular radius
                                                                fill:1-filling,0-no filling
* @retvalue   :None
******************************************************************************/
void gui_circle(int32_t xc, int32_t yc,uint16_t c,int32_t r, int32_t fill)
{
        int32_t x = 0, y = r, yi, d;

        d = 3 - 2 * r;


        if (fill)
        {
                // 如果填充(画实心圆)
                while (x &lt;= y) {
                        for (yi = x; yi &lt;= y; yi++)
                                _draw_circle_8(xc, yc, x, yi, c);

                        if (d &lt; 0) {
                                d = d + 4 * x + 6;
                        } else {
                                d = d + 4 * (x - y) + 10;
                                y--;
                        }
                        x++;
                }
        } else
        {
                // 如果不填充(画空心圆)
                while (x &lt;= y) {
                        _draw_circle_8(xc, yc, x, y, c);
                        if (d &lt; 0) {
                                d = d + 4 * x + 6;
                        } else {
                                d = d + 4 * (x - y) + 10;
                                y--;
                        }
                        x++;
                }
        }
}


/*****************************************************************************
* @name       :void LCD_ShowChar(u16 x,u16 y,u16 fc, u16 bc, u8 num,u8 size,u8 mode)
* @date       :2018-08-09
* @function   :Display a single English character
* @parameters :x:the bebinning x coordinate of the Character display position
                y:the bebinning y coordinate of the Character display position
                                                                fc:the color value of display character
                                                                bc:the background color of display character
                                                                num:the ascii code of display character(0~94)
                                                                size:the size of display character
                                                                mode:0-no overlying,1-overlying
* @retvalue   :None
******************************************************************************/
void LCD_ShowChar(uint16_t x,uint16_t y,uint16_t fc, uint16_t bc, uint8_t num,uint8_t size,uint8_t mode)
{
    uint8_t temp;
    uint8_t pos,t;
        uint16_t colortemp=POINT_COLOR;
        num=num-&#39; &#39;;//得到偏移后的值
        if(!mode) //非叠加方式
        {
                LCD_SetWindows(x,y,x+size/2-1,y+size-1);//设置单个文字显示窗口
                for(pos=0;pos&lt;size;pos++)
                {
                        if(size==12)temp=asc2_1206;//调用1206字体
                        else temp=asc2_1608;               //调用1608字体
                        for(t=0;t&lt;size/2;t++)
                  {
                        if(temp&amp;0x01) LCD_WriteData_16Bit(fc);
                                else LCD_WriteData_16Bit(bc);
                                temp&gt;&gt;=1;
                  }
                }
        }else//叠加方式
        {
                for(pos=0;pos&lt;size;pos++)
                {
                        if(size==12)temp=asc2_1206;//调用1206字体
                        else temp=asc2_1608;               //调用1608字体
                        for(t=0;t&lt;size/2;t++)
                  {
                                POINT_COLOR=fc;
                        if(temp&amp;0x01)LCD_DrawPoint(x+t,y+pos);//画一个点
                        temp&gt;&gt;=1;
                  }
                }
        }
        POINT_COLOR=colortemp;
        LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏
}

/*****************************************************************************
* @name       :void LCD_ShowString(u16 x,u16 y,u8 size,u8 *p,u8 mode)
* @date       :2018-08-09
* @function   :Display English string
* @parameters :x:the bebinning x coordinate of the English string
                y:the bebinning y coordinate of the English string
                                                                p:the start address of the English string
                                                                size:the size of display character
                                                                mode:0-no overlying,1-overlying
* @retvalue   :None
******************************************************************************/
void LCD_ShowString(uint16_t x,uint16_t y,uint8_t size,uint8_t *p,uint8_t mode)
{
    while((*p&lt;=&#39;~&#39;)&amp;&amp;(*p&gt;=&#39; &#39;))//判断是不是非法字符!
    {
                if(x&gt;(lcddev.width-1)||y&gt;(lcddev.height-1))
                return;
      LCD_ShowChar(x,y,POINT_COLOR,BACK_COLOR,*p,size,mode);
      x+=size/2;
      p++;
    }
}

/*****************************************************************************
* @name       :u32 mypow(u8 m,u8 n)
* @date       :2018-08-09
* @function   :get the nth power of m (internal call)
* @parameters :m:the multiplier
                n:the power
* @retvalue   :the nth power of m
******************************************************************************/
uint32_t mypow(uint8_t m,uint8_t n)
{
        uint32_t result=1;
        while(n--)result*=m;
        return result;
}

/*****************************************************************************
* @name       :void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size)
* @date       :2018-08-09
* @function   :Display number
* @parameters :x:the bebinning x coordinate of the number
                y:the bebinning y coordinate of the number
                                                                num:the number(0~4294967295)
                                                                len:the length of the display number
                                                                size:the size of display number
* @retvalue   :None
******************************************************************************/
void LCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size)
{
        uint8_t t,temp;
        uint8_t enshow=0;
        for(t=0;t&lt;len;t++)
        {
                temp=(num/mypow(10,len-t-1))%10;
                if(enshow==0&amp;&amp;t&lt;(len-1))
                {
                        if(temp==0)
                        {
                                LCD_ShowChar(x+(size/2)*t,y,POINT_COLOR,BACK_COLOR,&#39; &#39;,size,0);
                                continue;
                        }else enshow=1;

                }
               LCD_ShowChar(x+(size/2)*t,y,POINT_COLOR,BACK_COLOR,temp+&#39;0&#39;,size,0);
        }
}

/*****************************************************************************
* @name       :void GUI_DrawFont16(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
* @date       :2018-08-09
* @function   :Display a single 16x16 Chinese character
* @parameters :x:the bebinning x coordinate of the Chinese character
                y:the bebinning y coordinate of the Chinese character
                                                                fc:the color value of Chinese character
                                                                bc:the background color of Chinese character
                                                                s:the start address of the Chinese character
                                                                mode:0-no overlying,1-overlying
* @retvalue   :None
******************************************************************************/
void GUI_DrawFont16(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode)
{
        uint8_t i,j;
        uint16_t k;
        uint16_t HZnum;
        uint16_t x0=x;
        HZnum=sizeof(tfont16)/sizeof(typFNT_GB16);        //自动统计汉字数目
        for (k=0;k&lt;HZnum;k++)
        {
          if ((tfont16.Index==*(s))&amp;&amp;(tfont16.Index==*(s+1)))
          {
                        if(!mode)
                        {
                                LCD_SetWindows(x,y,x+16-1,y+16-1);
                  for(i=0;i&lt;16*2;i++)
                  {
                                        for(j=0;j&lt;8;j++)
                                        {
                                                if(tfont16.Msk&amp;(0x80&gt;&gt;j))        LCD_WriteData_16Bit(fc);
                                                else LCD_WriteData_16Bit(bc);
                                        }
                                }
                        }
                        else
                        {
                                for(i=0;i&lt;16*2;i++)
                  {
                                        for(j=0;j&lt;8;j++)
                                        {
                                                POINT_COLOR=fc;
                                                if(tfont16.Msk&amp;(0x80&gt;&gt;j))        LCD_DrawPoint(x,y);//画一个点
                                                x++;
                                                if((x-x0)==16)
                                                {
                                                        x=x0;
                                                        y++;
                                                        break;
                                                }
                                        }
                                }
                        }
                }
                continue;//查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
        }
        LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏
}

/*****************************************************************************
* @name       :void GUI_DrawFont24(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
* @date       :2018-08-09
* @function   :Display a single 24x24 Chinese character
* @parameters :x:the bebinning x coordinate of the Chinese character
                y:the bebinning y coordinate of the Chinese character
                                                                fc:the color value of Chinese character
                                                                bc:the background color of Chinese character
                                                                s:the start address of the Chinese character
                                                                mode:0-no overlying,1-overlying
* @retvalue   :None
******************************************************************************/
void GUI_DrawFont24(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode)
{
        uint8_t i,j;
        uint16_t k;
        uint16_t HZnum;
        uint16_t x0=x;
        HZnum=sizeof(tfont24)/sizeof(typFNT_GB24);        //自动统计汉字数目

                        for (k=0;k&lt;HZnum;k++)
                        {
                          if ((tfont24.Index==*(s))&amp;&amp;(tfont24.Index==*(s+1)))
                          {
                                  if(!mode) //非叠加方式
                                        {
                                                LCD_SetWindows(x,y,x+24-1,y+24-1);
                                                for(i=0;i&lt;24*3;i++)
                                  {
                                                        for(j=0;j&lt;8;j++)
                                                        {
                                                                        if(tfont24.Msk&amp;(0x80&gt;&gt;j))        LCD_WriteData_16Bit(fc);
                                                                        else LCD_WriteData_16Bit(bc);
                                                        }
                                                }
                                        }
                                        else
                                        {
                                                for(i=0;i&lt;24*3;i++)
                                  {
                                                        for(j=0;j&lt;8;j++)
                                                        {
                                                                POINT_COLOR=fc;
                                                                if(tfont24.Msk&amp;(0x80&gt;&gt;j))        LCD_DrawPoint(x,y);//画一个点
                                                                x++;
                                                                if((x-x0)==24)
                                                                {
                                                                        x=x0;
                                                                        y++;
                                                                        break;
                                                                }
                                                        }
                                                }
                                        }
                                }
                                continue;//查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
                        }
        LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏
}

/*****************************************************************************
* @name       :void GUI_DrawFont32(u16 x, u16 y, u16 fc, u16 bc, u8 *s,u8 mode)
* @date       :2018-08-09
* @function   :Display a single 32x32 Chinese character
* @parameters :x:the bebinning x coordinate of the Chinese character
                y:the bebinning y coordinate of the Chinese character
                                                                fc:the color value of Chinese character
                                                                bc:the background color of Chinese character
                                                                s:the start address of the Chinese character
                                                                mode:0-no overlying,1-overlying
* @retvalue   :None
******************************************************************************/
void GUI_DrawFont32(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode)
{
        uint8_t i,j;
        uint16_t k;
        uint16_t HZnum;
        uint16_t x0=x;
        HZnum=sizeof(tfont32)/sizeof(typFNT_GB32);        //自动统计汉字数目
        for (k=0;k&lt;HZnum;k++)
                        {
                          if ((tfont32.Index==*(s))&amp;&amp;(tfont32.Index==*(s+1)))
                          {
                                        if(!mode) //非叠加方式
                                        {
                                                LCD_SetWindows(x,y,x+32-1,y+32-1);
                                  for(i=0;i&lt;32*4;i++)
                                  {
                                                        for(j=0;j&lt;8;j++)
                                                        {
                                                                if(tfont32.Msk&amp;(0x80&gt;&gt;j))        LCD_WriteData_16Bit(fc);
                                                                else LCD_WriteData_16Bit(bc);
                                                        }
                                                }
                                        }
                                        else
                                        {
                                                for(i=0;i&lt;32*4;i++)
                                                {
                                                        for(j=0;j&lt;8;j++)
                                                        {
                                                                POINT_COLOR=fc;
                                                                if(tfont32.Msk&amp;(0x80&gt;&gt;j))        LCD_DrawPoint(x,y);//画一个点
                                                                x++;
                                                                if((x-x0)==32)
                                                                {
                                                                        x=x0;
                                                                        y++;
                                                                        break;
                                                                }
                                                        }
                                                }
                                        }
                        }
                        continue;//查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
                }
        LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复窗口为全屏
}

/*****************************************************************************
* @name       :void Show_Str(u16 x, u16 y, u16 fc, u16 bc, u8 *str,u8 size,u8 mode)
* @date       :2018-08-09
* @function   :Display Chinese and English strings
* @parameters :x:the bebinning x coordinate of the Chinese and English strings
                y:the bebinning y coordinate of the Chinese and English strings
                                                                fc:the color value of Chinese and English strings
                                                                bc:the background color of Chinese and English strings
                                                                str:the start address of the Chinese and English strings
                                                                size:the size of Chinese and English strings
                                                                mode:0-no overlying,1-overlying
* @retvalue   :None
******************************************************************************/
void Show_Str(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *str,uint8_t size,uint8_t mode)
{
        uint16_t x0=x;
        uint8_t bHz=0;   //字符或者中文
    while(*str!=0)//数据未结束
    {
      if(!bHz)
      {
                        if(x&gt;(lcddev.width-size/2)||y&gt;(lcddev.height-size))
                        return;
                if(*str&gt;0x80)bHz=1;//中文
                else            //字符
                {
                        if(*str==0x0D)//换行符号
                        {
                            y+=size;
                                        x=x0;
                            str++;
                        }
                        else
                                {
                                        if(size&gt;16)//字库中没有集成12X24 16X32的英文字体,用8X16代替
                                        {
                                        LCD_ShowChar(x,y,fc,bc,*str,16,mode);
                                        x+=8; //字符,为全字的一半
                                        }
                                        else
                                        {
                                        LCD_ShowChar(x,y,fc,bc,*str,size,mode);
                                        x+=size/2; //字符,为全字的一半
                                        }
                                }
                                str++;

                }
      }else//中文
      {
                        if(x&gt;(lcddev.width-size)||y&gt;(lcddev.height-size))
                        return;
            bHz=0;//有汉字库
                        if(size==32)
                        GUI_DrawFont32(x,y,fc,bc,str,mode);
                        else if(size==24)
                        GUI_DrawFont24(x,y,fc,bc,str,mode);
                        else
                        GUI_DrawFont16(x,y,fc,bc,str,mode);

                str+=2;
                x+=size;//下一个汉字偏移
      }
    }
}

/*****************************************************************************
* @name       :void Gui_StrCenter(u16 x, u16 y, u16 fc, u16 bc, u8 *str,u8 size,u8 mode)
* @date       :2018-08-09
* @function   :Centered display of English and Chinese strings
* @parameters :x:the bebinning x coordinate of the Chinese and English strings
                y:the bebinning y coordinate of the Chinese and English strings
                                                                fc:the color value of Chinese and English strings
                                                                bc:the background color of Chinese and English strings
                                                                str:the start address of the Chinese and English strings
                                                                size:the size of Chinese and English strings
                                                                mode:0-no overlying,1-overlying
* @retvalue   :None
******************************************************************************/
void Gui_StrCenter(int16_t x, int16_t y, uint16_t fc, uint16_t bc, uint8_t *str,uint8_t size,uint8_t mode)
{
        uint16_t len=strlen((const char *)str);
        uint16_t x1=(lcddev.width-len*8)/2;
        Show_Str(x+x1,y,fc,bc,str,size,mode);
}

/*****************************************************************************
* @name       :void Gui_Drawbmp16(u16 x,u16 y,const unsigned char *p)
* @date       :2018-08-09
* @function   :Display a 16-bit BMP image
* @parameters :x:the bebinning x coordinate of the BMP image
                y:the bebinning y coordinate of the BMP image
                                                                p:the start address of image array
* @retvalue   :None
******************************************************************************/
void Gui_Drawbmp16(uint16_t x,uint16_t y,uint16_t w, uint16_t h, const unsigned char *p) //显示40*40 QQ图片
{
        int32_t i;
        uint8_t picH,picL;
        LCD_SetWindows(x,y,x+w-1,y+h-1);//窗口设置
for(i=0;i&lt;w*h;i++)
        {
               picH=*(p+i*2);        //数据低位在前
                picL=*(p+i*2+1);
                LCD_WriteData_16Bit(picH&lt;&lt;8|picL);
        }
        LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1);//恢复显示窗口为全屏
}















void Test_Triangle(void)
{
        uint8_t i=0;
        LCD_Fill(0,30,lcddev.width-1,lcddev.height-32,WHITE);
        for(i=0;i&lt;5;i++)
        {
                POINT_COLOR=ColorTab;
                Draw_Triangel(lcddev.width/2-40+(i*15),lcddev.height/2-12+(i*11),lcddev.width/2-25-1+(i*15),lcddev.height/2-12-26-1+(i*11),lcddev.width/2-10-1+(i*15),lcddev.height/2-12+(i*11));
        }
        HAL_Delay(1500);
        LCD_Fill(0,30,lcddev.width-1,lcddev.height-32,WHITE);
        for(i=0;i&lt;5;i++)
        {
                POINT_COLOR=ColorTab;
                Fill_Triangel(lcddev.width/2-40+(i*15),lcddev.height/2-12+(i*11),lcddev.width/2-25-1+(i*15),lcddev.height/2-12-26-1+(i*11),lcddev.width/2-10-1+(i*15),lcddev.height/2-12+(i*11));
        }
        HAL_Delay(1500);
}

/*****************************************************************************
* @name       :void DrawTestPage(u8 *str)
* @date       :2018-08-09
* @function   :Drawing test interface
* @parameters :str:the start address of the Chinese and English strings
* @retvalue   :None
******************************************************************************/
void DrawTestPage(uint8_t *str)
{
//绘制固定栏up
LCD_Clear(WHITE);
//LCD_Fill(0,0,lcddev.width,20,BLUE);
//绘制固定栏down
//LCD_Fill(0,lcddev.height-20,lcddev.width,lcddev.height,BLUE);
//POINT_COLOR=BLUE;
if(lcddev.dir==0)
{
        LCD_Fill(0,0,lcddev.width-1,28,BLUE);
        LCD_Fill(0,lcddev.height-16,lcddev.width-1,lcddev.height-1,BLUE);
        Gui_StrCenter(0,12,WHITE,BLUE,str,16,0);//居中显示
        Gui_StrCenter(0,lcddev.height-16,WHITE,BLUE,&quot;www.lcdwiki.com&quot;,16,0);//居中显示
}
else if(lcddev.dir==2)
{
        LCD_Fill(0,0,lcddev.width-1,16,BLUE);
        LCD_Fill(0,lcddev.height-30,lcddev.width-1,lcddev.height-1,BLUE);
        Gui_StrCenter(0,0,WHITE,BLUE,str,16,0);//居中显示
        Gui_StrCenter(0,lcddev.height-30,WHITE,BLUE,&quot;www.lcdwiki.com&quot;,16,0);//居中显示
}
else if(lcddev.dir==1)
{
        LCD_Fill(0,0,lcddev.width-1,28,BLUE);
        LCD_Fill(0,lcddev.height-32,lcddev.width-1,lcddev.height-1,BLUE);
        Gui_StrCenter(21,12,WHITE,BLUE,str,16,0);//居中显示
        Gui_StrCenter(21,lcddev.height-32,WHITE,BLUE,&quot;www.lcdwiki.com&quot;,16,0);//居中显示
}
else
{
        LCD_Fill(0,0,lcddev.width-1,28,BLUE);
        LCD_Fill(0,lcddev.height-32,lcddev.width-1,lcddev.height-1,BLUE);
        Gui_StrCenter(-21,12,WHITE,BLUE,str,16,0);//居中显示
        Gui_StrCenter(-21,lcddev.height-32,WHITE,BLUE,&quot;www.lcdwiki.com&quot;,16,0);//居中显示
}
//绘制测试区域
//LCD_Fill(0,20,lcddev.width,lcddev.height-20,WHITE);
}



/*****************************************************************************
* @name       :void Display_ButtonUp(u16 x1,u16 y1,u16 x2,u16 y2)
* @date       :2018-08-24
* @function   :Drawing a 3D button
* @parameters :x1:the bebinning x coordinate of the button
                y1:the bebinning y coordinate of the button
                                                                x2:the ending x coordinate of the button
                                                                y2:the ending y coordinate of the button
* @retvalue   :None
******************************************************************************/
void Display_ButtonUp(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
        POINT_COLOR=WHITE;
        LCD_DrawLine(x1,y1,x2,y1); //H
        LCD_DrawLine(x1,y1,x1,y2); //V

        POINT_COLOR=GRAY1;
        LCD_DrawLine(x1+1,y2-1,x2,y2-1);//H
        POINT_COLOR=GRAY2;
        LCD_DrawLine(x1,y2,x2,y2);//H
        POINT_COLOR=GRAY1;
        LCD_DrawLine(x2-1,y1+1,x2-1,y2);//V
        POINT_COLOR=GRAY2;
LCD_DrawLine(x2,y1,x2,y2); //V
}

/*****************************************************************************
* @name       :void menu_test(void)
* @date       :2018-08-24
* @function   :Drawing a 3D menu UI
* @parameters :None
* @retvalue   :None
******************************************************************************/
void menu_test(void)
{
        LCD_Clear(GRAY0);

        Display_ButtonUp((lcddev.width-98)/2,65,(lcddev.width-98)/2+98,85); //x1,y1,x2,y2
        Gui_StrCenter(0,67,BRED,BLUE,&quot;图形显示测试&quot;,16,1);

        Display_ButtonUp((lcddev.width-98)/2,95,(lcddev.width-98)/2+98,115); //x1,y1,x2,y2
        Gui_StrCenter(0,97,BLACK,GRAY0,&quot;纯色填充测试&quot;,16,1);

        Display_ButtonUp((lcddev.width-98)/2,125,(lcddev.width-98)/2+98,145); //x1,y1,x2,y2
        Gui_StrCenter(0,127,BLUE,GRAY0,&quot;中文显示测试&quot;,16,1);

        Display_ButtonUp((lcddev.width-98)/2,155,(lcddev.width-98)/2+98,175); //x1,y1,x2,y2
        Gui_StrCenter(0,157,RED,GRAY0,&quot;图片显示测试&quot;,16,1);
        HAL_Delay(1500);
        HAL_Delay(500);
}

/*****************************************************************************
* @name       :void main_test(void)
* @date       :2018-08-09
* @function   :Drawing the main Interface of the Comprehensive Test Program
* @parameters :None
* @retvalue   :None
******************************************************************************/
void main_test(void)
{
        DrawTestPage(&quot;综合测试程序&quot;);
        Gui_StrCenter(0,78,RED,BLUE,&quot;电子测试&quot;,16,1);//居中显示
        Gui_StrCenter(0,95,RED,BLUE,&quot;综合测试程序&quot;,16,1);//居中显示
        Gui_StrCenter(0,112,GREEN,BLUE,&quot;2.4\&quot; ST7789&quot;,16,1);//居中显示
        Gui_StrCenter(0,129,GREEN,BLUE,&quot;240X320&quot;,16,1);//居中显示
        Gui_StrCenter(0,146,BLUE,BLUE,&quot;2024-03-06&quot;,16,1);//居中显示
        HAL_Delay(1500);
        HAL_Delay(1500);
}

/*****************************************************************************
* @name       :void Test_Color(void)
* @date       :2018-08-09
* @function   :Color fill test(white,black,red,green,blue)
* @parameters :None
* @retvalue   :None
******************************************************************************/
void Test_Color(void)
{
        //DrawTestPage(&quot;测试1:纯色填充测试&quot;);
        LCD_Fill(0,0,lcddev.width-1,lcddev.height-1,WHITE);
        Show_Str(40,30,BLACK,YELLOW,&quot;WHITE&quot;,16,1);HAL_Delay(1000);
        LCD_Fill(0,0,lcddev.width-1,lcddev.height-1,BLACK);
        Show_Str(40,30,WHITE,YELLOW,&quot;BLACK&quot;,16,1);HAL_Delay(1000);
        LCD_Fill(0,0,lcddev.width-1,lcddev.height-1,RED);
        Show_Str(40,30,BLUE,YELLOW,&quot;RED&quot;,16,1);HAL_Delay(800);
        LCD_Fill(0,0,lcddev.width-1,lcddev.height-1,GREEN);
        Show_Str(40,30,BLUE,YELLOW,&quot;GREEN&quot;,16,1);HAL_Delay(800);
        LCD_Fill(0,0,lcddev.width-1,lcddev.height-1,BLUE);
        Show_Str(40,30,RED,YELLOW,&quot;BLUE&quot;,16,1);HAL_Delay(800);
        LCD_Fill(0,0,lcddev.width-1,lcddev.height-1,GRAY);
        Show_Str(40,30,RED,YELLOW,&quot;GRAY&quot;,16,1);HAL_Delay(1000);
}

/*****************************************************************************
* @name       :void Test_FillRec(void)
* @date       :2018-08-09
* @function   :Rectangular display and fill test
                                                                Display red,green,blue,yellow,pink rectangular boxes in turn,
                                                                1500 milliseconds later,
                                                                Fill the rectangle in red,green,blue,yellow and pink in turn
* @parameters :None
* @retvalue   :None
******************************************************************************/
void Test_FillRec(void)
{
        uint8_t i=0;
        DrawTestPage(&quot;GUI矩形填充测试&quot;);
        LCD_Fill(0,30,lcddev.width-1,lcddev.height-32,WHITE);
        for (i=0; i&lt;5; i++)
        {
                POINT_COLOR=ColorTab;
                LCD_DrawRectangle(lcddev.width/2-40+(i*16),lcddev.height/2-40+(i*13),lcddev.width/2-40+(i*16)+30,lcddev.height/2-40+(i*13)+30);
        }
        HAL_Delay(1500);
        LCD_Fill(0,30,lcddev.width-1,lcddev.height-32,WHITE);
        for (i=0; i&lt;5; i++)
        {
                POINT_COLOR=ColorTab;
                LCD_DrawFillRectangle(lcddev.width/2-40+(i*16),lcddev.height/2-40+(i*13),lcddev.width/2-40+(i*16)+30,lcddev.height/2-40+(i*13)+30);
        }
        HAL_Delay(1500);
}

/*****************************************************************************
* @name       :void Test_Circle(void)
* @date       :2018-08-09
* @function   :circular display and fill test
                                                                Display red,green,blue,yellow,pink circular boxes in turn,
                                                                1500 milliseconds later,
                                                                Fill the circular in red,green,blue,yellow and pink in turn
* @parameters :None
* @retvalue   :None
******************************************************************************/
void Test_Circle(void)
{
        uint8_t i=0;
        DrawTestPage(&quot;GUI画圆填充测试&quot;);
        LCD_Fill(0,30,lcddev.width-1,lcddev.height-32,WHITE);
        for (i=0; i&lt;5; i++)
                gui_circle(lcddev.width/2-40+(i*15),lcddev.height/2-25+(i*13),ColorTab,15,0);
        HAL_Delay(1500);
        LCD_Fill(0,30,lcddev.width-1,lcddev.height-32,WHITE);
        for (i=0; i&lt;5; i++)
                  gui_circle(lcddev.width/2-40+(i*15),lcddev.height/2-25+(i*13),ColorTab,15,1);
        HAL_Delay(1500);
}

/*****************************************************************************
* @name       :void English_Font_test(void)
* @date       :2018-08-09
* @function   :English display test
* @parameters :None
* @retvalue   :None
******************************************************************************/
void English_Font_test(void)
{
        DrawTestPage(&quot;英文显示测试&quot;);
        Show_Str(50,77,BLUE,YELLOW,&quot;6X12:abcdefgh01234567&quot;,12,0);
        Show_Str(50,89,BLUE,YELLOW,&quot;6X12:ABCDEFGH01234567&quot;,12,1);
        Show_Str(50,101,BLUE,YELLOW,&quot;6X12:~!@#$%^&amp;*()_+{}:&quot;,12,0);
        Show_Str(50,114,BLUE,YELLOW,&quot;8X16:abcde01234&quot;,16,0);
        Show_Str(50,130,BLUE,YELLOW,&quot;8X16:ABCDE01234&quot;,16,1);
        Show_Str(50,146,BLUE,YELLOW,&quot;8X16:~!@#$%^&amp;*()&quot;,16,0);
        HAL_Delay(1200);
}

/*****************************************************************************
* @name       :void Chinese_Font_test(void)
* @date       :2018-08-09
* @function   :chinese display test
* @parameters :None
* @retvalue   :None
******************************************************************************/
void Chinese_Font_test(void)
{
        DrawTestPage(&quot;中文显示测试&quot;);
        Show_Str(45,82,BLUE,YELLOW,&quot;16X16:电子测试&quot;,16,0);
        Show_Str(45,102,BLUE,YELLOW,&quot;24X24:中文测试&quot;,24,1);
        Show_Str(45,127,BLUE,YELLOW,&quot;32X32:字体测试&quot;,32,1);
        HAL_Delay(1200);
}

/*****************************************************************************
* @name       :void Pic_test(void)
* @date       :2018-08-09
* @function   :picture display test
* @parameters :None
* @retvalue   :None
******************************************************************************/
void Pic_test(void)
{
        DrawTestPage(&quot;图片显示测试&quot;);
        //LCD_Fill(0,20,lcddev.width,lcddev.height-20,WHITE);
        Gui_Drawbmp16(50,90,40,40,gImage_qq);
        Show_Str(50+12,135,BLUE,YELLOW,&quot;QQ&quot;,16,1);
        Gui_Drawbmp16(100,90,40,40,gImage_qq);
        Show_Str(100+12,135,BLUE,YELLOW,&quot;QQ&quot;,16,1);
        Gui_Drawbmp16(150,90,40,40,gImage_qq);
        Show_Str(150+12,135,BLUE,YELLOW,&quot;QQ&quot;,16,1);
        HAL_Delay(1200);
}

/*****************************************************************************
* @name       :void Rotate_Test(void)
* @date       :2018-08-09
* @function   :rotate test
* @parameters :None
* @retvalue   :None
******************************************************************************/
void Rotate_Test(void)
{
        uint8_t i=0;
        uint8_t *Direction={&quot;Rotation:0&quot;,&quot;Rotation:90&quot;,&quot;Rotation:180&quot;,&quot;Rotation:270&quot;};

        for(i=0;i&lt;4;i++)
        {
        LCD_direction(i);
        DrawTestPage(&quot;屏幕旋转测试&quot;);
        Show_Str(40,35,BLUE,YELLOW,Direction,16,1);
        Gui_Drawbmp16(40,55,40,40,gImage_qq);
        HAL_Delay(1000);HAL_Delay(1000);
        }
        LCD_direction(USE_HORIZONTAL);
}

/*****************************************************************************
* @name       :void Test_Dynamic_Num(void)
* @date       :2018-11-13
* @function   :Dynamic number test
* @parameters :None
* @retvalue   :None
******************************************************************************/
void Test_Dynamic_Num(void)
{
                uint8_t i;
        DrawTestPage(&quot;动态数字显示&quot;);
        POINT_COLOR=BLUE;
        srand(123456);
        LCD_ShowString(40,100,16,&quot;PM2.5:      ug/m3&quot;,1);
        LCD_ShowString(40,120,16,&quot;TEP:      C&quot;,1);
        POINT_COLOR=RED;
        for(i=0;i&lt;15;i++)
        {
                LCD_ShowNum(90,100,rand()%10000,5,16);
                LCD_ShowNum(90,120,rand()%50,5,16);
                HAL_Delay(500);
        }
}



</code></pre>

<p>lcd.h如下</p>

<pre>
<code class="language-cpp">#ifndef __LCD_H
#define __LCD_H               
#include "stdlib.h"
#include "stm32u5xx_hal.h"

//LCD重要参数集
typedef struct
{                                                                                  
        uint16_twidth;                //LCD 宽度
        uint16_theight;                //LCD 高度
        uint16_tid;                        //LCD ID
        uint8_t   dir;                        //横屏还是竖屏控制:0,竖屏;1,横屏。       
        uint16_twramcmd;                //开始写gram指令
        uint16_tsetxcmd;                //设置x坐标指令
        uint16_tsetycmd;                //设置y坐标指令       
        uint8_t   xoffset;   
        uint8_t          yoffset;       
}_lcd_dev;        

//LCD参数
extern _lcd_dev lcddev;        //管理LCD重要参数
/////////////////////////////////////用户配置区///////////////////////////////////       
#define USE_HORIZONTAL       0 //定义液晶屏顺时针旋转方向         0-0度旋转,1-90度旋转,2-180度旋转,3-270度旋转

//////////////////////////////////////////////////////////////////////////////////          
//定义LCD的尺寸
#define LCD_W 240
#define LCD_H 320

//TFTLCD部分外要调用的函数                  
extern uint16_tPOINT_COLOR;//默认红色   
extern uint16_tBACK_COLOR; //背景颜色,默认为白色

/*-----------------LCD端口控制定义----------------*/
//QDtech全系列模块采用了三极管控制背光亮灭,用户也可以接PWM调节背光亮度
//直接操作寄存器可以提高LCD刷屏速率

//画笔颜色
#define WHITE       0xFFFF
#define BLACK              0x0000          
#define BLUE               0x001F
#define BRED      0XF81F
#define GRED                 0XFFE0
#define GBLUE                0X07FF
#define RED         0xF800
#define MAGENTA   0xF81F
#define GREEN       0x07E0
#define CYAN      0x7FFF
#define YELLOW      0xFFE0
#define BROWN                 0XBC40 //棕色
#define BRRED                 0XFC07 //棕红色
#define GRAY                0X8430 //灰色
#define GRAY0       0xEF7D
#define GRAY1       0x8410              //灰色1      00000 000000 00000
#define GRAY2       0x4208
//GUI颜色

#define DARKBLUE             0X01CF        //深蓝色
#define LIGHTBLUE             0X7D7C        //浅蓝色
#define GRAYBLUE              0X5458 //灰蓝色
//以上三色为PANEL的颜色

#define LIGHTGREEN           0X841F //浅绿色
#define LIGHTGRAY           0XEF5B //浅灰色(PANNEL)
#define LGRAY                         0XC618 //浅灰色(PANNEL),窗体背景色

#define LGRAYBLUE              0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE          0X2B12 //浅棕蓝色(选择条目的反色)


/*----------SPI引脚控制----------------*/
void SPI_WriteByte(uint8_t Data);


void LCD_Init(void);
void LCD_DisplayOn(void);
void LCD_DisplayOff(void);
void LCD_Clear(uint16_t Color);       
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos);
void LCD_DrawPoint(uint16_t x,uint16_t y);//画点
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);                  
void LCD_SetWindows(uint16_t xStar, uint16_t yStar,uint16_t xEnd,uint16_t yEnd);                                                                  
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue);
void LCD_WR_DATA(uint8_t data);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(uint16_t RGB_Code);
uint16_t LCD_ReadRAM(void);                  
uint16_t LCD_BGR2RGB(uint16_t c);
void LCD_SetParam(void);
void LCD_WriteData_16Bit(uint16_t Data);
void LCD_direction(uint8_t direction);                                                         



//////////////////////////////////////////////////////////////////
/*GUI*/
//////////////////////////////////////////////////////////////////

void GUI_DrawPoint(uint16_t x,uint16_t y,uint16_t color);
void LCD_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t color);
void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
void Draw_Triangel(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2);
void Fill_Triangel(uint16_t x0,uint16_t y0,uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2);
void Draw_Circle(uint16_t x0,uint16_t y0,uint16_t fc,uint8_t r);
void LCD_ShowChar(uint16_t x,uint16_t y,uint16_t fc, uint16_t bc, uint8_t num,uint8_t size,uint8_t mode);
void LCD_ShowNum(uint16_t x,uint16_t y,uint32_t num,uint8_t len,uint8_t size);
void LCD_Show2Num(uint16_t x,uint16_t y,uint16_t num,uint8_t len,uint8_t size,uint8_t mode);
void LCD_ShowString(uint16_t x,uint16_t y,uint8_t size,uint8_t *p,uint8_t mode);
void GUI_DrawFont16(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode);
void GUI_DrawFont24(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode);
void GUI_DrawFont32(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s,uint8_t mode);
void Show_Str(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *str,uint8_t size,uint8_t mode);
void Gui_Drawbmp16(uint16_t x,uint16_t y,uint16_t w, uint16_t h, const unsigned char *p); //显示40*40 QQ图片
void gui_circle(int32_t xc, int32_t yc,uint16_t c,int32_t r, int32_t fill);
void Gui_StrCenter(int16_t x, int16_t y, uint16_t fc, uint16_t bc, uint8_t *str,uint8_t size,uint8_t mode);
void LCD_DrawFillRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);


//////////////////////////////////////////////////////////////////
/*tsstGUI*/
//////////////////////////////////////////////////////////////////
void DrawTestPage(uint8_t *str);
void Display_ButtonUp(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2);
void menu_test(void);
void Test_Color(void);
void Test_FillRec(void);
void Test_Circle(void);
void Test_Triangle(void);
void English_Font_test(void);
void Chinese_Font_test(void);
void Pic_test(void);
void Load_Drow_Dialog(void);
void Touch_Test(void);
void main_test(void);
void Rotate_Test(void);
void Test_Dynamic_Num(void);


#endif
</code></pre>

<p>&nbsp;</p>

<p>font.h代码如下:</p>

<pre>
<code class="language-cpp">#ifndef __FONT_H
#define __FONT_H           
//常用ASCII表
//偏移量32
//ASCII字符集
//偏移量32
//大小:12*6
//字体:Default
//逐行式,逆向(低位在前)
const unsigned char asc2_1206={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x04,0x00,0x00},/*"!",1*/
{0x00,0x14,0x0A,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x00,0x14,0x14,0x3F,0x14,0x0A,0x3F,0x0A,0x0A,0x00,0x00},/*"#",3*/
{0x00,0x04,0x1E,0x15,0x05,0x06,0x0C,0x14,0x15,0x0F,0x04,0x00},/*"$",4*/
{0x00,0x00,0x12,0x15,0x0D,0x0A,0x14,0x2C,0x2A,0x12,0x00,0x00},/*"%",5*/
{0x00,0x00,0x04,0x0A,0x0A,0x1E,0x15,0x15,0x09,0x36,0x00,0x00},/*"&amp;",6*/
{0x00,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x20,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x20,0x00},/*"(",8*/
{0x00,0x02,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x02,0x00},/*")",9*/
{0x00,0x00,0x00,0x04,0x15,0x0E,0x0E,0x15,0x04,0x00,0x00,0x00},/*"*",10*/
{0x00,0x00,0x04,0x04,0x04,0x1F,0x04,0x04,0x04,0x00,0x00,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x01},/*",",12*/
{0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00},/*".",14*/
{0x00,0x10,0x08,0x08,0x08,0x04,0x04,0x02,0x02,0x02,0x01,0x00},/*"/",15*/
{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"0",16*/
{0x00,0x00,0x04,0x06,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"1",17*/
{0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x02,0x01,0x1F,0x00,0x00},/*"2",18*/
{0x00,0x00,0x0E,0x11,0x10,0x0C,0x10,0x10,0x11,0x0E,0x00,0x00},/*"3",19*/
{0x00,0x00,0x08,0x0C,0x0A,0x0A,0x09,0x1E,0x08,0x18,0x00,0x00},/*"4",20*/
{0x00,0x00,0x1F,0x01,0x01,0x0F,0x10,0x10,0x11,0x0E,0x00,0x00},/*"5",21*/
{0x00,0x00,0x0E,0x09,0x01,0x0F,0x11,0x11,0x11,0x0E,0x00,0x00},/*"6",22*/
{0x00,0x00,0x1F,0x09,0x08,0x04,0x04,0x04,0x04,0x04,0x00,0x00},/*"7",23*/
{0x00,0x00,0x0E,0x11,0x11,0x0E,0x11,0x11,0x11,0x0E,0x00,0x00},/*"8",24*/
{0x00,0x00,0x0E,0x11,0x11,0x11,0x1E,0x10,0x12,0x0E,0x00,0x00},/*"9",25*/
{0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x04,0x00,0x00},/*":",26*/
{0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x04,0x00},/*";",27*/
{0x00,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x00,0x00},/*"&lt;",28*/
{0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x1F,0x00,0x00,0x00,0x00},/*"=",29*/
{0x00,0x02,0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x02,0x00,0x00},/*"&gt;",30*/
{0x00,0x00,0x0E,0x11,0x11,0x08,0x04,0x04,0x00,0x04,0x00,0x00},/*"?",31*/
{0x00,0x00,0x0E,0x11,0x19,0x15,0x15,0x1D,0x01,0x1E,0x00,0x00},/*"@",32*/
{0x00,0x00,0x04,0x04,0x0C,0x0A,0x0A,0x1E,0x12,0x33,0x00,0x00},/*"A",33*/
{0x00,0x00,0x0F,0x12,0x12,0x0E,0x12,0x12,0x12,0x0F,0x00,0x00},/*"B",34*/
{0x00,0x00,0x1E,0x11,0x01,0x01,0x01,0x01,0x11,0x0E,0x00,0x00},/*"C",35*/
{0x00,0x00,0x0F,0x12,0x12,0x12,0x12,0x12,0x12,0x0F,0x00,0x00},/*"D",36*/
{0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x12,0x1F,0x00,0x00},/*"E",37*/
{0x00,0x00,0x1F,0x12,0x0A,0x0E,0x0A,0x02,0x02,0x07,0x00,0x00},/*"F",38*/
{0x00,0x00,0x1C,0x12,0x01,0x01,0x39,0x11,0x12,0x0C,0x00,0x00},/*"G",39*/
{0x00,0x00,0x33,0x12,0x12,0x1E,0x12,0x12,0x12,0x33,0x00,0x00},/*"H",40*/
{0x00,0x00,0x1F,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"I",41*/
{0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x07,0x00},/*"J",42*/
{0x00,0x00,0x37,0x12,0x0A,0x06,0x0A,0x0A,0x12,0x37,0x00,0x00},/*"K",43*/
{0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x22,0x3F,0x00,0x00},/*"L",44*/
{0x00,0x00,0x1B,0x1B,0x1B,0x1B,0x15,0x15,0x15,0x15,0x00,0x00},/*"M",45*/
{0x00,0x00,0x3B,0x12,0x16,0x16,0x1A,0x1A,0x12,0x17,0x00,0x00},/*"N",46*/
{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x11,0x11,0x0E,0x00,0x00},/*"O",47*/
{0x00,0x00,0x0F,0x12,0x12,0x0E,0x02,0x02,0x02,0x07,0x00,0x00},/*"P",48*/
{0x00,0x00,0x0E,0x11,0x11,0x11,0x11,0x17,0x19,0x0E,0x18,0x00},/*"Q",49*/
{0x00,0x00,0x0F,0x12,0x12,0x0E,0x0A,0x12,0x12,0x37,0x00,0x00},/*"R",50*/
{0x00,0x00,0x1E,0x11,0x01,0x06,0x08,0x10,0x11,0x0F,0x00,0x00},/*"S",51*/
{0x00,0x00,0x1F,0x15,0x04,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"T",52*/
{0x00,0x00,0x33,0x12,0x12,0x12,0x12,0x12,0x12,0x0C,0x00,0x00},/*"U",53*/
{0x00,0x00,0x33,0x12,0x12,0x0A,0x0A,0x0C,0x04,0x04,0x00,0x00},/*"V",54*/
{0x00,0x00,0x15,0x15,0x15,0x0E,0x0A,0x0A,0x0A,0x0A,0x00,0x00},/*"W",55*/
{0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x0A,0x0A,0x1B,0x00,0x00},/*"X",56*/
{0x00,0x00,0x1B,0x0A,0x0A,0x04,0x04,0x04,0x04,0x0E,0x00,0x00},/*"Y",57*/
{0x00,0x00,0x1F,0x09,0x08,0x04,0x04,0x02,0x12,0x1F,0x00,0x00},/*"Z",58*/
{0x00,0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x1C,0x00},/*"[",59*/
{0x00,0x02,0x02,0x02,0x04,0x04,0x08,0x08,0x08,0x10,0x00,0x00},/*"\",60*/
{0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0E,0x00},/*"]",61*/
{0x00,0x04,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F},/*"_",63*/
{0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1C,0x12,0x3C,0x00,0x00},/*"a",65*/
{0x00,0x00,0x03,0x02,0x02,0x0E,0x12,0x12,0x12,0x0E,0x00,0x00},/*"b",66*/
{0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x02,0x02,0x1C,0x00,0x00},/*"c",67*/
{0x00,0x00,0x18,0x10,0x10,0x1C,0x12,0x12,0x12,0x3C,0x00,0x00},/*"d",68*/
{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x1E,0x02,0x1C,0x00,0x00},/*"e",69*/
{0x00,0x00,0x38,0x04,0x04,0x1E,0x04,0x04,0x04,0x1E,0x00,0x00},/*"f",70*/
{0x00,0x00,0x00,0x00,0x00,0x3C,0x12,0x0C,0x02,0x1E,0x22,0x1C},/*"g",71*/
{0x00,0x00,0x03,0x02,0x02,0x0E,0x12,0x12,0x12,0x37,0x00,0x00},/*"h",72*/
{0x00,0x00,0x04,0x00,0x00,0x06,0x04,0x04,0x04,0x0E,0x00,0x00},/*"i",73*/
{0x00,0x00,0x08,0x00,0x00,0x0C,0x08,0x08,0x08,0x08,0x08,0x07},/*"j",74*/
{0x00,0x00,0x03,0x02,0x02,0x3A,0x0A,0x0E,0x12,0x37,0x00,0x00},/*"k",75*/
{0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"l",76*/
{0x00,0x00,0x00,0x00,0x00,0x0F,0x15,0x15,0x15,0x15,0x00,0x00},/*"m",77*/
{0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x37,0x00,0x00},/*"n",78*/
{0x00,0x00,0x00,0x00,0x00,0x0C,0x12,0x12,0x12,0x0C,0x00,0x00},/*"o",79*/
{0x00,0x00,0x00,0x00,0x00,0x0F,0x12,0x12,0x12,0x0E,0x02,0x07},/*"p",80*/
{0x00,0x00,0x00,0x00,0x00,0x1C,0x12,0x12,0x12,0x1C,0x10,0x38},/*"q",81*/
{0x00,0x00,0x00,0x00,0x00,0x1B,0x06,0x02,0x02,0x07,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0x00,0x00,0x1E,0x02,0x0C,0x10,0x1E,0x00,0x00},/*"s",83*/
{0x00,0x00,0x00,0x04,0x04,0x0E,0x04,0x04,0x04,0x18,0x00,0x00},/*"t",84*/
{0x00,0x00,0x00,0x00,0x00,0x1B,0x12,0x12,0x12,0x3C,0x00,0x00},/*"u",85*/
{0x00,0x00,0x00,0x00,0x00,0x37,0x12,0x0A,0x0C,0x04,0x00,0x00},/*"v",86*/
{0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x0E,0x0A,0x0A,0x00,0x00},/*"w",87*/
{0x00,0x00,0x00,0x00,0x00,0x1B,0x0A,0x04,0x0A,0x1B,0x00,0x00},/*"x",88*/
{0x00,0x00,0x00,0x00,0x00,0x37,0x12,0x0A,0x0C,0x04,0x04,0x03},/*"y",89*/
{0x00,0x00,0x00,0x00,0x00,0x1E,0x08,0x04,0x04,0x1E,0x00,0x00},/*"z",90*/
{0x00,0x18,0x08,0x08,0x08,0x04,0x08,0x08,0x08,0x08,0x18,0x00},/*"{",91*/
{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*"|",92*/
{0x00,0x06,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x06,0x00},/*"}",93*/
{0x02,0x25,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} /*"~",94*/
};

//常用ASCII表
//偏移量32
//ASCII字符集
//偏移量32
//大小:16*8
//字体:Default
//逐行式,逆向(低位在前)
const unsigned char asc2_1608={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x18,0x18,0x00,0x00},/*"!",1*/
{0x00,0x48,0x6C,0x24,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x00,0x00,0x24,0x24,0x24,0x7F,0x12,0x12,0x12,0x7F,0x12,0x12,0x12,0x00,0x00},/*"#",3*/
{0x00,0x00,0x08,0x1C,0x2A,0x2A,0x0A,0x0C,0x18,0x28,0x28,0x2A,0x2A,0x1C,0x08,0x08},/*"$",4*/
{0x00,0x00,0x00,0x22,0x25,0x15,0x15,0x15,0x2A,0x58,0x54,0x54,0x54,0x22,0x00,0x00},/*"%",5*/
{0x00,0x00,0x00,0x0C,0x12,0x12,0x12,0x0A,0x76,0x25,0x29,0x11,0x91,0x6E,0x00,0x00},/*"&amp;",6*/
{0x00,0x06,0x06,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
{0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x00},/*"(",8*/
{0x00,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x00},/*")",9*/
{0x00,0x00,0x00,0x00,0x08,0x08,0x6B,0x1C,0x1C,0x6B,0x08,0x08,0x00,0x00,0x00,0x00},/*"*",10*/
{0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x7F,0x08,0x08,0x08,0x08,0x00,0x00,0x00},/*"+",11*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x04,0x03},/*",",12*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00},/*".",14*/
{0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x00},/*"/",15*/
{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*"0",16*/
{0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"1",17*/
{0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00},/*"2",18*/
{0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,0x22,0x1C,0x00,0x00},/*"3",19*/
{0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,0x20,0x78,0x00,0x00},/*"4",20*/
{0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,0x22,0x1C,0x00,0x00},/*"5",21*/
{0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*"6",22*/
{0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,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,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,0x24,0x1C,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,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x04},/*";",27*/
{0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x40,0x00,0x00},/*"&lt;",28*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00},/*"=",29*/
{0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00},/*"&gt;",30*/
{0x00,0x00,0x00,0x3C,0x42,0x42,0x46,0x40,0x20,0x10,0x10,0x00,0x18,0x18,0x00,0x00},/*"?",31*/
{0x00,0x00,0x00,0x1C,0x22,0x5A,0x55,0x55,0x55,0x55,0x2D,0x42,0x22,0x1C,0x00,0x00},/*"@",32*/
{0x00,0x00,0x00,0x08,0x08,0x18,0x14,0x14,0x24,0x3C,0x22,0x42,0x42,0xE7,0x00,0x00},/*"A",33*/
{0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x1E,0x22,0x42,0x42,0x42,0x22,0x1F,0x00,0x00},/*"B",34*/
{0x00,0x00,0x00,0x7C,0x42,0x42,0x01,0x01,0x01,0x01,0x01,0x42,0x22,0x1C,0x00,0x00},/*"C",35*/
{0x00,0x00,0x00,0x1F,0x22,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x22,0x1F,0x00,0x00},/*"D",36*/
{0x00,0x00,0x00,0x3F,0x42,0x12,0x12,0x1E,0x12,0x12,0x02,0x42,0x42,0x3F,0x00,0x00},/*"E",37*/
{0x00,0x00,0x00,0x3F,0x42,0x12,0x12,0x1E,0x12,0x12,0x02,0x02,0x02,0x07,0x00,0x00},/*"F",38*/
{0x00,0x00,0x00,0x3C,0x22,0x22,0x01,0x01,0x01,0x71,0x21,0x22,0x22,0x1C,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,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"I",41*/
{0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x0F},/*"J",42*/
{0x00,0x00,0x00,0x77,0x22,0x12,0x0A,0x0E,0x0A,0x12,0x12,0x22,0x22,0x77,0x00,0x00},/*"K",43*/
{0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x7F,0x00,0x00},/*"L",44*/
{0x00,0x00,0x00,0x77,0x36,0x36,0x36,0x36,0x2A,0x2A,0x2A,0x2A,0x2A,0x6B,0x00,0x00},/*"M",45*/
{0x00,0x00,0x00,0xE3,0x46,0x46,0x4A,0x4A,0x52,0x52,0x52,0x62,0x62,0x47,0x00,0x00},/*"N",46*/
{0x00,0x00,0x00,0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x22,0x1C,0x00,0x00},/*"O",47*/
{0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x42,0x3E,0x02,0x02,0x02,0x02,0x07,0x00,0x00},/*"P",48*/
{0x00,0x00,0x00,0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x4D,0x53,0x32,0x1C,0x60,0x00},/*"Q",49*/
{0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x3E,0x12,0x12,0x22,0x22,0x42,0xC7,0x00,0x00},/*"R",50*/
{0x00,0x00,0x00,0x7C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x42,0x42,0x3E,0x00,0x00},/*"S",51*/
{0x00,0x00,0x00,0x7F,0x49,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1C,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,0x22,0x24,0x24,0x14,0x14,0x18,0x08,0x08,0x00,0x00},/*"V",54*/
{0x00,0x00,0x00,0x6B,0x49,0x49,0x49,0x49,0x55,0x55,0x36,0x22,0x22,0x22,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,0x77,0x22,0x22,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00},/*"Y",57*/
{0x00,0x00,0x00,0x7E,0x21,0x20,0x10,0x10,0x08,0x04,0x04,0x42,0x42,0x3F,0x00,0x00},/*"Z",58*/
{0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00},/*"[",59*/
{0x00,0x00,0x02,0x02,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x40,0x40},/*"\",60*/
{0x00,0x1E,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1E,0x00},/*"]",61*/
{0x00,0x38,0x44,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,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x78,0x44,0x42,0x42,0xFC,0x00,0x00},/*"a",65*/
{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x26,0x1A,0x00,0x00},/*"b",66*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x02,0x02,0x02,0x44,0x38,0x00,0x00},/*"c",67*/
{0x00,0x00,0x00,0x60,0x40,0x40,0x40,0x78,0x44,0x42,0x42,0x42,0x64,0xD8,0x00,0x00},/*"d",68*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x7E,0x02,0x02,0x42,0x3C,0x00,0x00},/*"e",69*/
{0x00,0x00,0x00,0xF0,0x88,0x08,0x08,0x7E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"f",70*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x22,0x22,0x1C,0x02,0x3C,0x42,0x42,0x3C},/*"g",71*/
{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x3A,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"h",72*/
{0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"i",73*/
{0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x1E},/*"j",74*/
{0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x72,0x12,0x0A,0x16,0x12,0x22,0x77,0x00,0x00},/*"k",75*/
{0x00,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"l",76*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x92,0x92,0x92,0x92,0x92,0xB7,0x00,0x00},/*"m",77*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x46,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,0x1B,0x26,0x42,0x42,0x42,0x22,0x1E,0x02,0x07},/*"p",80*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x42,0x42,0x42,0x44,0x78,0x40,0xE0},/*"q",81*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x4C,0x04,0x04,0x04,0x04,0x1F,0x00,0x00},/*"r",82*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x42,0x02,0x3C,0x40,0x42,0x3E,0x00,0x00},/*"s",83*/
{0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00},/*"t",84*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00},/*"u",85*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x14,0x08,0x08,0x00,0x00},/*"v",86*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEB,0x49,0x49,0x55,0x55,0x22,0x22,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,0x14,0x18,0x08,0x08,0x07},/*"y",89*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x22,0x10,0x08,0x08,0x44,0x7E,0x00,0x00},/*"z",90*/
{0x00,0xC0,0x20,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0xC0,0x00},/*"{",91*/
{0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10},/*"|",92*/
{0x00,0x06,0x08,0x08,0x08,0x08,0x08,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x00},/*"}",93*/
{0x0C,0x32,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/
};
typedef struct
{
       unsigned char Index;       
       char Msk;
}typFNT_GB16;

//字体取模:宋体常规小四
//逐行式,顺向(高位在前)
const typFNT_GB16 tfont16[]=   
{
"电",0x00,0x00,0x01,0x00,0x01,0x00,0x1F,0xF0,0x61,0x0C,0x41,0x04,0x41,0x04,0x7F,0xFC,
0x41,0x04,0x41,0x04,0x41,0x04,0x7F,0xFC,0x01,0x00,0x01,0x02,0x01,0x02,0x01,0xFC,/*0*/
"电",0x00,0x00,0x01,0x00,0x01,0x00,0x1F,0xF0,0x61,0x0C,0x41,0x04,0x41,0x04,0x7F,0xFC,
0x41,0x04,0x41,0x04,0x41,0x04,0x7F,0xFC,0x01,0x00,0x01,0x02,0x01,0x02,0x01,0xFC,/*1*/
"电",0x00,0x00,0x01,0x00,0x01,0x00,0x1F,0xF0,0x61,0x0C,0x41,0x04,0x41,0x04,0x7F,0xFC,
0x41,0x04,0x41,0x04,0x41,0x04,0x7F,0xFC,0x01,0x00,0x01,0x02,0x01,0x02,0x01,0xFC,/*2*/
"电",0x00,0x00,0x01,0x00,0x01,0x00,0x1F,0xF0,0x61,0x0C,0x41,0x04,0x41,0x04,0x7F,0xFC,
0x41,0x04,0x41,0x04,0x41,0x04,0x7F,0xFC,0x01,0x00,0x01,0x02,0x01,0x02,0x01,0xFC,/*0*/
"电",0x00,0x00,0x01,0x00,0x01,0x00,0x1F,0xF0,0x61,0x0C,0x41,0x04,0x41,0x04,0x7F,0xFC,
0x41,0x04,0x41,0x04,0x41,0x04,0x7F,0xFC,0x01,0x00,0x01,0x02,0x01,0x02,0x01,0xFC,/*1*/
"电",0x00,0x00,0x01,0x00,0x01,0x00,0x1F,0xF0,0x61,0x0C,0x41,0x04,0x41,0x04,0x7F,0xFC,
0x41,0x04,0x41,0x04,0x41,0x04,0x7F,0xFC,0x01,0x00,0x01,0x02,0x01,0x02,0x01,0xFC,/*2*/
"子",0x00,0x00,0x00,0x00,0x3F,0xF8,0x00,0x10,0x00,0x60,0x00,0x80,0x01,0x00,0x00,0x80,
0x7F,0xFE,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x18,0x40,0x07,0x80,/*3*/
"技",0x10,0x20,0x10,0x20,0x10,0x20,0x13,0xFE,0xFC,0x20,0x10,0x20,0x10,0x20,0x15,0xFC,0x18,0x84,0x30,0x88,0xD0,0x48,0x10,0x50,0x10,0x20,0x10,0x50,0x51,0x88,0x26,0x06,
"术",0x01,0x00,0x01,0x20,0x01,0x10,0x01,0x10,0x7F,0xFC,0x03,0x80,0x05,0x40,0x05,0x40,0x09,0x20,0x11,0x10,0x21,0x08,0x41,0x04,0x81,0x02,0x01,0x00,0x01,0x00,0x01,0x00,
"有",0x02,0x00,0x02,0x00,0xFF,0xFE,0x04,0x00,0x04,0x00,0x0F,0xF0,0x08,0x10,0x18,0x10,0x2F,0xF0,0x48,0x10,0x88,0x10,0x0F,0xF0,0x08,0x10,0x08,0x10,0x08,0x50,0x08,0x20,
"限",0x00,0x00,0x7B,0xF8,0x4A,0x08,0x52,0x08,0x53,0xF8,0x62,0x08,0x52,0x08,0x4B,0xF8,0x4A,0x44,0x4A,0x48,0x6A,0x30,0x52,0x20,0x42,0x10,0x42,0x88,0x43,0x06,0x42,0x00,
"公",0x00,0x80,0x04,0x80,0x04,0x80,0x08,0x40,0x08,0x40,0x10,0x20,0x20,0x10,0x42,0x08,0x82,0x06,0x04,0x00,0x04,0x40,0x08,0x20,0x10,0x20,0x3F,0xF0,0x10,0x10,0x00,0x00,
"司",0x00,0x00,0x3F,0xF8,0x00,0x08,0x00,0x08,0x7F,0xE8,0x00,0x08,0x00,0x08,0x1F,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x10,0x88,0x1F,0x88,0x10,0x88,0x00,0x28,0x00,0x10,
"欢",0x00,0x80,0x00,0x80,0xFC,0x80,0x04,0xFC,0x05,0x04,0x49,0x08,0x2A,0x40,0x14,0x40,0x10,0x40,0x28,0xA0,0x24,0xA0,0x45,0x10,0x81,0x10,0x02,0x08,0x04,0x04,0x08,0x02,
"迎",0x00,0x00,0x20,0x80,0x13,0x3C,0x12,0x24,0x02,0x24,0x02,0x24,0xF2,0x24,0x12,0x24,0x12,0x24,0x12,0xB4,0x13,0x28,0x12,0x20,0x10,0x20,0x28,0x20,0x47,0xFE,0x00,0x00,
"您",0x09,0x00,0x09,0x00,0x11,0xFC,0x32,0x04,0x54,0x48,0x99,0x50,0x11,0x48,0x12,0x44,0x14,0x44,0x11,0x40,0x10,0x80,0x02,0x00,0x51,0x04,0x51,0x12,0x90,0x12,0x0F,0xF0,
"纯",0x00,0x00,0x00,0x20,0x10,0x20,0x13,0xFE,0x20,0x20,0x26,0x24,0x4A,0x24,0x7A,0x24,
0x12,0x24,0x22,0x24,0x23,0xFC,0x7C,0x20,0x00,0x22,0x04,0x22,0x78,0x22,0x00,0x3C,/*0*/
"色",0x00,0x00,0x00,0x00,0x04,0x00,0x0F,0xF0,0x10,0x20,0x20,0x20,0x7F,0xFC,0x20,0x84,
0x20,0x84,0x20,0x84,0x20,0x84,0x3F,0xF8,0x20,0x00,0x20,0x02,0x20,0x02,0x1F,0xFE,/*1*/
"填",0x00,0x00,0x00,0x00,0x20,0x40,0x23,0xFE,0x20,0x40,0x79,0xFC,0x22,0x04,0x23,0xFC,
0x22,0x04,0x23,0xFC,0x22,0x04,0x23,0xFC,0x3A,0x04,0x65,0xFA,0x01,0x98,0x02,0x04,/*2*/
"充",0x00,0x00,0x01,0x00,0x01,0x00,0x7F,0xFE,0x02,0x20,0x04,0x10,0x04,0x08,0x08,0x04,
0x3F,0xFC,0x04,0x42,0x04,0x40,0x04,0x40,0x04,0x42,0x08,0x42,0x10,0x42,0x60,0x7E,/*3*/
"矩",0x00,0x00,0x00,0x00,0x20,0x7E,0x3E,0x80,0x48,0x80,0x48,0x80,0x48,0xFE,0x48,0x82,
0x7F,0x82,0x08,0x82,0x0C,0x82,0x14,0xFA,0x12,0x84,0x22,0x80,0x21,0x80,0x40,0xFE,/*6*/
"形",0x00,0x00,0x00,0x00,0x7F,0x84,0x22,0x08,0x22,0x30,0x22,0xC0,0x22,0x02,0x22,0x04,
0x7F,0xC8,0x22,0x30,0x22,0xC2,0x22,0x02,0x22,0x04,0x22,0x08,0x22,0x30,0x40,0x40,/*7*/
"画",0x00,0x00,0x00,0x00,0x7F,0xFE,0x00,0x00,0x0F,0xF0,0x11,0x10,0x11,0x10,0x11,0x10,
0x51,0x12,0x5F,0xF2,0x51,0x12,0x51,0x12,0x51,0x12,0x4F,0xF2,0x40,0x02,0x7F,0xFC,/*8*/
"圆",0x00,0x00,0x00,0x00,0x7F,0xFE,0x47,0xE2,0x48,0x12,0x48,0x12,0x47,0xE2,0x4F,0xF2,
0x50,0x12,0x50,0x12,0x51,0x12,0x51,0x12,0x42,0x92,0x44,0x72,0x58,0x0A,0x3F,0xFC,/*9*/
"图",0x00,0x00,0x00,0x00,0x3F,0xFE,0x44,0x02,0x47,0xF2,0x4C,0x22,0x53,0x62,0x40,0x82,
0x43,0x62,0x5E,0x1A,0x41,0x82,0x40,0x62,0x43,0x02,0x40,0xC2,0x40,0x22,0x3F,0xFC,/*0*/
"片",0x00,0x00,0x00,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x3F,0xFE,0x20,0x00,0x20,0x00,
0x20,0x00,0x3F,0xE0,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x40,0x10,0x40,0x10,/*1*/
"显",0x00,0x00,0x00,0x00,0x3F,0xFC,0x20,0x04,0x20,0x04,0x3F,0xFC,0x20,0x04,0x20,0x04,
0x1F,0xF8,0x24,0x44,0x14,0x48,0x14,0x48,0x14,0x48,0x0C,0x50,0x04,0x40,0x7F,0xFE,/*2*/
"示",0x00,0x00,0x00,0x00,0x3F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFE,0x00,0x80,
0x08,0x90,0x08,0x88,0x10,0x88,0x10,0x84,0x20,0x84,0x20,0x82,0x40,0x82,0x07,0x80,/*3*/
"菜",0x00,0x00,0x00,0x20,0x08,0x20,0x7F,0xFE,0x00,0x20,0x00,0x78,0x3F,0x88,0x11,0x08,
0x08,0x90,0x09,0x20,0x7F,0xFE,0x01,0x80,0x03,0x40,0x0D,0x30,0x31,0x0C,0x40,0x02,/*4*/
"单",0x00,0x00,0x00,0x10,0x08,0x10,0x04,0x20,0x3F,0xF8,0x21,0x04,0x21,0x04,0x3F,0xFC,
0x21,0x04,0x21,0x04,0x3F,0xF8,0x01,0x00,0x7F,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,/*5*/
"中",0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xFC,0x21,0x04,0x21,0x04,0x21,0x04,
0x21,0x04,0x21,0x04,0x21,0x04,0x3F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,/*0*/
"英",0x00,0x00,0x00,0x00,0x08,0x20,0x7F,0xFE,0x08,0x20,0x09,0x20,0x01,0x00,0x3F,0xF8,
0x21,0x08,0x21,0x08,0x21,0x08,0x1F,0xF4,0x01,0x40,0x02,0x20,0x0C,0x10,0x70,0x0E,/*1*/
"文",0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x80,0x3F,0x7C,0x08,0x10,0x08,0x10,0x04,0x10,
0x04,0x20,0x02,0x20,0x02,0x40,0x01,0x80,0x01,0x80,0x02,0x60,0x1C,0x18,0xE0,0x06,/*2*/
"综",0x00,0x00,0x00,0x00,0x10,0x20,0x11,0xFE,0x22,0x02,0x22,0x02,0x49,0xFC,0x58,0x00,
0x30,0x00,0x13,0xFE,0x25,0x28,0x79,0x24,0x01,0x24,0x0D,0x24,0x72,0x22,0x02,0xA2,/*4*/
"合",0x00,0x00,0x00,0x00,0x01,0x80,0x02,0x40,0x04,0x30,0x18,0x08,0x60,0x06,0x1F,0xF8,
0x00,0x00,0x1F,0xF8,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,0x1F,0xF8,/*5*/
"亮",0x00,0x00,0x01,0x00,0x01,0x00,0x7F,0xFE,0x00,0x00,0x3F,0xF8,0x20,0x08,0x3F,0xF8,
0x3F,0xF8,0x40,0x06,0x47,0xC2,0x48,0x24,0x08,0x20,0x08,0x22,0x10,0x22,0x60,0x3E,/*0*/
"度",0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0xFE,0x44,0x10,0x5F,0xFC,0x44,0x10,0x44,0x10,
0x43,0xF0,0x40,0x00,0x5F,0xF8,0x44,0x08,0x42,0x30,0x41,0xC0,0x43,0x60,0xBC,0x1E,/*1*/
"测",0x00,0x00,0x00,0x00,0x67,0xC2,0x14,0x52,0x05,0x52,0x05,0x52,0xC5,0x52,0x25,0x52,
0x05,0x52,0x05,0x52,0x15,0x52,0x17,0x52,0x22,0x82,0x22,0x42,0x44,0x42,0x48,0x3E,/*2*/
"试",0x00,0x00,0x00,0x00,0x20,0x14,0x10,0x14,0x17,0xFE,0x00,0x12,0x00,0x10,0x60,0x10,
0x13,0xF0,0x10,0x90,0x10,0x90,0x10,0x90,0x14,0x92,0x14,0xEA,0x1F,0x0A,0x00,0x06,/*3*/
"程",0x00,0x00,0x00,0x00,0x19,0xFE,0x72,0x02,0x12,0x02,0x12,0x02,0x7D,0xFC,0x18,0x00,
0x1B,0xFE,0x34,0x20,0x50,0x20,0x53,0xFE,0x10,0x20,0x10,0x20,0x10,0x20,0x13,0xFE,/*8*/
"序",0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0xFE,0x40,0x00,0x47,0xFC,0x42,0x08,0x41,0x30,
0x40,0xC0,0x5F,0xFE,0x40,0x42,0x40,0x42,0x40,0x44,0x40,0x48,0x40,0x40,0x44,0x40,/*9*/
"调",0x00,0x00,0x00,0x00,0x23,0xFE,0x12,0x22,0x02,0xFA,0x02,0x22,0xE2,0x22,0x12,0xFE,
0x12,0x72,0x12,0x8A,0x12,0x8A,0x12,0x8A,0x16,0xBA,0x1A,0x42,0x12,0x02,0x04,0x0E,/*0*/
"光",0x00,0x00,0x01,0x00,0x01,0x04,0x11,0x08,0x09,0x08,0x09,0x10,0x09,0x20,0x7F,0xFE,
0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x08,0x42,0x08,0x42,0x10,0x42,0x60,0x7C,/*1*/
"版",0x00,0x00,0x00,0x00,0x48,0xFE,0x49,0x00,0x49,0x00,0x49,0x00,0x7E,0xFE,0x41,0x82,
0x41,0x44,0x79,0x44,0x45,0x28,0x45,0x28,0x45,0x10,0x45,0x28,0x46,0x44,0x03,0x82,/*10*/
"权",0x00,0x00,0x10,0x00,0x10,0x00,0x13,0xFC,0x7D,0x04,0x11,0x04,0x19,0x04,0x18,0x84,
0x34,0x88,0x50,0x48,0x50,0x50,0x10,0x20,0x10,0x50,0x10,0x88,0x13,0x04,0x14,0x02,/*11*/
"所",0x00,0x00,0x00,0x00,0x3F,0x7C,0x20,0x40,0x20,0x40,0x3E,0x40,0x22,0x7E,0x22,0x44,
0x22,0x44,0x22,0x44,0x3E,0x84,0x20,0x84,0x20,0x84,0x40,0x84,0x41,0x04,0x42,0x04,/*12*/
"屏",0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x3F,0xF8,0x24,0x10,0x22,0x20,0x2F,0xF8,
0x22,0x20,0x22,0x20,0x3F,0xFC,0x22,0x20,0x42,0x20,0x44,0x20,0x84,0x20,0x08,0x20,/*"?",0*/
"幕",0x04,0x40,0x7F,0xFC,0x04,0x40,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,
0x04,0x00,0xFF,0xFE,0x11,0x10,0x3F,0xF8,0xD1,0x16,0x11,0x50,0x11,0x20,0x01,0x00,/*"?",1*/
"旋",0x20,0x80,0x10,0x80,0x10,0xFE,0x01,0x00,0xFE,0x00,0x21,0xFC,0x20,0x24,0x3C,0x24,
0x24,0xA0,0x24,0xA0,0x24,0xBC,0x24,0xA0,0x24,0xA0,0x45,0x60,0x55,0x3E,0x8A,0x00,/*"?",2*/
"转",0x20,0x20,0x20,0x20,0x20,0x20,0xFD,0xFC,0x40,0x20,0x50,0x40,0x93,0xFE,0xFC,0x40,
0x10,0x80,0x11,0xFC,0x1C,0x04,0xF0,0x88,0x50,0x50,0x10,0x20,0x10,0x10,0x10,0x10,/*"?",3*/
"开",0x00,0x00,0x7F,0xFC,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0xFF,0xFE,
0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x40,0x20,/*"?",0*/
"源",0x00,0x00,0x27,0xFE,0x14,0x20,0x14,0x40,0x85,0xFC,0x45,0x04,0x45,0xFC,0x15,0x04,
0x15,0xFC,0x25,0x24,0xE4,0x20,0x24,0xA8,0x29,0x24,0x2A,0x22,0x30,0xA0,0x00,0x40,/*"?",1*/
"液",0x00,0x80,0x20,0x40,0x17,0xFE,0x11,0x20,0x81,0x20,0x42,0x3C,0x42,0x44,0x16,0x64,
0x12,0x94,0x23,0x48,0xE2,0x48,0x22,0x30,0x22,0x20,0x22,0x50,0x22,0x88,0x03,0x06,/*"?",2*/
"晶",0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,0x00,0x00,
0x7E,0xFC,0x42,0x84,0x42,0x84,0x7E,0xFC,0x42,0x84,0x42,0x84,0x7E,0xFC,0x42,0x84,/*"?",3*/
"网",0x00,0x00,0x7F,0xFC,0x40,0x04,0x40,0x04,0x42,0x14,0x52,0x94,0x4A,0x54,0x44,0x24,
0x44,0x24,0x4A,0x54,0x4A,0x54,0x52,0x94,0x61,0x04,0x40,0x04,0x40,0x14,0x40,0x08,/*"?",4*/
"站",0x10,0x20,0x08,0x20,0x08,0x20,0x7E,0x20,0x00,0x3E,0x04,0x20,0x44,0x20,0x44,0x20,
0x25,0xFC,0x29,0x04,0x29,0x04,0x0F,0x04,0xF1,0x04,0x41,0x04,0x01,0xFC,0x01,0x04,/*"?",5*/
"按",0x10,0x40,0x10,0x20,0x10,0x20,0x13,0xFE,0xFA,0x02,0x14,0x44,0x10,0x40,0x1B,0xFE,
0x30,0x88,0xD0,0x88,0x11,0x08,0x10,0xD0,0x10,0x20,0x10,0x50,0x50,0x88,0x23,0x04,/*"?",6*/
"键",0x20,0x10,0x20,0x10,0x3B,0x7C,0x21,0x14,0x41,0xFE,0x7A,0x14,0xA2,0x7C,0x27,0x10,
0xF9,0x7C,0x25,0x10,0x25,0xFE,0x22,0x10,0x2A,0x10,0x35,0x00,0x28,0xFE,0x00,0x00,/*"?",0*/
"校",0x10,0x40,0x10,0x20,0x10,0x20,0x11,0xFE,0xFC,0x00,0x10,0x88,0x31,0x04,0x3A,0x02,
0x54,0x88,0x50,0x88,0x90,0x50,0x10,0x50,0x10,0x20,0x10,0x50,0x10,0x88,0x13,0x06,/*"?",7*/
"准",0x01,0x40,0x41,0x20,0x21,0x20,0x23,0xFE,0x02,0x20,0x16,0x20,0x1B,0xFC,0x12,0x20,
0x22,0x20,0x23,0xFC,0xE2,0x20,0x22,0x20,0x22,0x20,0x23,0xFE,0x22,0x00,0x02,0x00,/*"?",8*/
"触",0x20,0x20,0x20,0x20,0x78,0x20,0x49,0xFC,0x91,0x24,0x7D,0x24,0x55,0x24,0x55,0x24,
0x7D,0xFC,0x55,0x24,0x54,0x20,0x7C,0x28,0x54,0x24,0x57,0xFE,0x45,0x02,0x8C,0x00,/*"?",9*/
"摸",0x11,0x10,0x11,0x10,0x17,0xFC,0x11,0x10,0xFC,0x00,0x13,0xF8,0x12,0x08,0x17,0xF8,
0x1A,0x08,0x33,0xF8,0xD0,0x40,0x17,0xFC,0x10,0xA0,0x11,0x10,0x52,0x08,0x24,0x06,/*"?",10*/
"读",0x00,0x20,0x20,0x20,0x11,0xFC,0x10,0x20,0x00,0x20,0x03,0xFE,0xF0,0x02,0x10,0x94,
0x10,0x50,0x11,0x10,0x10,0x90,0x13,0xFE,0x14,0x28,0x18,0x44,0x10,0x82,0x03,0x02,/*"?",0*/
"和",0x04,0x00,0x0E,0x00,0x78,0x00,0x08,0x7C,0x08,0x44,0xFF,0x44,0x08,0x44,0x18,0x44,
0x1C,0x44,0x2A,0x44,0x2A,0x44,0x48,0x44,0x88,0x7C,0x08,0x44,0x08,0x00,0x08,0x00,/*"?",0*/
"颜",0x10,0x00,0x08,0xFE,0x7F,0x10,0x22,0x20,0x14,0x7C,0x7F,0x44,0x44,0x54,0x48,0x54,
0x52,0x54,0x44,0x54,0x48,0x54,0x51,0x54,0x42,0x28,0x44,0x24,0x88,0x42,0x30,0x82,/*"?",0*/
"值",0x08,0x40,0x08,0x40,0x0F,0xFC,0x10,0x40,0x10,0x40,0x33,0xF8,0x32,0x08,0x53,0xF8,
0x92,0x08,0x13,0xF8,0x12,0x08,0x13,0xF8,0x12,0x08,0x12,0x08,0x1F,0xFE,0x10,0x00,/*"?",0*/
"容",0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x88,0x24,0x11,0x10,0x22,0x88,0x04,0x40,
0x08,0x20,0x30,0x18,0xDF,0xF6,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,/*"容",0*/
"支",0x01,0x00,0x01,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF0,
0x10,0x10,0x08,0x20,0x04,0x40,0x02,0x80,0x01,0x00,0x06,0xC0,0x18,0x30,0xE0,0x0E,/*"支",1*/
"持",0x10,0x20,0x10,0x20,0x10,0x20,0x11,0xFC,0xFC,0x20,0x10,0x20,0x13,0xFE,0x10,0x08,
0x18,0x08,0x33,0xFE,0xD0,0x08,0x10,0x88,0x10,0x48,0x10,0x08,0x50,0x28,0x20,0x10,/*"持",2*/
"点",0x02,0x00,0x02,0x00,0x02,0x00,0x03,0xFC,0x02,0x00,0x02,0x00,0x3F,0xF0,0x20,0x10,
0x20,0x10,0x20,0x10,0x3F,0xF0,0x00,0x00,0x24,0x88,0x22,0x44,0x42,0x44,0x80,0x04,/*"点",3*/
"态",0x01,0x00,0x01,0x00,0x7F,0xFC,0x01,0x00,0x02,0x80,0x04,0x40,0x0A,0x20,0x31,0x18,
0xC0,0x06,0x01,0x00,0x08,0x88,0x48,0x84,0x48,0x12,0x48,0x12,0x87,0xF0,0x00,0x00,/*"态",0*/
"数",0x08,0x20,0x49,0x20,0x2A,0x20,0x08,0x3E,0xFF,0x44,0x2A,0x44,0x49,0x44,0x88,0xA4,
0x10,0x28,0xFE,0x28,0x22,0x10,0x42,0x10,0x64,0x28,0x18,0x28,0x34,0x44,0xC2,0x82,/*"数",1*/
"字",0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,0x00,0x40,0x00,0x80,
0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,/*"字",2*/
"退",0x03,0xF8,0x22,0x08,0x12,0x08,0x13,0xF8,0x02,0x08,0x02,0x08,0xF3,0xF8,0x12,0x44,
0x12,0x28,0x12,0x10,0x12,0x88,0x13,0x04,0x12,0x04,0x28,0x00,0x47,0xFE,0x00,0x00,/*"退",0*/
"出",0x01,0x00,0x01,0x00,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x01,0x08,
0x01,0x00,0x01,0x00,0x41,0x04,0x41,0x04,0x41,0x04,0x41,0x04,0x7F,0xFC,0x00,0x04,/*"出",1*/
};
typedef struct
{
       unsigned char Index;       
       char Msk;
}typFNT_GB24;
//字体取模:宋体常规小四
//逐行式,顺向(高位在前)
const typFNT_GB24 tfont24[]=
{
"深",0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x08,0x0C,0x7F,0xFC,0x04,
0x40,0x10,0x01,0xC8,0xA0,0x02,0x18,0x60,0x42,0x30,0x18,0x32,0x23,0x18,0x12,0xC3,
0x00,0x14,0x03,0x00,0x04,0x03,0x0C,0x04,0x7F,0xF0,0x08,0x0F,0x80,0x08,0x0B,0x40,
0x78,0x13,0x60,0x18,0x33,0x20,0x18,0x63,0x18,0x18,0x83,0x1C,0x19,0x03,0x08,0x18,
0x03,0x00,0x00,0x03,0x00,0x00,0x00,0x00,/*0*/
"圳",0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x10,0x0C,0x04,0x18,0x0C,0x04,0x10,0x8C,0x04,
0x10,0x8C,0x04,0x10,0x8C,0x04,0x10,0x8C,0x04,0xD0,0x8C,0x3F,0x10,0x8C,0x04,0x10,
0x8C,0x04,0x10,0x8C,0x04,0x10,0x8C,0x04,0x10,0x8C,0x04,0x10,0x8C,0x04,0x10,0x8C,
0x05,0xF0,0x8C,0x0E,0x20,0x8C,0x78,0x20,0x8C,0x20,0x40,0x8C,0x00,0x80,0x8C,0x01,
0x00,0x0C,0x02,0x00,0x0C,0x00,0x00,0x00,/*1*/
"市",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x18,0x00,0x00,0x18,0x08,0x00,
0x00,0x1C,0x1F,0xFF,0xE0,0x00,0x18,0x00,0x00,0x18,0x20,0x07,0xFF,0xF0,0x04,0x18,
0x20,0x04,0x18,0x20,0x04,0x18,0x20,0x04,0x18,0x20,0x04,0x18,0x20,0x04,0x18,0x20,
0x04,0x18,0x20,0x04,0x18,0x20,0x04,0x18,0x20,0x04,0x18,0xE0,0x04,0x18,0x40,0x00,
0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,/*2*/
"中",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,
0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x3F,0xFF,0xFE,0x30,0x18,0x06,0x30,0x18,
0x06,0x30,0x18,0x06,0x30,0x18,0x06,0x30,0x18,0x06,0x3F,0xFF,0xFE,0x30,0x18,0x06,
0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*0*/
"文",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,
0x06,0x00,0xFF,0xFF,0xFF,0x06,0x00,0x30,0x06,0x00,0x30,0x03,0x00,0x60,0x03,0x00,
0x60,0x01,0x80,0xC0,0x00,0xC1,0x80,0x00,0xE3,0x00,0x00,0x36,0x00,0x00,0x1C,0x00,
0x00,0x77,0x00,0x03,0xC1,0xE0,0x1E,0x00,0x3C,0x60,0x00,0x07,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*1*/
"测",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x03,0x21,
0xFF,0x33,0x39,0x83,0x33,0x11,0x83,0x33,0x01,0x9B,0x33,0xC1,0x9B,0x33,0x71,0x9B,
0x33,0x19,0x9B,0x33,0x01,0x9B,0x33,0x01,0x9B,0x33,0x11,0x9B,0x33,0x19,0xB3,0x33,
0x30,0x30,0x33,0x30,0x6C,0x03,0x30,0xC6,0x03,0x63,0x83,0x03,0x2E,0x01,0xBE,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*2*/
"试",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xD8,0x30,
0x00,0xCE,0x18,0x00,0xC2,0x1C,0x00,0xC0,0x01,0xFF,0xFF,0x00,0x00,0xC0,0xF8,0x00,
0xC0,0x18,0x00,0xC0,0x19,0xFF,0xC0,0x18,0x18,0x40,0x18,0x18,0x60,0x19,0x18,0x60,
0x1B,0x18,0x61,0x1E,0x18,0x31,0x1C,0x1F,0xB1,0x39,0xF0,0x19,0x10,0x00,0x0F,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*3*/
};
typedef struct
{
       unsigned char Index;       
       char Msk;
}typFNT_GB32;
//字体取模:宋体常规小四
//逐行式,顺向(高位在前)
const typFNT_GB32 tfont32[]=
{
"字",0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0xC0,0x00,
0x00,0x01,0xC0,0xC0,0x00,0x01,0x07,0xC0,0x00,0x01,0xFF,0x00,0x02,0x1F,0xFE,0x00,
0x07,0xF0,0x1C,0x00,0x07,0xC0,0x70,0x00,0x0F,0x00,0xE0,0x00,0x0E,0x03,0xF0,0x00,
0x1C,0x0F,0xF0,0x00,0x3C,0x0F,0x70,0x00,0x3C,0x00,0xE0,0x00,0x18,0x00,0xC0,0x00,
0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20,0x00,
0x00,0x00,0x37,0x00,0x00,0x01,0xFF,0x00,0x00,0x7F,0xF8,0x00,0x07,0xF8,0x30,0x00,
0x1F,0x80,0x30,0x00,0x00,0x80,0x30,0x00,0x00,0xC0,0x30,0x00,0x00,0x60,0x60,0x00,
0x00,0x18,0xE0,0x00,0x00,0x0F,0xC0,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,/*0*/
"体",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,
0x00,0x20,0x01,0xB8,0x00,0x70,0x3F,0xF8,0x00,0x61,0xFF,0xC0,0x00,0xC3,0x03,0x00,
0x01,0xC6,0x06,0x00,0x03,0x8C,0x06,0x00,0x03,0x08,0x0C,0x00,0x06,0x08,0x0C,0x00,
0x0E,0x18,0x18,0x3F,0x1E,0x10,0x1B,0xF3,0x1F,0x90,0x3F,0x07,0x00,0x80,0x3C,0x1C,
0x01,0x90,0x70,0x7C,0x01,0x90,0x60,0xFE,0x01,0xA0,0xC3,0xF8,0x01,0xA0,0x0F,0xD8,
0x03,0xA0,0x08,0x18,0x03,0x60,0x00,0x18,0x03,0x40,0x00,0x18,0x03,0xC0,0x00,0x18,
0x03,0x80,0x00,0x18,0x03,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,
0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*1*/
"测",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x02,0x0C,0x10,0x08,0x07,0x1F,0xF8,0x04,0x03,0xBF,0xF0,0x02,0x01,0xBC,0x30,0x03,
0x03,0xEC,0x30,0x03,0x01,0x5C,0x60,0x03,0x00,0xD8,0x60,0x03,0x00,0xD8,0x60,0x03,
0x80,0x98,0x62,0x03,0x61,0xB8,0x43,0x07,0x71,0xB1,0x43,0x06,0x31,0x32,0x43,0x06,
0x33,0x76,0xC3,0x06,0x3A,0x64,0xC7,0x06,0x3E,0xEC,0xC0,0x06,0x3E,0x78,0xC0,0x06,
0x3C,0x30,0x40,0x06,0x7C,0x70,0x00,0x06,0x78,0xE0,0x60,0x06,0x7B,0xFF,0xF0,0x06,
0xF7,0xC0,0x00,0x06,0xE4,0x00,0x00,0x06,0x40,0x00,0x00,0x06,0x00,0x00,0x00,0x06,
0x00,0x00,0x00,0x7C,0x00,0x00,0x8F,0xF0,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,/*2*/
"试",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,
0x00,0x00,0x7F,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,
0x00,0x00,0x00,0xCE,0x03,0x80,0x00,0xCF,0xFF,0xC0,0x00,0xDD,0x41,0x80,0x0F,0xFE,
0x00,0x07,0xFF,0xFC,0x00,0x0C,0x00,0xF0,0x00,0x18,0x0F,0xC0,0x3E,0x19,0xFF,0x40,
0xF3,0x11,0xBC,0x60,0x83,0x30,0x7F,0xE0,0x03,0xB1,0xFE,0x20,0x03,0x33,0x80,0x20,
0x03,0x70,0x00,0x30,0x03,0x60,0x00,0x10,0x03,0x60,0x00,0x18,0x07,0xC0,0x00,0x0C,
0x07,0xC0,0x00,0x04,0x07,0x80,0x00,0x02,0x01,0x00,0x00,0x03,0x00,0x00,0x00,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*3*/
};

#endif
</code></pre>

<p>main.c代码如下:</p>

<pre>
<code class="language-cpp">/* USER CODE BEGIN Header */
/**
******************************************************************************
* <a href="home.php?mod=space&amp;uid=1307177" target="_blank">@File </a>         : main.c
* <a href="home.php?mod=space&amp;uid=159083" target="_blank">@brief </a>          : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2024 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include &quot;main.h&quot;

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include &quot;stdio.h&quot;
#include &quot;lcd.h&quot;

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;

SPI_HandleTypeDef hspi1;

UART_HandleTypeDef huart1;

HCD_HandleTypeDef hhcd_USB_OTG_HS;

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void SystemPower_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_ICACHE_Init(void);
static void MX_UCPD1_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_USB_OTG_HS_HCD_Init(void);
static void MX_SPI1_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
* @briefThe application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* Configure the System Power */
SystemPower_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_ICACHE_Init();
MX_UCPD1_Init();
MX_USART1_UART_Init();
MX_USB_OTG_HS_HCD_Init();
MX_SPI1_Init();
/* USER CODE BEGIN 2 */
LCD_Init();

Gui_StrCenter(0,112,GREEN,BLUE,&quot;HELLO EEWorld&quot;,16,1);//居中显示
Show_Str(70,146,BLUE,YELLOW,&quot;HELLO EEWorld(^_^)&quot;,16,0);
HAL_Delay(2000);

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
                main_test();                 //测试主界面
                menu_test();   //3D菜单显示测试
                Test_Color();                //简单刷屏填充测试
                Test_FillRec();                //GUI矩形绘图测试
                Test_Circle();                 //GUI画圆测试
                Test_Triangle();    //GUI三角形绘图测试
                English_Font_test();//英文字体示例测试
                Chinese_Font_test();//中文字体示例测试
                Pic_test();                        //图片显示示例测试
                Test_Dynamic_Num(); //动态数字显示
                Rotate_Test();   //旋转显示测试
}
/* USER CODE END 3 */
}

/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Configure the main internal regulator output voltage
*/
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
{
    Error_Handler();
}

/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_MSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_0;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
RCC_OscInitStruct.PLL.PLLMBOOST = RCC_PLLMBOOST_DIV4;
RCC_OscInitStruct.PLL.PLLM = 3;
RCC_OscInitStruct.PLL.PLLN = 10;
RCC_OscInitStruct.PLL.PLLP = 8;
RCC_OscInitStruct.PLL.PLLQ = 2;
RCC_OscInitStruct.PLL.PLLR = 1;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLLVCIRANGE_1;
RCC_OscInitStruct.PLL.PLLFRACN = 0;
if (HAL_RCC_OscConfig(&amp;RCC_OscInitStruct) != HAL_OK)
{
    Error_Handler();
}

/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                              |RCC_CLOCKTYPE_PCLK3;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&amp;RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
{
    Error_Handler();
}
}

/**
* @brief Power Configuration
* @retval None
*/
static void SystemPower_Config(void)
{
HAL_PWREx_EnableVddIO2();

/*
   * Switch to SMPS regulator instead of LDO
   */
if (HAL_PWREx_ConfigSupply(PWR_SMPS_SUPPLY) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN PWR */
/* USER CODE END PWR */
}

/**
* @brief ADC1 Initialization Function
* @param None
* @retval None
*/
static void MX_ADC1_Init(void)
{

/* USER CODE BEGIN ADC1_Init 0 */

/* USER CODE END ADC1_Init 0 */

ADC_ChannelConfTypeDef sConfig = {0};

/* USER CODE BEGIN ADC1_Init 1 */

/* USER CODE END ADC1_Init 1 */

/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc1.Init.Resolution = ADC_RESOLUTION_14B;
hadc1.Init.GainCompensation = 0;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;
hadc1.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&amp;hadc1) != HAL_OK)
{
    Error_Handler();
}

/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_5CYCLE;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&amp;hadc1, &amp;sConfig) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */

/* USER CODE END ADC1_Init 2 */

}

/**
* @brief ICACHE Initialization Function
* @param None
* @retval None
*/
static void MX_ICACHE_Init(void)
{

/* USER CODE BEGIN ICACHE_Init 0 */

/* USER CODE END ICACHE_Init 0 */

/* USER CODE BEGIN ICACHE_Init 1 */

/* USER CODE END ICACHE_Init 1 */

/** Enable instruction cache in 1-way (direct mapped cache)
*/
if (HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY) != HAL_OK)
{
    Error_Handler();
}
if (HAL_ICACHE_Enable() != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN ICACHE_Init 2 */

/* USER CODE END ICACHE_Init 2 */

}

/**
* @brief SPI1 Initialization Function
* @param None
* @retval None
*/
static void MX_SPI1_Init(void)
{

/* USER CODE BEGIN SPI1_Init 0 */

/* USER CODE END SPI1_Init 0 */

SPI_AutonomousModeConfTypeDef HAL_SPI_AutonomousMode_Cfg_Struct = {0};

/* USER CODE BEGIN SPI1_Init 1 */

/* USER CODE END SPI1_Init 1 */
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES_TXONLY;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 0x7;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE;
hspi1.Init.ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY;
hspi1.Init.ReadyPolarity = SPI_RDY_POLARITY_HIGH;
if (HAL_SPI_Init(&amp;hspi1) != HAL_OK)
{
    Error_Handler();
}
HAL_SPI_AutonomousMode_Cfg_Struct.TriggerState = SPI_AUTO_MODE_DISABLE;
HAL_SPI_AutonomousMode_Cfg_Struct.TriggerSelection = SPI_GRP1_GPDMA_CH0_TCF_TRG;
HAL_SPI_AutonomousMode_Cfg_Struct.TriggerPolarity = SPI_TRIG_POLARITY_RISING;
if (HAL_SPIEx_SetConfigAutonomousMode(&amp;hspi1, &amp;HAL_SPI_AutonomousMode_Cfg_Struct) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */

/* USER CODE END SPI1_Init 2 */

}

/**
* @brief UCPD1 Initialization Function
* @param None
* @retval None
*/
static void MX_UCPD1_Init(void)
{

/* USER CODE BEGIN UCPD1_Init 0 */

/* USER CODE END UCPD1_Init 0 */

LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

/* Peripheral clock enable */
LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_UCPD1);

LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
/**UCPD1 GPIO Configuration
PB15   ------&gt; UCPD1_CC2
PA15 (JTDI)   ------&gt; UCPD1_CC1
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_15;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOB, &amp;GPIO_InitStruct);

GPIO_InitStruct.Pin = LL_GPIO_PIN_15;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOA, &amp;GPIO_InitStruct);

/* USER CODE BEGIN UCPD1_Init 1 */

/* USER CODE END UCPD1_Init 1 */
/* USER CODE BEGIN UCPD1_Init 2 */

/* USER CODE END UCPD1_Init 2 */

}

/**
* @brief USART1 Initialization Function
* @param None
* @retval None
*/
static void MX_USART1_UART_Init(void)
{

/* USER CODE BEGIN USART1_Init 0 */

/* USER CODE END USART1_Init 0 */

/* USER CODE BEGIN USART1_Init 1 */

/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&amp;huart1) != HAL_OK)
{
    Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&amp;huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
    Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&amp;huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
    Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&amp;huart1) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */

/* USER CODE END USART1_Init 2 */

}

/**
* @brief USB_OTG_HS Initialization Function
* @param None
* @retval None
*/
static void MX_USB_OTG_HS_HCD_Init(void)
{

/* USER CODE BEGIN USB_OTG_HS_Init 0 */

/* USER CODE END USB_OTG_HS_Init 0 */

/* USER CODE BEGIN USB_OTG_HS_Init 1 */

/* USER CODE END USB_OTG_HS_Init 1 */
hhcd_USB_OTG_HS.Instance = USB_OTG_HS;
hhcd_USB_OTG_HS.Init.Host_channels = 16;
hhcd_USB_OTG_HS.Init.speed = HCD_SPEED_HIGH;
hhcd_USB_OTG_HS.Init.dma_enable = DISABLE;
hhcd_USB_OTG_HS.Init.phy_itface = USB_OTG_HS_EMBEDDED_PHY;
hhcd_USB_OTG_HS.Init.Sof_enable = DISABLE;
hhcd_USB_OTG_HS.Init.low_power_enable = DISABLE;
hhcd_USB_OTG_HS.Init.use_external_vbus = ENABLE;
if (HAL_HCD_Init(&amp;hhcd_USB_OTG_HS) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN USB_OTG_HS_Init 2 */

/* USER CODE END USB_OTG_HS_Init 2 */

}

/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();

/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LCD_CS_GPIO_Port, LCD_CS_Pin, GPIO_PIN_RESET);

/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LCD_BL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_RESET);

/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);

/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);

/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, UCPD_DBn_Pin|LED_BLUE_Pin|LCD_RST_Pin|LCD_DC_Pin, GPIO_PIN_RESET);

/*Configure GPIO pin : USER_BUTTON_Pin */
GPIO_InitStruct.Pin = USER_BUTTON_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(USER_BUTTON_GPIO_Port, &amp;GPIO_InitStruct);

/*Configure GPIO pin : LCD_CS_Pin */
GPIO_InitStruct.Pin = LCD_CS_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(LCD_CS_GPIO_Port, &amp;GPIO_InitStruct);

/*Configure GPIO pin : LCD_BL_Pin */
GPIO_InitStruct.Pin = LCD_BL_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(LCD_BL_GPIO_Port, &amp;GPIO_InitStruct);

/*Configure GPIO pin : UCPD_FLT_Pin */
GPIO_InitStruct.Pin = UCPD_FLT_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(UCPD_FLT_GPIO_Port, &amp;GPIO_InitStruct);

/*Configure GPIO pin : LED_RED_Pin */
GPIO_InitStruct.Pin = LED_RED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_RED_GPIO_Port, &amp;GPIO_InitStruct);

/*Configure GPIO pin : LED_GREEN_Pin */
GPIO_InitStruct.Pin = LED_GREEN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_GREEN_GPIO_Port, &amp;GPIO_InitStruct);

/*Configure GPIO pins : UCPD_DBn_Pin LED_BLUE_Pin */
GPIO_InitStruct.Pin = UCPD_DBn_Pin|LED_BLUE_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &amp;GPIO_InitStruct);

/*Configure GPIO pins : LCD_RST_Pin LCD_DC_Pin */
GPIO_InitStruct.Pin = LCD_RST_Pin|LCD_DC_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOB, &amp;GPIO_InitStruct);

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
* @briefThis function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}

#ifdefUSE_FULL_ASSERT
/**
* @briefReports the name of the source file and the source line number
*         where the assert_param error has occurred.
* @paramfile: pointer to the source file name
* @paramline: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
   ex: printf(&quot;Wrong parameters value: file %s on line %d\r\n&quot;, file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
</code></pre>

<p> &nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2024-3-10 14:58

<p>l三个程序cd.c、lcd.h、font.h码的代码确实够长了</p>

<p>&nbsp;</p>
页: [1]
查看完整版本: 【ST NUCLEO-U5A5ZJ-Q开发板测评】5、SPI和LCD