拿到F429-Discovery一个月了,才写这个,实在抱歉。下面进入正题。
该例程使用的是Discovery板上的彩屏,以及SDRAM作为显存,其中的屏和SDRAM的驱动使用的是Discovery例程中自带的驱动。
本人只是做了小的改动,使其能显示汉字,采用的取模方式,字体大小是24*24。下面简单的说明一下做了哪些改动。
要驱动屏,需要调用以下几个函数:
LCD_Init();
LCD_LayerInit();
LTDC_Cmd(ENABLE);
其中前两个是stm32f429i_discovery_lcd.c中的函数,最后那个函数是外设库里面的函数。
其中要说一下,在LCD_LayerInit();函数中,对LTDC_Layer_InitStruct结构体的这个参数设置就是把SDRAM的地址,赋值给LCD的显示,使SDAM成为LCD的显存。
/* Start Address configuration : the LCD Frame buffer is defined on SDRAM */
LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER;
主要是对LCD_DisplayStringLine();函数做了改造,又增加了两个写汉字的函数。下面贴图上来说明。
在这个函数中,首先是判断了下面要显示的是字符还是汉字,如果是字符则设置字符的字体,然后显示字符即可,如果是汉字则显示汉字的字体,然后调用LCD_DisplayChinese();函数进行汉字的显示。注意下面指针ptr要累加两次,因为汉字的内码是占用两个字节。有一点缺陷的是这样写之后似乎只能使用一种字体显示。如果要使用不同字体显示,可以增加一个设置汉字字体的函数和结构体。不知各位大神有什么好的方法。
这个函数的主要任务就是查找到汉字对应的点阵数据,这里创建了一个汉字点阵的结构体。
typedef struct { /*汉字字模数据结构 */
unsigned char Index[2]; /* 汉字内码索引 */
unsigned char Msk[72]; /* 汉字点阵数据 */
}FNT_GB24;
汉字内码是占两个字节,因为字体大小是24*24的,所以是72字节。同时,这个汉字的数据信息是使用的是字符的那个数据结构。
sFONT Font24x24 = {
(const uint16_t*)Chinese24x24_Table->Index,
24, /* Width */
24, /* Height */
};
最后就是逐一打点即可,注意偏移位置的计算,最后的红色方框,是判断是否打完一行数据,一行数据是3个字节。
最后附上一张效果图,以及工程文件,欢迎大家批评指正。
STM32F429汉字显示.rar
(554.84 KB)
|