新鲜老笔记 https://bbs.21ic.com/?431546 [收藏] [复制] [RSS]

日志

硬件汉字库设计原理与应用

已有 930 次阅读2008-2-1 02:49 |个人分类:单片机|系统分类:接口电路| 硬件汉字库, 液晶显示, P89C51RD2

   
     摘要: 本文论述了硬件汉字库的基本原理和具体制作步骤并利用P89C51RD2 作为主控CPU 240x128点阵的液晶和硬件汉字库将一部科幻小说嵌入其中开机后即可阅读文章中给出了具体的电路和相应的软件。

    关键词:硬件汉字库 液晶显示 P89C51RD2

    随着液晶显示技术的发展和应用,越来越多的开发人员希望在自己开发的仪器设备中使用液晶屏幕来显示汉字,通常的汉字显示方式是先根据所需要的汉字提取汉字点阵如16x16 点阵,将点阵文件存入ROM 形成新的汉字编码,而在使用时则需要先根据新的汉字编码组成语句再由MCU 根据新编码提取相应的点阵进行汉字显示,在这种显示方式中如果使用的汉字数量较大或语句较多时,利用汉字的新编码组成语句将是一件繁琐而枯燥的工作。

    如果有新的汉字加入那么汉字库的维护也成问题,而我们日常生活的一些手持工具上如手机快译通等等它们可以任意输入汉字不仅灵活性大而且检索速度快,这其中的主要原因就是在这些设备中固化了硬件汉字库。而半导体技术的发展使得大容量FLASH ROM 的价格大大下降从而使用硬件汉字库的仪器设备的成本大大下降,因此越来越多的技术开发人员开始关注起硬件汉字库希望能在自己开发的设备中设计并使用硬件汉字库,达到加快产品开发速度降低软件成本的目的。

    一. 硬件汉字库相关知识

    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 万多字的小说嵌入其中,开机后就可以阅读小说。P89C51RD2PHILIPS 公司于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 个汉字的则补空格这就是下面软件中的ENG.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 开始的内部存储区
    MOV B, #94
    MUL AB
    ADD A, 25H
    MOV 25H, A
    CLR A
    ADDC A, B
    MOV 24H, A
    CLR C
    RRC A
    CLR C
    RRC A
    MOV P1, A
    LCALL RL245
    CLR 24H.7
    MOV DPH, 24H
    MOV DPL, 25H
    MOV R2, #32
    MOV R1, #0C0H
    DPHZ2: MOVX A, @DPTR
    INC DPTR
    MOV @R1, A
    INC R1
    DJNZ R2, DPHZ2
    RET
    RL245: MOV R7, #05 24H25H 左移5 位
    RLL1: CLR C
    MOV A, 25H
    RLC A
    MOV 25H,A
    MOV A, 24H
    RLC A
    MOV 24H, A
    DJNZ R7, RLL1
    RET
    R_ST: MOV DPTR, #C_ADD 读状态
    MOVX A, @DPTR
    RET
    ST01: LCALL R_ST 读写一数据前
    JNB ACC.0, ST01
    JNB ACC.1, ST01
    RET
    ST2: LCALL R_ST 连续读前
    JNB ACC.2, ST2
    RET
    ST3: LCALL R_ST 连续写前
    JNB ACC.3, ST3
    RET
    ST6: LCALL R_ST
    JB ACC.6, ERR
    RET
    ERR: LJMP ST6
    PR1: LCALL ST01
    MOV A, DAT1
    LCALL PR13
    PR11: LCALL ST01
    MOV A, DAT2
    LCALL PR13
    PR12: LCALL ST01
    MOV A, COM
    LJMP PR14
    PR13: MOV DPTR, #D_ADD
    PR14: MOVX @DPTR, A
    RET
    PR2: LCALL ST01
    MOV DPTR, #D_ADD
    MOVX A, @DPTR
    MOV DAT2, A
    RET
    INT: MOV DAT1, #00H 初始化设置子程序
    MOV DAT2, #00H
    MOV COM, #40H
    LCALL PR1
    MOV DAT1, #20H
    MOV DAT2, #00H
    MOV COM, #41H
    LCALL PR1
    MOV DAT1, #00H
    MOV DAT2, #08H
    MOV COM, #42H
    LCALL PR1
    MOV DAT1, #20H
    MOV DAT2, #00H
    MOV COM, #43H
    LCALL PR1
    MOV COM, #0A7H
    LCALL PR12
    MOV COM, #80H
    LCALL PR12
    MOV COM, #9CH
    LCALL PR12
    RET
    CLEAR: MOV DAT1, #00H 设置显示存储器首地址
    MOV DAT2, #00H
    MOV COM, #24H
    LCALL PR1
    MOV R3, #00H 设置循环量8K 字节
    MOV R4, #20H
    MOV COM, #0B0H 设置自动写方式
    LCALL PR12
    CLEAR1: LCALL ST3 判状态位S2
    MOV A, #00H 置数据0
    LCALL PR13 写入数据
    DJNZ R3, CLEAR1 循环
    DJNZ R4, CLEAR1
    MOV COM, #0B2H 设置自动写结束指令
    LCALL PR12
    RET
    WRI_CC: PUSH O_X 将字模数据送出显示
    PUSH O_Y
    MOV A, O_Y
    MOV B, #20H
    MUL AB
    ADD A, O_X
    MOV O_X, A
    MOV A, B
    ADDC A, #08H
    MOV O_Y, A
    MOV R0, #0C0H
    MOV COUNT, #10H
    WRI_CC1:MOV DAT1, O_X
    MOV DAT2, O_Y
    MOV COM, #24H
    LCALL PR1
    MOV A, @R0
    MOV DAT2,A
    INC R0
    MOV A, @R0
    INC R0
    MOV DAT1, A
    MOV COM, #0C0H
    LCALL PR11
    MOV DAT2, DAT1
    LCALL PR11
    MOV A, #20H
    ADD A, O_X
    MOV O_X, A
    CLR A
    ADDC A, O_Y
    MOV O_Y, A
    DJNZ COUNT, WRI_CC1
    POP O_Y
    POP O_X
    RET
    DL1MS: MOV R4,#0C0H
    DLY1: NOP
    DJNZ R4,DLY1
    RET
    DL10MS: CALL DL1MS
    CALL DL1MS
    CALL DL1MS
    CALL DL1MS
    CALL DL1MS
    CALL DL1MS
    CALL DL1MS
    CALL DL1MS
    CALL DL1MS
    CALL DL1MS
    RET
    DELAY: MOV R5,#0C8H ;延时1 秒
    DL5MS: MOV R4,#0FAH
    DLY: NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    DJNZ R4,DLY
    DJNZ R5,DL5MS
    RET
    INCLUDE 'MENG.ASM'
    END
    MENG.ASM 的开头部分如下所示由于该篇科幻小说太长故只列出了开头每行为15 个汉字标点
    符号全部采用全角
    TABLE: DB ' 第一章单杰圣士'
    DB ' 邦托乌是矗立大地的最伟'
    DB '大的都会地球上历史最悠久的城'
    DB '市自三千二百五十年前地球上'
    DB '所有的民族由经济共同体发展至政'
    DB '治大统一的国家代表中央权力核'
    DB '心的联邦政府便在这从未有过的'
    DB '宏伟都会里成立'
    DB ' 邦托乌的存在代表了旧'
    DB '有文明的消失再没有国界宗教'
    DB ' 民族这类使人世纷争永无休止的'
    DB '因素存在着'
    DB ' 经过毁灭性的战争后联邦国'
    DB '象浴火后的凤凰获得新的生命'
    DB '在联邦政府强有力的统治下这饱'
    DB '经劫难的星球终于出现了前所未'
    DB '有的长治久安'
    DB ' 邦托乌外还有四十八个大'
    DB '城市全球二十多亿人便聚居在这'
    DB '些城市里城市外是受到核污染和'
    DB '宇宙射线侵袭的废墟据联邦政府'
    DB '的宣告它们已不适合任何生命的'
    DB '繁衍邦托乌里最著名的建筑物'
    DB '是联邦政府元首和部长们办公的'
    DB '三角大楼这与众不同的建筑物'
    DB ' 是世界上最高的建筑物亦是人'
    DB '类建筑技术的顶尖杰作联邦政府'
    DB '的建筑法令内明文规定不准'
    DB '建造比她更高的建筑物使她永背'
    DB '着最伟大的美誉'
    DB ' 人们都唤她作金字塔'
    DB ' 她代表一个伟大时代的产生'
    DB '象征古老智慧变成被嘲弄和讪笑对'
    DB '象的年代君临大地'
    只要遵守该格式将全部内容录入经汇编无误后,将生成的BIN 文件写入P89C51RD2 并保证整个硬件
    电路正确那么上电复位后就请欣赏您的科幻小说吧


 参考文献
    [1]徐卓农,张永忠.单片机系统中的汉字显示.单片机与嵌入式系统应用.2001(7):31 34
    [2]李维提,郭强.液晶显示应用技术.第1 版.北京:电子工业出版社.2000.3
    [3]王士元.C 高级实用程序设计.第1 版.北京清华大学出版社.1996.6
    [4]P89C51RX2 DATA SHEET. PHILIPS Semiconductors. 2001.
    [5]MTG-F24128CMNHSCW, LCD MODULE SPECIFICATION FOR CUSTOMER S APPROVAL. Microtips TECHNOLOGY
    Inc. 1999.


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)