学习汉字显示原理,掌握字库制作以及LCD显示汉字的方法
准备和思路如下
1,DS0(连接在PB1)
2,串口1(波特率:115200,PA9/PA10连接在板载USB转串口芯片CH340上面)
3,ALIENTEK 2.8/3.5/4.3/7寸LCD模块(包括MCU屏和RGB屏,都支持)
4,SD卡,通过SDMMC1(SDMMC_D0~D4(PC8~PC11),SDMMC_SCK(PC12),SDMMC_CMD(PD2))连接
5,W25Q256(SPI FLASH芯片,连接在QSPI上)
6,按键KEY0(PH3)
开机的时候先检测W25Q256中是否已经存在字库,如果存在,则按次序显示汉字(四种字体都显示)。如
果没有,则检测SD卡和文件系统,并查找SYSTEM文件夹下的FONT文件夹,在该文件夹内查找UNIGBK.BIN、
GBK12.FON、GBK16.FON、GBK24.FON和GBK32.FON(这几个文件的由来,见STM32F429开发指南)。在检测到
这些文件之后,就开始更新字库,更新完毕才开始显示汉字。通过按按键KEY0,可以强制更新字库。同样我们
也是用DS0来指示程序正在运行。
主程序部分
int main(void)
{
u8 led0sta=1;
u32 fontcnt;
u8 i,j;
u8 fontx;//gbk码
u8 key,t;
Stm32_Clock_Init(432,25,2,9);//设置时钟,216Mhz
delay_init(216); //延时初始化
uart_init(108,115200); //初始化串口波特率为115200
usmart_dev.init(108); //初始化USMART
LED_Init(); //初始化与LED连接的硬件接口
MPU_Memory_Protection(); //保护相关存储区域
SDRAM_Init(); //初始化SDRAM
LCD_Init(); //初始化LCD
KEY_Init(); //初始化按键
W25QXX_Init(); //初始化W25Q256
my_mem_init(SRAMIN); //初始化内部内存池
my_mem_init(SRAMEX); //初始化外部内存池
my_mem_init(SRAMTCM); //初始化TCM内存池
exfuns_init(); //为fatfs相关变量申请内存
f_mount(fs,"0:",1); //挂载SD卡
f_mount(fs,"1:",1); //挂载FLASH.
while(font_init()) //检查字库
{
UPD:
LCD_Clear(WHITE); //清屏
POINT_COLOR=RED; //设置字体为红色
LCD_ShowString(30,30,200,16,16,"Apollo STM32F4/F7");
while(SD_Init()) //检测SD卡
{
LCD_ShowString(30,50,200,16,16,"SD Card Failed!");
delay_ms(200);
LCD_Fill(30,50,200+30,50+16,WHITE);
delay_ms(200);
}
LCD_ShowString(30,50,200,16,16,"SD Card OK");
LCD_ShowString(30,70,200,16,16,"Font Updating...");
key=update_font(20,90,16,"0:");//更新字库
while(key)//更新失败
{
LCD_ShowString(30,90,200,16,16,"Font Update Failed!");
delay_ms(200);
LCD_Fill(20,90,200+20,90+16,WHITE);
delay_ms(200);
}
LCD_ShowString(30,90,200,16,16,"Font Update Success! ");
delay_ms(1500);
LCD_Clear(WHITE);//清屏
}
POINT_COLOR=RED;
Show_Str(30,30,200,16,"阿波罗STM32F767试用",16,0);
Show_Str(30,50,200,16,"云汉电子社区",16,0);
Show_Str(30,70,200,16,"帅鸭",16,0);
Show_Str(30,90,200,16,"2018年2月22日",16,0);
Show_Str(30,110,200,16,"按KEY0,更新字库",16,0);
POINT_COLOR=BLUE;
Show_Str(30,130,200,16,"内码高字节:",16,0);
Show_Str(30,150,200,16,"内码低字节:",16,0);
Show_Str(30,170,200,16,"汉字计数器:",16,0);
Show_Str(30,200,200,32,"对应汉字为:",32,0);
Show_Str(30,232,200,24,"对应汉字为:",24,0);
Show_Str(30,256,200,16,"对应汉字(16*16)为:",16,0);
Show_Str(30,272,200,12,"对应汉字(12*12)为:",12,0);
while(1)
{
fontcnt=0;
for(i=0x81;i<0xff;i++)
{
fontx=i;
LCD_ShowNum(118,130,i,3,16); //显示内码高字节
for(j=0x40;j<0xfe;j++)
{
if(j==0x7f)continue;
fontcnt++;
LCD_ShowNum(118,150,j,3,16); //显示内码低字节
LCD_ShowNum(118,170,fontcnt,5,16);//汉字计数显示
fontx=j;
Show_Font(30+176,200,fontx,32,0);
Show_Font(30+132,232,fontx,24,0);
Show_Font(30+144,256,fontx,16,0);
Show_Font(30+108,272,fontx,12,0);
t=200;
while(t--)//延时,同时扫描按键
{
delay_ms(1);
key=KEY_Scan(0);
if(key==KEY0_PRES)goto UPD;
}
LED0(led0sta^=1);
}
}
}
}
调用的库有
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "mpu.h"
#include "usart.h"
#include "lcd.h"
#include "ltdc.h"
#include "sdram.h"
#include "key.h"
#include "usmart.h"
#include "malloc.h"
#include "nand.h"
#include "ftl.h"
#include "w25qxx.h"
#include "sdmmc_sdcard.h"
#include "ff.h"
#include "exfuns.h"
#include "text.h"
学习汉字显示原理,掌握字库制作以及LCD显示汉字的方法
准备和思路如下
1,DS0(连接在PB1)
2,串口1(波特率:115200,PA9/PA10连接在板载USB转串口芯片CH340上面)
3,ALIENTEK 2.8/3.5/4.3/7寸LCD模块(包括MCU屏和RGB屏,都支持)
4,SD卡,通过SDMMC1(SDMMC_D0~D4(PC8~PC11),SDMMC_SCK(PC12),SDMMC_CMD(PD2))连接
5,W25Q256(SPI FLASH芯片,连接在QSPI上)
6,按键KEY0(PH3)
开机的时候先检测W25Q256中是否已经存在字库,如果存在,则按次序显示汉字(四种字体都显示)。如
果没有,则检测SD卡和文件系统,并查找SYSTEM文件夹下的FONT文件夹,在该文件夹内查找UNIGBK.BIN、
GBK12.FON、GBK16.FON、GBK24.FON和GBK32.FON(这几个文件的由来,见STM32F429开发指南)。在检测到
这些文件之后,就开始更新字库,更新完毕才开始显示汉字。通过按按键KEY0,可以强制更新字库。同样我们
也是用DS0来指示程序正在运行。
主程序部分
int main(void)
{
u8 led0sta=1;
u32 fontcnt;
u8 i,j;
u8 fontx;//gbk码
u8 key,t;
Stm32_Clock_Init(432,25,2,9);//设置时钟,216Mhz
delay_init(216); //延时初始化
uart_init(108,115200); //初始化串口波特率为115200
usmart_dev.init(108); //初始化USMART
LED_Init(); //初始化与LED连接的硬件接口
MPU_Memory_Protection(); //保护相关存储区域
SDRAM_Init(); //初始化SDRAM
LCD_Init(); //初始化LCD
KEY_Init(); //初始化按键
W25QXX_Init(); //初始化W25Q256
my_mem_init(SRAMIN); //初始化内部内存池
my_mem_init(SRAMEX); //初始化外部内存池
my_mem_init(SRAMTCM); //初始化TCM内存池
exfuns_init(); //为fatfs相关变量申请内存
f_mount(fs,"0:",1); //挂载SD卡
f_mount(fs,"1:",1); //挂载FLASH.
while(font_init()) //检查字库
{
UPD:
LCD_Clear(WHITE); //清屏
POINT_COLOR=RED; //设置字体为红色
LCD_ShowString(30,30,200,16,16,"Apollo STM32F4/F7");
while(SD_Init()) //检测SD卡
{
LCD_ShowString(30,50,200,16,16,"SD Card Failed!");
delay_ms(200);
LCD_Fill(30,50,200+30,50+16,WHITE);
delay_ms(200);
}
LCD_ShowString(30,50,200,16,16,"SD Card OK");
LCD_ShowString(30,70,200,16,16,"Font Updating...");
key=update_font(20,90,16,"0:");//更新字库
while(key)//更新失败
{
LCD_ShowString(30,90,200,16,16,"Font Update Failed!");
delay_ms(200);
LCD_Fill(20,90,200+20,90+16,WHITE);
delay_ms(200);
}
LCD_ShowString(30,90,200,16,16,"Font Update Success! ");
delay_ms(1500);
LCD_Clear(WHITE);//清屏
}
POINT_COLOR=RED;
Show_Str(30,30,200,16,"阿波罗STM32F767试用",16,0);
Show_Str(30,50,200,16,"云汉电子社区",16,0);
Show_Str(30,70,200,16,"帅鸭",16,0);
Show_Str(30,90,200,16,"2018年2月22日",16,0);
Show_Str(30,110,200,16,"按KEY0,更新字库",16,0);
POINT_COLOR=BLUE;
Show_Str(30,130,200,16,"内码高字节:",16,0);
Show_Str(30,150,200,16,"内码低字节:",16,0);
Show_Str(30,170,200,16,"汉字计数器:",16,0);
Show_Str(30,200,200,32,"对应汉字为:",32,0);
Show_Str(30,232,200,24,"对应汉字为:",24,0);
Show_Str(30,256,200,16,"对应汉字(16*16)为:",16,0);
Show_Str(30,272,200,12,"对应汉字(12*12)为:",12,0);
while(1)
{
fontcnt=0;
for(i=0x81;i<0xff;i++)
{
fontx=i;
LCD_ShowNum(118,130,i,3,16); //显示内码高字节
for(j=0x40;j<0xfe;j++)
{
if(j==0x7f)continue;
fontcnt++;
LCD_ShowNum(118,150,j,3,16); //显示内码低字节
LCD_ShowNum(118,170,fontcnt,5,16);//汉字计数显示
fontx=j;
Show_Font(30+176,200,fontx,32,0);
Show_Font(30+132,232,fontx,24,0);
Show_Font(30+144,256,fontx,16,0);
Show_Font(30+108,272,fontx,12,0);
t=200;
while(t--)//延时,同时扫描按键
{
delay_ms(1);
key=KEY_Scan(0);
if(key==KEY0_PRES)goto UPD;
}
LED0(led0sta^=1);
}
}
}
}
调用的库有
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "mpu.h"
#include "usart.h"
#include "lcd.h"
#include "ltdc.h"
#include "sdram.h"
#include "key.h"
#include "usmart.h"
#include "malloc.h"
#include "nand.h"
#include "ftl.h"
#include "w25qxx.h"
#include "sdmmc_sdcard.h"
#include "ff.h"
#include "exfuns.h"
#include "text.h"