硬件汉字库的原理与应用
www.mcutech.cn
摘要 本文论述了硬件汉字库的基本原理和具体制作步骤。并利用89C51 作为主控CPU,通过TFT1335或TFT1335b来点320240液晶屏。给出了在液晶屏上显示“国”字过程。
关键词 硬件汉字库 液晶显示 89C51
随着液晶显示技术的发展和应用,越来越多的开发人员希望在自己开发的仪器设备中使用液晶屏幕来显示汉字。我们日常生活的一些手持工具上如手机快译通等等,它们可以任意输入汉字不仅灵活性大而且检索速度快,这其中的主要原因就是在这些设备中固化了硬件汉字库,越来越多的技术开发人员开始关注起硬件汉字库,希望能在自己开发的设备中设计并使用硬件汉字库,达到加快产品开发速度、降低软件成本的目的。
一 硬件汉字库相关知识
1 汉字机内码、国标码和区位码
在PC 机的文本文件中,汉字是以机内码的形式存储的,每个汉字占用两个字节长度,为了和ASCII码区别,范围从十六进制的0A1H 开始,小于80H 的为ASCII 码将机内码,每个字节的最高位屏蔽掉再以十六进制的形式显示出来则为国标码,将机内码的每个字节各减去0A0H 再以十进制显示出来即为该汉字的区位码。例如“国”字的机内码、国标码和区位码如表1 所示。
表1 国字的机内码国标码和区位码
即:区位码=机内码-0A0A0H; 就“国”字而言,其区位码和机内码的关系为:
195AH(区位码)= 0B9FAH(机内码)- 0A0A0H
记住这个关系是我们理解下面有关程序的关键。
2 国标汉字字符集与区位码
根据对汉字使用频率程度的研究,可把汉字分成高频字(约100个),常用字(约
3000个),次常用字(约4000字),罕见字(约8000个)和死字(约45000个)。即
正常使用的汉字达15000 个。我国1981年公布了《通讯用汉字字符集(基本集)及
其交换码标准》GB2312-80方案。把高频字、常用字和次常用字集合成汉字基本字符
集共6763个,在该字符集中按汉字使用的频度又将其分为一级汉字3755 个按拼音排
序,二级汉字3008个按部首排序,再加上西文字母数字图形符号等700个。国家标准
的汉字字符集GB2312-80 在汉字操作系统中是以汉字库的形式提供的。汉字库结构
作了统一规定如图1 所示。
即将字库分成94 个区,每个区有94 个汉字以位作区别,每一个汉字在汉字库
中有确定的区和位,编号用两个字节,这就是所谓的区位码。区位码的第一个字节
表示区号,第二个字节表示位号,因而只要知道了区位码就可知道该汉字在字库中
的地址,每个汉字在字库中是以点阵字模形式存储的,如一般采用16x 16 点阵形式,
每个点用一个二进制位表示,存1 的点当显示时可以在屏上显示一个亮点,存0 的
点则在屏上不显示,这样就把存某字的16x 16 点阵信息直接用来在显示器上按上述
原则显示则将出现对应的汉字,如一个国字的16x 16 点阵字模如图2 所示,当用存
储单元存储该字模信息时将需32 个字节地址,在图2 的右边写出了该字模对应的字
节值。
二 汉字库的制作
在本节中笔者将论述将16x 16 点阵的宋体汉字库烧录到256KB 的存储器中的
具体方法,这也是读者比较关心的问题。
本例中使用了AT29C020 该产品是ATMEL 公司生产的高达256KB 的FLASH ROM,
读者也可以使用其它容量不小于256KB 的产品,但在具体电路设计时应注意引脚定
义和逻辑关系,并在烧录时选择相应的型号。
UCDOS 软件有一个名字为HZK16 的文件,这就是16x 16 的国标汉字点阵文件,
在该文件中按汉字区位码从小到大依次存有国标区位码中的所有汉字,每个汉字占
用32 个字节,每个区为94 个汉字,如果显示其属性可以看出其大小为262KB, 当
写入AT29C020A 时可以将多于256KB 的部分截去,实际上在国标汉字点阵字库中二
级汉字排到第87 区,从第88 区开始就是空白,所以将多余部分截去不会影响实际
使用。
在实际操作中硬件汉字库的制作和普通的程序存储器的编程没什么不同,注意
将HZK16 文件调入时,要使用二进制方式打开,编程并校验成功后即可将存储器取
下备用,这样一个硬件汉字库就制作好了。
针对不同的应用读者也可以选用其它大容量甚至是串行数据存储器从而可以扩
展硬件汉字库的使用范围。在此也一并向大家推荐:
1 容量为512KB 甚至更大的存储器,除了可以存储全部的国标汉字外,还可以
存储8x 16 的ASCII 码点阵数据以及汉字语句编码数据,使用起来更加方便。
2 串行数据存储器如AT45DB041B 等,特点是占用口线少、体积小和成本低,如
果对于速度要求不是很高的场合非常适宜。
三 硬件汉字库使用电路
在本节中笔者使用ATMEL公司的产品89C51 作为主控CPU使用控制板VT1335b
来控制320x240 点阵图形液晶显示器,并结合硬件汉字库的使用,将汉字“国”送
到液晶屏的(2,0)处显示。
TFT1335b一边连接液晶屏,另一边连接单片机。TFT1335b与液晶屏的连接非常简
单,参照TFT1335b和液晶屏的接口定义,将对应信号连接起来就一切OK了。TFT1335b
与单片机的连接信号定义如下:
具体电路如图3 所示
硬件设计说明:
1 由于AT29C020 的容量为256KB, 而80C51 系列微控制器只能管理64KB 的数
据空间,所以可以将AT29C020 分成8 页,每页32KB 占单片机系统数据空间的0000
-7FFFH, 剩余32KB 空间为单片机系统的其它存储器和外设。
2 A15 反相后作为液晶显示器的片选LCD/CS。
四 显示原理与软件编制
在第一节中我们已经得出“国”字的区位码为19-5AH, 换算成十进制为25-90,
即“国”字的点阵位于第25 区的第90 个字的位置,相当于在文件HZK16 中的位置
为32 * [ (25-1)* 94 + (90-1)] = 75040 = 12520H 以后的32 个字节为“国”的
显示点阵。
在本系统中AT29C020 的A15- A17 分别连接到P1 口的P1.0 P1.1 和P1.2 作为
页选择控制,A0-A14 直接连接单片机的A0 -A14, 利用MOVX 指令连续取32 个字节
送LCD 的相应位置就能实现正确的汉字显示。
将“国”显示与(2,0)处,设置TFT1335为X方向地址自动加一。因此,在每次
设置XY地址后,可以连续写两个字节。详细程序如下所示。
#include <reg51.h>
#include <absacc.h>
#define X_ADDR XBYTE[0x8000]
#define Y_ADDR XBYTE[0x8001]
#define CMD XBYTE[0x8002]
#define DAT XBYTE[0x8003]
unsigned char xdata *flash;//读字库指针
main()
{
unsigned long i;
unsigned char cnt,x,y;
CMD = 0x04;//x inc, disp on
//clear panel
for (y=0;y<240;y++)
{ Y_ADDR = y;
X_ADDR = 0;
for (x=0;x<40;x++) DAT = 0;
}
i=32 * [ (25-1)* 94 + (90-1) ] //计算“国”字地址
P1=i/0x8000;//页地址
flash=i%0x8000;//字库地址
//读FLASH,并将数据送到LCD上
for ( cnt=0; cnt<=15; cnt++ )
{X_ADDR = 2;
Y_ADDR = cnt;
DAT = *flash;
flash++;
DAT = *flash;
flash++;
}
while(1);
}
五 专用字库芯片
上海集通数码科技有限公司是专业从事汉字库芯片的研发、生产和经营的高科
技企业,在中文信息领域具有二十多年的技术经验和积淀,提供多种型号的点阵和
矢量字库。硬件汉字库的特点是字库信息完整,包括了国家标准中规定的所有汉字,
但硬件成本会略有提高。常用型号如GT21L16S2W,关于该芯片的详细资料、例程
可到网站“技术交流”板块中下载。
参考文献
[1] 綦声波等.硬件汉字库设计原理与应用
[2]徐卓农,张永忠.单片机系统中的汉字显示.单片机与嵌入式系统应用.2001(7):31 34
[3]李维提,郭强.液晶显示应用技术.第1 版.北京:电子工业出版社.2000.3
[4]王士元.C 高级实用程序设计.第1 版.北京清华大学出版社.1996.6