【HAL库每天一例】第053例:LCD-显示汉字(字库在串行Flash)
【HAL库每天一例】系列例程从今天开始持续更新。。。。。我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:https://pan.baidu.com/s/1i574oPv
密码:r3s3
(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-053. LCD-显示汉字(字库在串行Flash))
/**
******************************************************************************
* 硬石YS-F1Pro开发板例程功能说明
*
*例程名称: YSF1_HAL-053. LCD-显示汉字(字库在串行Flash)
*
******************************************************************************
* 说明:
* 本例程配套硬石stm32开发板YS-F1Pro使用。
*
* 淘宝:
* 论坛:硬石电子社区
* 版权归硬石嵌入式开发团队所有,请勿商用。
******************************************************************************
*/
【1】例程简介
FSMC:可变静态存储控制器,是STM32系列采用的一种新型的存储器扩展技术。一般可以用FSMC
接口与液晶驱动IC连接,实现数据交换。YS-F1Pro预留16bit的FSMC液晶接口,我们同时提供了
3.5寸TFT液晶模组供选购,该模组的液晶驱动IC型号为ILI9488。
本例程实现液晶模组显示汉字和汉字串,提供16号和24号两种字体选择。汉字字库来源于串行
Flash,使用本例程之前需要先执行“YSF1-051. 烧写中文字库到串行Flash”例程。
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号 IO端口 目标功能引脚 出厂默认设置
JP1 PA10 TXD(CH340G) 已接入
JP2 PA9 RXD(CH340G) 已接入
【3】操作及现象
把3.5寸TFT液晶模组插入开发板中间液晶接口上,使用开发板配套的MINI USB线连接到开发板标
示“调试串口”字样的MIMI USB接口(需要安装驱动),在电脑端打开串口调试助手工具,设置参
数为115200 8-N-1。下载完程序之后,在串口调试助手窗口可接收到液晶模组ID信息,同时液晶屏
幕亮起来,背景为黑色,显示一些中文字符。
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
中文显示函数实现
#if USB_SPIFLASH_CH==1
/**
* 函数功能: 从串行Flash读取GBK码
* 输入参数: pBuffer:数据保存地址
* gbk :汉字字符低字节码
* font:字体选择
* 可选值:FONT_16 :16号字体
* FONT_24 :24号字体
* 返 回 值: uint8_t: 0:读取失败,1:读取成功
* 说 明:无
*/
static uint8_t GetGBKCode_SPIFLASH(unsigned char* pBuffer,const uint8_t *pstr,USB_FONT_Typdef font)
{
uint32_t pos;
uint8_t high8bit,low8bit;
static uint8_t startflag=1;
/* 检查输入参数是否合法 */
assert_param(IS_FONT(font));
if(startflag)
{
MX_SPIFlash_Init();
startflag=0;
}
high8bit=*pstr;
low8bit=*(pstr+1);
if(font==USB_FONT_16)
{
// 16*16大小的汉字 其字模 占用16*16/8个字节
pos=((high8bit-0xa1)*94+low8bit-0xa1)*16*16/8;
SPI_FLASH_BufferRead(pBuffer,GBK_HZ1616_ADDR+pos,32);
}
else
{
// 24*24大小的汉字 其字模 占用24*24/8个字节
pos=((high8bit-0xa1)*94+low8bit-0xa1)*24*24/8;
SPI_FLASH_BufferRead(pBuffer,GBK_HZ2424_ADDR+pos,72);
}
if((pBuffer==0xFF)&&(pBuffer==0xFF))
{
return 0;
}
return 1;
}
#else
/**
* 函数功能: 从SD卡读取GBK码
* 输入参数: pBuffer:数据保存地址
* gbk :汉字字符低字节码
* font:字体选择
* 可选值:USB_FONT_16 :16号字体
* USB_FONT_24 :24号字体
* 返 回 值: uint8_t: 0:读取失败,1:读取成功
* 说 明:使用该函数之前确保已运行了f_mount(&fs,"0:",1);程序。
*/
static uint8_t GetGBKCode_SD(unsigned char* pBuffer,const uint8_t *pstr,USB_FONT_Typdef font)
{
uint32_t pos;
uint8_t high8bit,low8bit;
FRESULT f_res;
UINT f_num;
high8bit=*pstr;
low8bit=*(pstr+1);
if(font==USB_FONT_16)
{
// 16*16大小的汉字 其字模 占用16*16/8个字节
pos=((high8bit-0xa1)*94+low8bit-0xa1)*16*16/8;
f_res=f_open(&file_ch,"0:/GBK_HZ1616.FON",FA_OPEN_EXISTING|FA_READ);
}
else
{
// 24*24大小的汉字 其字模 占用24*24/8个字节
pos=((high8bit-0xa1)*94+low8bit-0xa1)*24*24/8;
f_res=f_open(&file_ch,"0:/GBK_HZ2424.FON",FA_OPEN_EXISTING|FA_READ);
}
if(f_res == FR_OK )
{
f_lseek (&file_ch, pos); //指针偏移
if(font==USB_FONT_16)
{
f_res=f_read(&file_ch,pBuffer,32,&f_num);
}
else
{
f_res=f_read(&file_ch,pBuffer,72,&f_num);
}
f_close(&file_ch);
return 1;
}
else
return 0;
}
#endif
/**
* 函数功能: 在 LCD 显示器上显示一个中文
* 输入参数: usX:在特定扫描方向下字符的起始X坐标
* usY :在特定扫描方向下该点的起始Y坐标
* pstr: 汉字字符低字节码
* usColor_Background :选择英文字符的背景色
* usColor_Foreground :选择英文字符的前景色
* font:字体选择
* 可选值:USB_FONT_16 :16号字体
* USB_FONT_24 :24号字体
* 返 回 值: 无
* 说 明:无
*/
void LCD_DispCHAR_CH(uint16_t usX,uint16_t usY,const uint8_t *pstr,uint16_t usColor_Background, uint16_t usColor_Foreground,USB_FONT_Typdef font)
{
uint8_t ucTemp, ucPage, ucColumn;
uint8_t gbk_buffer;
/* 检查输入参数是否合法 */
assert_param(IS_FONT(font));
if(font==USB_FONT_16)
{
LCD_OpenWindow(usX,usY,16,16);
LCD_WRITE_CMD(0x2C);
#if USB_SPIFLASH_CH==1
GetGBKCode_SPIFLASH(gbk_buffer,pstr,USB_FONT_16);
#else
GetGBKCode_SD(gbk_buffer,pstr,USB_FONT_16);
#endif
for(ucPage=0;ucPage<32;ucPage++)
{
ucTemp=gbk_buffer;
for(ucColumn=0;ucColumn<8;ucColumn++)
{
if(ucTemp&0x01)
LCD_WRITE_DATA(usColor_Foreground);
else
LCD_WRITE_DATA(usColor_Background);
ucTemp >>= 1;
}
}
}
else
{
LCD_OpenWindow(usX,usY,24,24);
LCD_WRITE_CMD(0x2C);
#if USB_SPIFLASH_CH==1
GetGBKCode_SPIFLASH(gbk_buffer,pstr,USB_FONT_24);
#else
GetGBKCode_SD(gbk_buffer,pstr,USB_FONT_24);
#endif
for(ucPage=0;ucPage<72;ucPage++)
{
ucTemp=gbk_buffer;
for(ucColumn=0;ucColumn<8;ucColumn++)
{
if(ucTemp&0x01)
LCD_WRITE_DATA(usColor_Foreground);
else
LCD_WRITE_DATA(usColor_Background);
ucTemp >>= 1;
}
}
}
}
/**
* 函数功能: 在 LCD 显示器上显示一串中文
* 输入参数: usX:在特定扫描方向下字符的起始X坐标
* usY :在特定扫描方向下该点的起始Y坐标
* pstr: 汉字字符低字节码
* usColor_Background :选择英文字符的背景色
* usColor_Foreground :选择英文字符的前景色
* font:字体选择
* 可选值:USB_FONT_16 :16号字体
* USB_FONT_24 :24号字体
* 返 回 值: 无
* 说 明:无
*/
void LCD_DispString_CH(uint16_t usX,uint16_t usY,const uint8_t *pstr,uint16_t usColor_Background, uint16_t usColor_Foreground,USB_FONT_Typdef font)
{
/* 检查输入参数是否合法 */
assert_param(IS_FONT(font));
while(*pstr != '\0')
{
if(font==USB_FONT_16)
{
if((usX+16)>LCD_DEFAULT_WIDTH)
{
usX = 0;
usY += 16;
}
if((usY+16)>LCD_DEFAULT_HEIGTH)
{
usX=0;
usY=0;
}
LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
pstr+=2;
usX+=16;
}
else
{
if((usX+24)>LCD_DEFAULT_WIDTH)
{
usX = 0;
usY += 24;
}
if((usY+24)>LCD_DEFAULT_HEIGTH)
{
usX=0;
usY=0;
}
LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
pstr+=2;
usX+=24;
}
}
}
/**
* 函数功能: 在 LCD 显示器上显示一串中英文
* 输入参数: usX:在特定扫描方向下字符的起始X坐标
* usY :在特定扫描方向下该点的起始Y坐标
* pstr: 汉字字符低字节码
* usColor_Background :选择英文字符的背景色
* usColor_Foreground :选择英文字符的前景色
* font:字体选择
* 可选值:USB_FONT_16 :16号字体
* USB_FONT_24 :24号字体
* 返 回 值: 无
* 说 明:无
*/
void LCD_DispString_EN_CH(uint16_t usX,uint16_t usY,const uint8_t *pstr,uint16_t usColor_Background, uint16_t usColor_Foreground,USB_FONT_Typdef font)
{
/* 检查输入参数是否合法 */
assert_param(IS_FONT(font));
while(*pstr != '\0')
{
if(*pstr<=0x7f)
{
if(font==USB_FONT_16)
{
if((usX+8)>LCD_DEFAULT_WIDTH)
{
usX = 0;
usY += 16;
}
if((usY+16)>LCD_DEFAULT_HEIGTH)
{
usX=0;
usY=0;
}
LCD_DispChar_EN(usX,usY,*pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
pstr++;
usX+=8;
}
else
{
if((usX+12)>LCD_DEFAULT_WIDTH)
{
usX=0;
usY+=24;
}
if((usY+24)>LCD_DEFAULT_HEIGTH)
{
usX=0;
usY=0;
}
LCD_DispChar_EN(usX,usY,*pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
pstr++;
usX+=12;
}
}
else
{
if(font==USB_FONT_16)
{
if((usX+16)>LCD_DEFAULT_WIDTH)
{
usX = 0;
usY += 16;
}
if((usY+16)>LCD_DEFAULT_HEIGTH)
{
usX=0;
usY=0;
}
LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_16);
pstr+=2;
usX+=16;
}
else
{
if((usX+24)>LCD_DEFAULT_WIDTH)
{
usX = 0;
usY += 24;
}
if((usY+24)>LCD_DEFAULT_HEIGTH)
{
usX=0;
usY=0;
}
LCD_DispCHAR_CH(usX,usY,pstr,usColor_Background,usColor_Foreground,USB_FONT_24);
pstr+=2;
usX+=24;
}
}
}
}
谢谢楼主 楼主,上面的资料还能再分享一下吗? ewfwetert 发表于 2016-8-5 15:27
谢谢楼主
您好,您还保留了上面的资料吗,能否分享一下呢,谢谢 watercici 发表于 2019-1-9 10:43
您好,您还保留了上面的资料吗,能否分享一下呢,谢谢
硬石开源资料下载链接(该帖总是最新资料)
http://www.ing10bbs.com/forum.php?mod=viewthread&tid=1458&fromuid=4
(出处: 硬石社区)
haohao663 发表于 2019-1-22 15:55
硬石开源资料下载链接(该帖总是最新资料)
http://www.ing10bbs.com/forum.php?mod=viewthread&tid=1458&f ...
收到,谢谢:handshake
页:
[1]