文件名称:汉字显示原理简介-gb∕t 28035-2011 软件系统验收规范
文件大小:27.79MB
文件格式:PDF
更新时间:2024-07-29 20:17:03
STM32 正点原子 库开发
46.1 汉字显示原理简介 常用的汉字内码系统有 GB2312,GB13000,GBK,BIG5(繁体)等几种,其中 GB2312 支持的汉字仅有几千个,很多时候不够用,而 GBK 内码不仅完全兼容 GB2312,还支持了繁体 字,总汉字数有 2 万多个,完全能满足我们一般应用的要求。 本实例我们将制作一个 GBK 字库,制作好的字库放在 SD 卡里面,然后通过 SD 卡,将字 库文件复制到外部 FLASH 芯片 W25Q64 里,这样,W25Q64 就相当于一个汉字字库芯片了。 汉字在液晶上的显示原理与前面显示字符的是一样的。汉字在液晶上的显示其实就是一些 点的显示与不显示,这就相当于我们的笔一样,有笔经过的地方就画出来,没经过的地方就不 画。所以要显示汉字,我们首先要知道汉字的点阵数据,这些数据可以由专门的软件来生成。 只要知道了一个汉字点阵的生成方法,那么我们在程序里面就可以把这个点阵数据解析成一个 汉字。 知道显示了一个汉字,就可以推及整个汉字库了。汉字在各种文件里面的存储不是以点阵 数据的形式存储的(否则那占用的空间就太大了),而是以内码的形式存储的,就是 GB2312/GBK/BIG5 等这几种的一种,每个汉字对应着一个内码,在知道了内码之后再去字库 里面查找这个汉字的点阵数据,然后在液晶上显示出来。这个过程我们是看不到,但是计算机 是要去执行的。 单片机要显示汉字也与此类似:汉字内码(GBK/GB2312)查找点阵库解析显示。 所以只要我们有了整个汉字库的点阵,就可以把电脑上的文本信息在单片机上显示出来了。 这里我们要解决的最大问题就是制作一个与汉字内码对得上号的汉字点阵库。而且要方便单片 机的查找。每个 GBK 码由 2 个字节组成,第一个字节为 0X81~0XFE,第二个字节分为两部分, 一是 0X40~0X7E,二是 0X80~0XFE。其中与 GB2312 相同的区域,字完全相同。 我们把第一个字节代表的意义称为区,那么 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>0X80 时:Hp=((GBKH-0x81)*190+GBKL-0X41)*(size*2); 其中 GBKH、GBKL 分别代表 GBK 的第一个字节和第二个字节(也就是高位和低位),size 代表汉字字体的大小(比如 16 字体,12 字体等),Hp 则为对应汉字点阵数据在字库里面的起 始地址(假设是从 0 开始存放)。 这样我们只要得到了汉字的 GBK 码,就可以显示这个汉字了。从而实现汉字在液晶上的 显示。 上一章,我们提到要用 cc936.c,以支持长文件名,但是 cc936.c 文件里面的两个数组太大 了(172KB),直接刷在单片机里面,太占用 flash 了,所以我们必须把这两个数组存放在外部 flash。cc936 里面包含的两个数组 oem2uni 和 uni2oem 存放 unicode 和 gbk 的互相转换对照表, 这两个数组很大,这里我们利用 ALIENTEK 提供的一个 C 语言数组转 BIN(二进制)的软件: C2B 转换助手 V1.1.exe,将这两个数组转为 BIN 文件,我们将这两个数组拷贝出来存放为一个 新的文本文件,假设为 UNIGBK.TXT,然后用 C2B 转换助手打开这个文本文件,如图 46.1.1 所示: