使用过液晶的电子工程师普遍达成这样一个共识: 当设计有大量汉字的显示系统时,愿意选取自带汉字库的液晶模块(LCM),如果必须要自行设计汉字库,总是比较头疼。其实自制硬件汉字库也不是很困难,只是对存储单元有一定的要求。常见的带字库液晶模块,所带字库一般都是一二级字库,如果需要显示罕见字(即扩展字库独有的汉字),目前市面上还没有相应的液晶产品。本文介绍了一套单片机显示系统,可以解决上述种种问题,而且硬件结构明晰,软件设计精简合理。
1 GBK 汉字内码扩展规范
正常使用的汉字有15 000个左右,其中高频字、常用字、次常用字约7 000个,罕见字约8 000个。根据GB231280国家标准,把高频字、常用字、次常用字集合成汉字基本字符集,在该字符集中按照汉字使用的频度,又将其分为一级汉字3 755个,二级汉字3 008个,再加上西文字母、数字、图形符号等700个。罕见字并不在此国标中。
GBK全名为汉字内码扩展规范,英文名Chinese Internal Code Specification。 K即“扩展”所对应的汉语拼音(Kuo Zhan)中“扩”字的声母。GBK采用双字节表示,总体编码范围为 8140~FEFE,首字节在 81~FE,尾字节在 40~FE,剔除 xx7F。总计 23 940个码位,共收入 21 886个汉字和图形符号,其中汉字(包括部首和构件)21 003个,图形符号883个。GBK汉字库通常被称为“扩展字库”,该标准基本上已经将所有汉字都包括在内了。
在互联网上可以找到一个名字为GBK16的文件,这就是16×16点阵的GBK国家标准扩展汉字库,大小为770 112字节。
2 设计思路
本设计充分考虑了系统的可扩展性,所以选取器件时,在容量和性能上留出了足够的空间。单片机选取AT89C51RD2,有64 KB的程序空间。片外存储器选用Samsung公司的NAND Flash K9F5608,有32 MB存储空间,扩展字库占用不到1 MB空间,其余空间可作它用。液晶使用带中文字库图形点阵液晶显示模块TNSG320240FTDEW1W,可显示320×240个点阵,内建512 KB ROM,提供一、二级简繁体中文字库。
一个16×16点阵的汉字(如喎,发音为wāi),使用存储单元存储该汉字信息时,需要占用32个字节:
00 00 01 F8 79 08 49 E8 49 28 49 28 4B FC 4A 04
4A F4 7A 94 4A 94 02 F4 02 94 02 04 02 14 02 08
当需要在液晶上显示这个汉字时,先要根据相对应的双字节GBK国标码(q=0x86,w=0xB7),然后根据汉字内码的调用公式:
字库中的位置= HANZIKU_ADDRESS+(q-0x81)×(16×12-1)+(w/0x10-4)×16+w%0x10式中: q为内码低8位,w为内码高8位。得出“HANZIKU_ADDRESS+0x8640”,在Flash中找到数据地址后连续读取32个字节,然后发送到液晶指定位置显示。
再来介绍一下如何将GBK汉字库文件GBK16装载到NAND Flash中。这里介绍两种方法,都比较简单易行。第一种是使用专用编程器直接对Flash进行数据写入,需要指定汉字库的起始地址HANZIKU_ADDRESS,笔者使用的是Wellon VP48B通用编程器。第二种是在硬件系统中加入串口,通过PC机上的第三方串口调试工具“串口调试助手SComAssistant V2.1”向单片机系统发送汉字库文件GBK16,单片机将收到的数据按照Flash的存储规则,存入存储器的指定起始空间内,起始地址HANZIKU_ADDRESS。该方法对硬件要求低,使用简便,能够按照实际需要在系统中随意调整字库的位置。
3 系统硬件电路
单片机选取AT89C51RD2,片外存储器选用Samsung公司的NAND Flash K9F5608,液晶使用带有中英文文字与绘图模式点矩阵液晶显示控制器RA8802的液晶显示模块TNSG320240FTDEW1W。具体电路如图1所示。
图1 系统硬件电路图
4 系统软件部分
由于篇幅有限,这里只给出主程序部分,在KEIL C uVision 3下编译成功。如果对具体功能子程序或全部程序感兴趣,可以与笔者联系。
主程序:
#include "AT89C51XD2.h"
#include <intrins.h>
#include <absacc.h>
#include <string.h>
#include "flash.h"//Flash部分子程序的头文件
#include "lcd.h"//LCD部分子程序的头文件
#include "uart.h"//UART部分子程序的头文件
#define HANZIKU_ADDRESS 0xE10000
//指定数据16×16汉字库起始地址
uchar xdata onhanziData[32];
//一个16×16点阵的汉字数据数组
void Readonehanzi(uchar wordfirst,uchar wordsecond);
void LcdShowonehanzi(uchar Xnumber,uchar Ynumber,uchar Color);
void do_hanziku(void);
编者注: 具体函数部分略。
结语
该系统软硬件设计简便,支持GBK汉字库,整个开发过程在一周以内完成。成本低、扩展性强等特点,使其能够方便、快捷地移植到多种设计开发中,具有很高的实用性。