一硬件汉字库相关知识
1 汉字机内码国标码和区位码
在PC 机的文本文件中,汉字是以机内码的形式存储的。每个汉字占用两个字节长度为了和ASCII码区别,范围从十六进制的0A1H 开始小于80H 的为ASCII 码,将机内码每个字节的最高位屏蔽掉,再以十六进制的形式显示出来则为国标码。将机内码的每个字节各减去0A0H 再以十进制显示出来,即为该汉字的区位码。例如"国"字的机内码国标码和区位码如表1 所示
表1 国字的机内码国标码和区位码
类别数值高位字节低位字节
机内码B9FAH 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0
国标码397AH 0 0 1 1 1 0 0 1 0 1 1 1 1 0 1 0
区位码195AH 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0
即区位码机内码0A0AOH 就国字而言其区位码和机内码的关系为
195AH 区位码0B9FAH 机内码0A0A0H
记住这个关系是我们理解下面有关程序的关键
2 国标汉字字符集与区位码
根据对汉字使用频率程度的研究可把汉字分成高频字约100 个常用字约3000 个次常用
字约4000 字罕见字约8000 个和死字约45000 个即正常使用的汉字达15000 个。我国1981
年公布了通讯用汉字字符集基本集及其交换码标准GB2312-80 方案,把高频字常用字和次常用字集合成汉字基本字符集共6763 个,在该字符集中按汉字使用的频度又将其分为一级汉字3755 个,按拼音排序二级汉字3008 个,按部首排序再加上西文字母数字图形符号等700 个,国家标准的汉字字符集GB2312-80 在汉字操作系统中是以汉字库的形式提供的汉字库结构作了统一规定如图1 所示
此主题相关图片如下:
即将字库分成94 个区每个区有94 个汉字,以位作区别每一个汉字在汉字库中有确定的区和位。编号用两个字节这就是所谓的区位码。区位码的第一个字节表示区号,第二个字节表示位号,因而只要知道了区位码就可知道该汉字在字库中的地址。每个汉字在字库中是以点阵字模形式存储的,如一般采用16x16 点阵形式,每个点用一个二进制位表示,存1 的点当显示时可以在屏上显示一个亮点,存0 的点则在屏上不显示,这样就把存某字的16 16 点阵信息直接用来在显示器上按上述原则显示,则将出现对应的汉字如一个国字的16 16 点阵字模如图2 所示。当用存储单元存储该字模信息时将需32 个字节地址在图2 的右边写出了该字模对应的字节值
此主题相关图片如下:
3 液晶显示模块特性与字模数据
汉字显示是国内应用图形液晶显示模块的目的之一,目前对硬件汉字库比较关心的技术人员大多是想将其应用到图形点阵液晶显示器中,但目前有关液晶显示的资料大多数是介绍通过字模软件取出的点阵数据是如何送往液晶显示器的,因此作者在此作一下比较要在液晶屏幕上显示出这个点阵图形需要将相应的点阵数据送入液晶显示驱动器,但对于不同的液晶显示驱动器要显示同一图形所需要送入的数据排列顺序可能不同,作者曾经使用过内置D61202U 液晶显示驱动控制器和内置T6963C 液晶显示驱动控制器的液晶显示模块,同样是显示16 16 点阵的国
字则需要的点阵数据如下
HD61202U
DB 000H,0FEH,002H,00AH,08AH,08AH,08AH,0FAH
DB 08AH,08AH,08AH,00AH,002H,0FEH,000H,000H
DB 000H,0FFH,040H,048H,048H,048H,048H,04FH
DB 048H,049H,04EH,048H,040H,0FFH,000H,000H
由于HD61202U 显示存储器的特性不能将计算机内的汉字库提出直接使用,需要将其旋转90 度后再写入,也就是有些字模软件如zimo22.exe 可到www.c51bbs.com上免费下载设置为竖向倒序取模后所得的数据其生成字库的格式是前16 个字节为上半部16 8 点阵字模数据后16 个字节为下半部16x8 点阵字模数据,读者如果与图2 中的相应数据作比较可以看出如果仅仅从数据上是看不出两者的联系的,如果在这种液晶显示器上要使用硬件汉字库则读出的点阵信息必须经过处理方可送出显示增加了使用难度
T6963C
DB 000H,000H,07FH,0FCH,040H,004H,05FH,0F4H
DB 041H,004H,041H,004H,041H,004H,04FH,0E4H
DB 041H,044H,041H,024H,041H,024H,05FH,0F4H
DB 040H,004H,040H,004H,07FH,0FCH,040H,004H
这些数据也是通过字模软件得出的读者再与图2 中的32 个数据相比较可以看出两者在数值和排列顺序上都是一致的,正是这种特性使得笔者选择了内置T6963C 的液晶显示模块作为论述开发硬件汉字库的例子
二汉字库的制作
在本节中笔者将论述将16 16 点阵的宋体汉字库烧录到256KB 的存储器中的具体方法,这也是读者比较关心的问题。本例中使用了AT29C020 该产品是ATMEL 公司生产的高达256KB 的FLASH ROM ,读者也可以使用其它容量不小于256KB 的产品,但在具体电路设计时应注意引脚定义和逻辑关系,并在烧录时选择相应的型号UCDOS 软件有一个名字为HZK16 的文件,这就是16 16 的国标汉字点阵文件,在该文件中按汉字区位码从小到大依次存有:国标区位码中的所有汉字,每个汉字占用32 格字节,每个区为94 个汉字,如果显示其属性可以看出其大小为262KB 。当写入AT29C020A 时可以将多于256KB 的部分截去,实际上在国标汉字点阵字库中二级汉字排到第87 区,从第88 区开始就是空白,所以将多余部分截去不会影响实际使用。在实际操作中硬件汉字库的制作和普通的程序存储器的编程没什么不同,注意将HZK16 文件调入时要使用二进制方式打开编程并校验成功后,即可将存储器取下备用,这样一个硬件汉字库就制作好了。针对不同的应用读者也可以选用其它大容量甚至是串行数据存储器从而可以扩展硬件汉字库的使用范围。在此也一并向大家推荐容量为512KB 甚至更大的存储器除了可以存储全部的国标汉字外还可以存储8 16 的ASCII 码点阵数据以及汉字语句编码数据,使用起来更加方便。串行数据存储器如AT45DB041B 等特点是占用口线少体积小和成本低如果对于速度要求不是很高的场合非常适宜
三硬件汉字库使用电路
在本节中笔者使用PHILIPS 公司的产品P89C51RD2 作为主控CPU ,使用内置T6963 控制器的240x128 点阵图形液晶显示器并结合硬件汉字库的使用,将一部3 万多字的小说嵌入其中,开机后就可以阅读小说。P89C51RD2 是PHILIPS 公司于2001 年发布的一款非常优秀的单片机,该单片机是基于8 位80C51单片机的派生产品,它在完全保留80C51 指令系统和硬件结构的大框架外发生了多方面的加强扩展翻新和创新,P89C51RD2 将原有的对外数据和程序存储器的16 位寻址机制加以利用,把片上的RAM 扩展到1K 字节,片上的FLASH EPROM 扩展到64K 字节,由于一个汉字的内码占用两个字节,所以1024 字节可以存储512 个汉字所以64KB 的闪存可以存储3 万多汉字。
本系统使用了Microtips Technology Inc.公司生产的内置Toshiba 公司生产的T6963C 的液晶显示器型号为MTG-F24128CMNHSCW 具有CCFL 背光相关接口信息如下
此主题相关图片如下:
此主题相关图片如下:
硬件设计说明
由于AT29C020 的容量为256KB 而80C51 系列微控制器只能管理64KB 的数据空间所以可以将
AT29C020 分成8 页每页32KB 占单片机系统数据空间的0000 7FFFH 剩余32KB 空间为单片机系统的
其它存储器和外设
A15 反相后作为液晶显示器的片选LCD/CS P1.5 是控制液晶显示器正显和反显的该液晶显示器的
复位电平为低电平与P89C51RD2 正好相反
四显示原理与软件编制
在第一节中我们已经得出国字的区位码为195AH 换算成十进制为2590 ,即国字的点阵位
于第25 区的第90 个字的位置,相当于在文件HZK16 中的位置为32 [(25-1) 94 (90-1)] 75040B 以后的32 个字节为国的显示点阵。
在本系统中AT29C020 的A15 A17 分别连接到P1 口的P1.0 P1.1 和P1.2 作为页选择控制A0
A14 直接连接单片机的A0 A14 利用MOVX 指令连续取32 个字节送LCD 的相应位置就能实现正确的汉字显示。
由于240 128 点阵的LCD 显示器每行只能显示15 个汉字16 16 点阵汉字所以可以将需要显示的语句按15 个汉字为1 行进行编写标点符号要用全角不足15 个汉字的则补空格这就是下面软件中的MENG.ASM 中的内容
为方便读者将已经通过汇编的有关程序列出有关LCD 的具体使用方法请见文献[2]
主程序
C_ADD EQU 8001H 液晶命令地址
D_ADD EQU 8000H 液晶数据地址
DAT1 EQU 30H
DAT2 EQU 31H
COM EQU 32H
CODE1 EQU 33H
COUNT EQU 34H
O_Y EQU 35H
O_X EQU 36H
COUNT_X EQU 37H
ORG 0000H
SJMP START
ORG 0030H
START: MOV SP, #60H
ORL AUXR, #02H EXTRAM 位1 访问外部数据存储器
ANL AUXR1, #0FH ENBOOT=0 访问到FLASH
CLR P1.5 正显
LCALL INT 初始化设置子程序
LCALL CLEAR 清屏
MOV DPTR, #TABLE 科幻小说的开头
MOV O_Y, #00H
PUSH DPH
PUSH DPL
LOOP: POP DPL
POP DPH
MOV R0, #0E0H 字模数据暂存区
MOV R7, #30 每个汉字为2 字节每行15 个汉字需30 字节
PRHZ3: CLR A
MOVC A, @A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7, PRHZ3
PUSH DPH
PUSH DPL
MOV O_X, #00H
MOV R0, #0E0H
MOV COUNT_X, #15
LCD112: MOV 24H, @R0 24H 和25H 为暂存缓冲存内码
INC R0
MOV 25H, @R0
INC R0
MOV A, 24H
CLR C
SUBB A, #0A1H 转换为区位码
MOV 24H, A
MOV A, 25H
CLR C
SUBB A, #0A1H
MOV 25H, A
MOV A, R0
PUSH ACC
LCALL DPONHZ 取字模数据并存入0C0H 开始的寄存器
LCALL WRI_CC 送出显示
POP ACC
MOV R0, A
INC O_X
INC O_X
DJNZ COUNT_X,LCD112 1 行汉字送完跳转
MOV A, O_Y
ADD A, #10H
MOV O_Y, A
MOV A, O_Y
CJNE A, #80H,LOOP
MOV O_Y, #00H
LCALL DELAY 送完1 屏后延长时间以便于阅读
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
POP DPL
POP DPH
PUSH DPH
PUSH DPL
MOV A, DPH
SUBB A, #0DFH 小说结尾地址如果是结尾则复位重新开始
JNC RST1
JMP LOOP
RST1: MOV A, DPL
SUBB A, #2AH
JNC RST
JMP LOOP
RST: JMP START
DPONHZ: MOV A, 24H 取字模数据至0C0H 开始的内部存储区
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

