常用汉字编码
GB2312
GB13000
GBK
BIG5(繁体)
GB13000
GBK
BIG5(繁体)
汉字显示原理
汉字在液晶上的显示其实就是一些点的显示与不显示,这就相当于我们的笔一样,有笔经过的地方就画出来,没经过的地方就不画。所以要显示汉字,我们首先要知道汉字的点阵数据,这些数据可以由专门的软件来生成。只要知道了一个汉字点阵的生成方法,那么我们在程序里面就可以把这个点阵数据解析成一个汉字。
字符/汉字显示方法(PCtoLCD2002.exe)
{
0x01,0x00,0x41,0x01,0x41,0x02,0x41,0x0C,0x7F,0xF0,
0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,
0x7F,0xFF,0x41,0x00,0x41,0x00,0x41,0x00,0x01,0x00,
0x00,0x00
},/*"开",0*/
0x01,0x00,0x41,0x01,0x41,0x02,0x41,0x0C,0x7F,0xF0,
0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,0x41,0x00,
0x7F,0xFF,0x41,0x00,0x41,0x00,0x41,0x00,0x01,0x00,
0x00,0x00
},/*"开",0*/
汉字内码(GBK/GB2312)->查找点阵库->解析->显示。
GBK码
每个GBK码由2个字节组成,第一个字节为0X81~0XFE,第二个字节分为两部分,一是0X40~0X7E,二是0X80~0XFE。
我们把第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE-0X81+1),每个区内有190个汉字(0XFE-0X80+0X7E-0X40+2),总共就有126*190=23940个汉字。
我们把第一个字节代表的意义称为区,那么GBK里面总共有126个区(0XFE-0X81+1),每个区内有190个汉字(0XFE-0X80+0X7E-0X40+2),总共就有126*190=23940个汉字。
我们的点阵库只要按照这个编码规则从0X8140开始,逐一建立,每个区的点阵大小为每个汉字所用的字节数*190。这样,我们就可以得到在这个字库里面定位汉字的方法:
当GBKL<0X7F时:Hp=((GBKH-0x81)*190+GBKL-0X40)*(size*2);
当GBKL>0X7F时:Hp=((GBKH-0x81)*190+GBKL-0X41)*(size*2);
其中GBKH、GBKL分别代表GBK的第一个字节和第二个字节(也就是高位和低位),size代表汉字字体的大小(比如16字体,12字体等),Hp则为对应汉字点阵数据在字库里面的起始地址(假设是从0开始存放)。
当GBKL<0X7F时:Hp=((GBKH-0x81)*190+GBKL-0X40)*(size*2);
当GBKL>0X7F时:Hp=((GBKH-0x81)*190+GBKL-0X41)*(size*2);
其中GBKH、GBKL分别代表GBK的第一个字节和第二个字节(也就是高位和低位),size代表汉字字体的大小(比如16字体,12字体等),Hp则为对应汉字点阵数据在字库里面的起始地址(假设是从0开始存放)。
注意:
电脑端的字体大小与我们生成点阵大小关系为:
fsize=disize* 6/8;
其中fsize为电脑端字体大小,dsize是点阵大小(12,16,24)。所以16X16点阵大小对应的是12字体
电脑端的字体大小与我们生成点阵大小关系为:
fsize=disize* 6/8;
其中fsize为电脑端字体大小,dsize是点阵大小(12,16,24)。所以16X16点阵大小对应的是12字体
汉字显示程序思路
存字库(fontupd.c):
①做好字库。
②将字库GBK12,GBK16,GBK24依次写入SPI FLASH连续地址:update_font();
③字库写入完毕之后,做标记:ftinfo.fontok=0XAA;
②将字库GBK12,GBK16,GBK24依次写入SPI FLASH连续地址:update_font();
③字库写入完毕之后,做标记:ftinfo.fontok=0XAA;
显示汉字(text.c):
Show_Str ->Show_Font->Get_HzMat->解析显示。
参考:开源电子网 STM32中文参考手册