基于STM32的中文字库解码

大一在用51显示汉字的时候,用的是带中文字库的12864液晶屏,那个时候只需要套下一下格式就可以实现汉字的显示:

Write_Com(XXX);

delay();

Write_Data("XXX");    //这里的XXX是汉字

但是接触STM32之后,开发板配套的LCD没有带中文字库,所以就只能直接显示英文,不能直接显示中文。再者加上最近要做一个MP3,想实现对于歌词和UI及歌名的中文显示,便萌生了学习汉字显示原理的想法。

汉字在单片机里不是以字符保存的,而是以内码保存的。常用的内码系统有GB2312,GBK等,前者能表示仅几千个汉字,而后者支持繁体字,总字数的达到两万多个。

一般来说,一个汉字对应一个内码,单片机在知道了内码过后再去字库里查找这个汉字的点阵数据,然后在液晶上显示出来。

大概的步骤如下:汉字内码->查找点阵库->解析->显示。所以我们如果有整个汉字的点阵库,就可以把电脑上的文本信息在单片机上显示出来了。这里要解决的最大的问题就是要制作一个与汉字内码对应的汉字点阵库,而且还要方便单片机查找。

每个GBK码由两个字节组成,第一个字节为0X81~0XFE,第二字节分为两部分,第一部分是0X40~0X7E,第二部分是0X80~0XFE。

 第一个字节代表的意义叫做区,那么GBK里就一共有(0XFE-0X81+1)= 126个区。每个区里有(0X40-0X80+8X7E-0X40+2)= 190个汉字,总共是126*190 = 23940个汉字。点阵库只要按照这个编码规则从0X81开始,逐一建立每个区,每个区的点阵大小为每个汉字所用字节数*190。

假定GBKH和GBKL分别代表GBK的第一个字节和第二个字节(高位和低位),size代表汉字字体的大小,Hp代表对应汉字点阵数据在字库里的起始地址的话,那么

GBKL<0X7F时:Hp = ((GPKH-0X81)*190+GBKL-0X40)*size*2);

GBKL>0X80时:Hp = ((GBKH-0X81)*190+GBKL-0X41)*size*2);

但是棘手的问题又来了,windows在存储文件名的时候,如果是长文件名,是按照UNICODE码而不是GBK码存放的。所以如果要支持UNICODE内码的汉字则必须有一个UNICODE到GBK的转换码表,我的转换码表是参照网友的。

 制作字库的软件采用的在网上下的点阵字库生成器。

 

你可能感兴趣的:(单片机,ARM-M3)