【STM32篇】LCD显示汉字(从W25Q64中读取GBK字库)

您所在的位置:网站首页 汉字字库的作用是用于什么 【STM32篇】LCD显示汉字(从W25Q64中读取GBK字库)

【STM32篇】LCD显示汉字(从W25Q64中读取GBK字库)

#【STM32篇】LCD显示汉字(从W25Q64中读取GBK字库)| 来源: 网络整理| 查看: 265

        汉字显示在很多单片机产品中都需要用到,显示个别汉字可使用MCU的flash保存汉字字模,而显示更多的汉字就可能要在产品中保存一整个字库作为汉字储备。对于STM32F103VET6单片机FLASH只有512K字节,要存下一个字库就有点乏力且浪费单片机资源。在上一章节中完成了W25Q64驱动,本篇将介绍将GBK字库写入W25Q64中,并读取至LCD屏上显示。

LCD和W25Q64驱动请参考以下文章:

【STM32篇】驱动LCD显示屏

【STM32篇】SPI时序驱动W25Q64(硬件SPI和模拟SPI)

1. 汉字字库

        常用的汉字内码系统有 GB2312、GB13000、UNICODE、GBK、BIG5(繁体)等几种,其中 GB2312 支持的汉字仅有6763个,而 GBK 内码不仅完全兼容 GB2312,还支持了繁体字,总汉字数有 21886个,完全能满足我们一般应用的要求。

        GB2312 码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集--基本集》, 由国家标准总局发布, 1981 年 5 月 1 日 实施,通行于大陆。新加坡等地也使用此编码。GB2312 收录简化汉字及符号、字母、 日文假名等共 7445 个图形字符,其中汉字占 6763 个。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。GB2312规定对于任意一个图形字符都采用两个字节表示,第一个字节为高字节,第二个字节为低字节。其编码范围高位0xA1~0xFE,低位0xA1~0xFE。汉字从0xB0A1开始,结束于0xF7FE。

GB2312地址偏移计算:

GB_H = *pFont++;

GB_L = *pFont++;

GB_H -= 0xA1;

GB_L -= 0xA1;

Addr_offset = (94*GB_H + GB_L)*(size * 2);

        全国信息技术化技术委员会于 1995 年 12 月 1 日《汉字内码扩展规范》。GBK 向下与 GB2312 完全兼容,向上支持 ISO 10646 国际标准。GBK规定对于任意一个图形字符也采用两个字节表示,第一个字节为高字节,第二个字节为低字节。其编码范围高位0x81~0xFE,低位0x40~0xFE。汉字从0x8140开始,结束于0xFEFE。

GBK地址偏移计算:

GBKH = *pFont++;

GBKL = *pFont++;

if(GBKL < 0x7F) 

 {         Addr_offset = ((GBKH-0x81)*190 + GBKL - 0x40)*(size * 2);  } else  {          Addr_offset = ((GBKH-0x81)*190 + GBKL - 0x41)*(size * 2);  }

2. LCD显示中文

        LCD显示中文函数依然是调用画点函数去画汉字字模的每个字节,函数需要根据汉字取模的方式进行画点。如下图,根据自己的喜好进行选择,我选择的是方式三(字节高位在前,横向取字节)。

         在编写函数时,可根据字模大小确定总字节数,写完一个字节数据横坐标加1直至画汉字的闪上一部分,列坐标加8,画汉字的下一部分直至画完一个汉字。

/* \brief: 显示汉字(行列式,高位在前) \param: x:横坐标,y:列坐标 w:字符宽度 h字符高度 size:汉字大小 Font:保存汉字的首地址 colour:颜色 \retval: none */ void LCD_DisplayChinese(uint16_t x,uint16_t y,uint16_t size,char *Font,uint16_t colour) { char *pFont = Font; uint8_t GBKL,GBKH,tmp; uint16_t SIZE = size*size/8;//计算字节数 uint16_t y0=y;//记录第一行显示的初始位置 uint16_t x1=x;//记录显示的初始位置 uint16_t y1=y; uint16_t i,j; uint32_t Addr_offset;//汉字的偏移地址 uint8_t *pBuff = malloc(SIZE);//动态分配空间 while(*pFont != '\0') { //计算汉字的偏移地址 GBKH = *pFont++;//高字节 GBKL = *pFont++;//低字节 if(GBKL < 0x7F) { Addr_offset = ((GBKH-0x81)*190 + GBKL - 0x40)*(size * 2); } else { Addr_offset = ((GBKH-0x81)*190 + GBKL - 0x41)*(size * 2); } //从flash中取出一个汉字 switch(size) { case 16:W25Q64_ReadData(W25Q64_GBK_ADDR + Addr_offset,pBuff,SIZE);break; default :W25Q64_ReadData(W25Q64_GBK_ADDR + Addr_offset,pBuff,SIZE);break; } //显示一个汉字 for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3