一种单片机不完整字库的生成和使用方法

合集下载

利用CRT及8051单片机实现汉字的显示输出

利用CRT及8051单片机实现汉字的显示输出

文章编号:10082312X (2001)0320039202利用CRT 及8051单片机实现汉字的显示输出刘文江,富文军(济南交通高等专科学校,山东济南 250023)摘要:设计出了一种以8051单片机为主处理器,以CRT 为显示终端的智能汉字处理系统。

对字库的建立、汉字点阵的寻址、汉字的显示输出及8051与CRT 适配卡的接口进行了较详细地介绍。

实际应用表明,本系统实现了最佳的资源配置,具有极高的性能价格比。

关 键 词:CRT;8051;汉显系统中图分类号:TP391.12文献标识码:B 计算机的汉字信息处理主要解决中文信息在计算机上的输入、输出、汉字点阵的存贮、识别及读取等问题。

利用系统机来处理汉字,速度快、效率高、功能齐全,应用起来十分方便。

已基本能满足各行各业对汉字处理的需要,受到人们的普遍欢迎。

但在某些需要简单处理汉字显示的场合,应用系统机不经济,造成资源的浪费。

并且在大部分以单片机为核心构成的监控系统中,往往要求具有汉字显示的功能,以方便人机对话。

所以如何利用单片机的有限资源,探索一种简捷的汉字信息处理方法,不但具有一定的理论意义,并且具有很大的实用价值。

文中介绍的汉字处理系统是一个完整的单片机应用系统,以8051为主机,汉字点阵固化在片外EPROM 中,并作为片外RAM 读取,用CRT 实现汉字的显示。

本系统实现了最佳的资源配置,具有极高的性能价格比。

1 汉字库的建立计算机内部任何信息都是以数据形式表示的。

在需要汉字的计算机系统中,汉字作为计算机要处理的信息当然也不能例外。

这种计算机系统必须有一个用于产生直接存贮汉字字型和各种符号信息的存贮系统,称为汉字字型发生器或叫汉字库。

汉字库是由一批汉字的字型码或字型压缩码按一定的次序排列而成的。

它为汉字输出设备如显示器和打印机提供汉字的字型数据。

考虑到单片机资源有限,本系统的汉字库的汉字字型信息采用16×16点阵码,字库中包括全部国标G B2312中规定的一级和二级汉字。

HZK16应用示例

HZK16应用示例

在C51中,HZK16汉字库的使用(mydows's Blog转载)定义如下:unsigned char str[]="我"在运行时str被初始化为2个字节长度,内容为“我”的GBK码,为:0xCE(区码),0xD2(位码)。

使用如下换算公式得到“我”在HZK16文件中的地址,从该位置开始的顺序32字节为“我”的字模。

ADD=【(区码-0xa1)×0x5e + (位码-0xa1)】×0x20按照上面的计算方法,“我”的字模地址:0x216E0 。

他的C语言字模为:0x04, 0x80,0x0E,0xA0,0x78,0x90,0x08,0x90,0x08,0x84,0xFF,0xFE,0x08,0x80,0x08,0x90,0x0A,0x90,0x0C,0x60,0x18,0x40,0x68,0xA0,0x09,0x20,0x0A,0x14,0x28,0x14,0x10,0x0CHZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。

其中一级汉字有3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。

我们在一些应用场合根本用不到这么多汉字字模,所以在应用时就可以只提取部分字体作为己用。

HZK16字库里的16×16汉字一共需要256个点来显示,也就是说需要32个字节才能达到显示一个普通汉字的目的。

我们知道一个GB2312汉字是由两个字节编码的,范围为A1A1~FEFE。

A1-A9为符号区,B0到F7为汉字区。

每一个区有94个字符(注意:这只是编码的许可范围,不一定都有字型对应,比如符号区就有很多编码空白区域)。

下面以汉字“我”为例,介绍如何在HZK16文件中找到它对应的32个字节的字模数据。

前面说到一个汉字占两个字节,这两个中前一个字节为该汉字的区号,后一个字节为该字的位号。

菜鸟学习51单片机之12864液晶(无字库)

菜鸟学习51单片机之12864液晶(无字库)
现在将如何在液晶上面显示字。 一.清屏
/* 选择屏幕来清屏 */
菜鸟学习 51 单片机
while(1)世界
void Lcd12864Clear(uint8 selet)
{
uint8 i,j;
Lcd12864SeletScreen(selet); //选择屏,分左屏和又屏,这个函数在程序中有
for(i = 0;i < 8 ;i++)
二.写入地址
void Lcd12864Point(uint8 page,uint8 x,uint8 y)
{
Lcd12864Write(CMD,0xb8 + page);
//确定页
Lcd12864Write(CMD,0xC0 + x);
//设定起始行
Lcd12864Write(CMD,0x40 + y);
菜鸟学习 51 单片机
while(1)世界
现在开始讲解如何使用,看这篇讲解前,请先到网盘去下载本教 程的仿真图和程序,结合起来更容易明白。
上图是仿真的结果。 在仿真软件中找出的 12864 液晶是没有字库的,对于仿真软件中 液晶的控制和平常的有点不同。一块液晶是由两块 64×64 的液晶显 示模块组合而成。下面是各管脚的介绍。
//有 8 页,循环 8 次
{
Lcd12864Point(i,0,0); //这个就是上面讲到的函数,确定位置
for(j = 0 ;j < 64;j++) //每一块液晶显示模块有 64 列
{
Lcd12864Write(DAT,0x00); //写入 0x00 来清屏
}
}
}
具体的使用如下:初始化函数中调用了清全屏 Lcd12864Clear(3); //清全屏

基于单片机的硬件字库设计

基于单片机的硬件字库设计

基于单片机的硬件字库设计作者:汤美玲陕西理工学院(物电学院)电子信息科学与技术专业2008级陕西汉中723000指导教师:刘东摘要:随着液晶显示技术的发展和应用,越来越多的开发人员希望在自己开发的仪器设备中使用液晶屏幕来显示汉字,通常的汉字显示方式是先根据所需要的汉字提取汉字点阵如16x16 点阵,将点阵文件存入ROM 形成新的汉字编码,而在使用时则需要先根据新的汉字编码组成语句再由MCU 根据新编码提取相应的点阵进行汉字显示,在这种显示方式中如果使用的汉字数量较大或语句较多时,利用汉字的新编码组成语句将是一件繁琐而枯燥的工作。

如果有新的汉字加入那么汉字库的维护也成问题,而我们日常生活的一些手持工具上如手机快译通等等它们可以任意输入汉字不仅灵活性大而且检索速度快,这其中的主要原因就是在这些设备中固化了硬件汉字库。

本设计就是通过keil软件编写c语言程序并生成HEX文件联合proteus电路设计仿真软件制作一个简单的硬件字库系统。

关键词:c语言, 单片机,硬件,字库一.任务设计并制作一个基于单片机的硬件字库系统.二.要求1.基本要求1.1可显示任何汉字字符.1.2可实现花样显示.2.发挥部分2.1不需要使用专门的字模软件提取固定汉字字模.2.2可人性化设置.三.说明3.1时间要求:11月12日到11月24日.3.2完成实际电路,总结报告.3.3本例将262KB的16x16点阵中文字库文件HZK16拆分为两个128KB文件,分别保存到两片24C1024中,多余6KB被删除,运行时,对于任意输入的汉字或中文标题符号,程序会直接从24C1024所保存的字库中提取点阵并转换为液晶格式,在12864液晶屏上显示。

四.硬件字库系统设计的基本原理及分析本系统在两块24C1024芯片中内置了16x16点阵汉字库文件HZK16,该文件共262KB (两块芯片各保存128KB ),多余的部分被删除。

本例运行时,程序根据汉字内码得到区位码,再根据区位码从硬件字库中提取汉字点阵,所提取的字库点阵进一步转换为本例液晶屏汉字显示所需要的格式后即可显示在液晶屏上。

Proteus中基于AT24C512的汉字库加载技术及显示仿真

Proteus中基于AT24C512的汉字库加载技术及显示仿真

Proteus中基于AT24C512的汉字库加载技术及显示仿真李建波【摘要】以往Proteus中利用LCD显示汉字,需要先用汉字取模软件取模、然后拷贝汉字点阵数据到程序,步骤繁琐,而且只能显示预备好的汉字,十分不方便.为解决这一问题,将汉字库HZK16以64 kB大小划分成4个区间,并分别加载到Proteus 的4个AT24C512存储器中,设计了数据读取电路,利用Proteus中的PG160128液晶模块实现了汉字显示.实验结果表明,采用AT24C512存储汉字库文件的方式可以方便地显示汉字,打破了只能显示固定汉字的模式,提高了开发效率.【期刊名称】《液晶与显示》【年(卷),期】2010(025)003【总页数】5页(P391-395)【关键词】Proteus;汉字库;加载技术;PG160液晶【作者】李建波【作者单位】华南理工大学,聚合物新型成型装备国家工程研究中心,广东,广州,510640;广东机电职业技术学院,计算机系,广东,广州,510515【正文语种】中文【中图分类】TP368.1;TN873.93Proteus是由英国Labcenter Electronics公司开发的EDA工具软件,可以仿真几十种单片机。

在Proteus软件中,可以将目标文件加载到单片机芯片,点击Play即可实现单片机仿真。

软件和硬件的结合,就是一个完整的单片机应用系统,能够进行单片机仿真,观察实践效果,对单片机开发和教学起到了极大的推动作用[1-4]。

利用Proteus对LCD的开发,可以缩短开发周期,节约开发成本。

但是,现在在汉字显示方面的开发力度尚嫌不足,尤其是汉字点阵获取方面。

开发者大多利用“汉字取模工具”,输入汉字,得到点阵数据,然后复制到编写的程序中[5-9]。

采用这种方式,每个汉字需要32个字节,如果显示汉字多的话数据将会非常庞大。

而且,这种方式只能显示固定汉字,如果需要显示其他汉字还要重新取模,非常不方便。

字库制作详细教程(精)

字库制作详细教程(精)

字库制作详细教程很多时候,我们会用到字库,平时用到字库一般是把用到的汉字用取模软件按照自己的取模方式得到汉字的编码数组,然后把这些编码放在单片机的Flash里,用时调用出来显示。

但是如果我们要用到很多的汉字时,这种方法就不可取了,占用太多的Flash空间,然后我们会想到把字库放在SD卡或者是U盘里,用到时再从存储介质里读出来,这样,我们就可以显示很多汉字。

下面是字库的制作方法,首先感谢一个人,就是本坛的章其波大虾,其实就是他的一个贴子里的方法,只是他那个太专业了,一般的人看得不是很懂,所以我把它整理成了这个图文并茂的,方便各大网友,也是方便自己查看。

1、首先,好比起房子,得有源材料,用到以下3个文件:(1 取点阵Mold.exe(2 ziku.txt(3 ziku.exe取点阵Mold.exe是“牧马字模0.84测试版”取模软件ziku.txt是按顺序写有8178个汉字和字符的txt文档ziku.exe是一个小程序,配合“牧马字模0.84测试版”生成bin文件2、打开“牧马字模0.84测试版”取模软件,其界面如下所示:3、在工具栏处点“打开”按钮,打开ziku.txt文件,然后根据自己的需要,设置想要的取模方式,然后点工具栏上的“输出”按钮并等待其完成,完成后会在取模软件所在路径生成了一个temp.txt文件,修改这个文件名,比如现在我是按照“宋体、点阵数为16、字重为4、取模为为16*16、对齐设置为左上、方向设置为横向取模,高位在左”的方式来取的字模,也就是我平时TFT常用的一种字模,改文件名为st16x16.txt 。

4、为了生成的方便,我们在D盘根目录下新建一个文件夹,名称就叫ziku吧,然后,把ziku.exe 和st16x16.txt复制一份到这个文件夹里。

5、打开命令窗口:“开始”->“运行”->“cmd”,如下图所示:然后用cd命令进入到我们刚刚建的ziku文件夹下,输入命令如下图所示:6、输入命令,生成字库文件,输入命令如下图所示:为什么输入这样的命令,如果大家对main函数参数argc和argv有所了解的话,即int main(int argc, char* argv[] 这一主函数,这是很容易理解的,第一个参数是命令行输入参数的个数,第二个参数则存储了所有的命令行参数,前面我们已经用cd命令进入到了ziku文件夹下,接着我们输入了两个参数:ziku.exe st16x16.txt则,argc的值是2,argv[0]是" ziku.exe ",argv[1]是" st16x16.txt "。

基于单片机控制的LED汉字显示.doc

基于单片机控制的LED汉字显示.doc

分类号 TP 单位代码 11395 密级公开学号 0605230学生毕业设计(论文)题目LED汉字显示作者院 (系) 能源工程学院专业电气工程及自动化指导教师答辩日期2010年月日毕业设计(论文)诚信责任书本人郑重声明:所呈交的毕业设计(论文),是本人在导师的指导下独立进行研究所取得的成果。

毕业设计(论文)中凡引用他人已经发表或未发表的成果、数据、观点等,均已明确注明出处。

尽我所知,除文中已经注明引用的内容外,本论文不包含任何其他个人或集体已经公开发表或撰写过的研究成果。

对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

本人毕业设计(论文)与资料若有不实,愿意承担一切相关的法律责任。

论文作者签名:年月日LED汉字显示摘要目前,作为方便、快捷的信息显示方式,LED汉字显示的应用非常广泛。

车站、银行、超市等大型公共场所的即时信息及广告的显示,无不应用LED汉字显示屏。

在能源日渐危机以及信息日渐重要的今天,具有低耗能、频更新、易维护的LED汉字显示屏必将受到广泛的应用,其具有非常的发展前景。

本文从LED的发展及单片机的简单原理开始,深入的研究了基于AT89C51单片机16×16 LED汉字滚动显示屏的设计并运用Proteus软件的仿真和实现。

主要介绍了LED汉字显示屏的硬件电路设计、汇编程序设计与调试、Proteus 软件仿真和实物制作等方面的内容,本显示屏的设计具有体积小、硬件少、电路结构简单及容易实现等优点。

能帮助广大电子爱好者了解汉字的点阵显示原理,认识单片机的基本结构、工作原理及应用方法,并提高单片机知识技术的运用能力。

关键词:单片机 LED 点阵 Proteus仿真ABSTRACTNow, as a convenient, quick, LED display mode of information that is very extensive application. Station, bank, supermarket and large public places of instant messaging and advertisement of the application of Chinese characters, LED display screen. In the energy crisis and information increasingly more important today, with low energy consumption, easy maintenance and update frequency of the Chinese character screen will be LED by the widespread application, it has very development prospects.In this paper, based on AT89C51 microcontroller 16 × 16LED scrolling display character design and the use of software in the simulation and realization of Proteus. Introduces the character LED display hardware design, assembly programming and debugging, Proteus software simulation and other aspects of physical production, the design of the screen is small, less hardware, the circuit structure is simple and easy to implement. Can help the fans understand the character of the lattice electronic display principle, understanding the basic structure of SCM, working principle and application of methods and technologies to improve knowledge and ability to use single chip.Keywords:microcontroller, LED dot matrix ,Proteus simulation.LED汉字显示目录摘要 (1)ABSTRACT (2)目录 (2)1 引言 (1)1.1 LED汉字显示研究背景及意义 (2)1.2本设计的研究内容及方法 (2)1.3 本设计的主要工作 (3)2 硬件电路组成及工作原理 (4)2.1 硬件电路组成 (4)2.1.1 A T89C51简介 .......................................................................................... (4)2.1.2 时钟电路设计 (7)2.1.3复位电路设计 (15)2.1.4 16×16LED点阵屏 (9)2.2 元器件选择 (10)2.3 硬件电路工作原理 (19)3 LED汉字显示原理及字库代码获取方法 (20)3.1 汉字的点阵显示原理 (20)3.2 字库代码获取方法 (20)3.3 LED屏的显示 (22)4 程序设计 (25)4.1 主程序 (25)4.2 显示子程序、延时子程序 (25)4.3 程序编译、仿真 (19)5 基于PROTEUS的电路仿真 (30)5.1用PROTEUS 绘制原理图 (30)5.2 PROTEUS 对单片机内核的仿真 (31)6 结束语 (33)参考文献 (35)致谢 (37)1 引 言1.1 LED 汉字显示研究背景及意义受到体育场馆用LED 显示屏需求快速增长的带动,近年来,中国 LED 显示屏应用逐步增多。

利用STC89C52单片机控制LCD1602

利用STC89C52单片机控制LCD1602

//液晶显示中文-版本0.0//作者:pcdian//定义液晶的一些功能位//RS 为数据、指令寄存器选择位//RW 为读写选择位//E 为使能位RS BIT p2.5RW BIT P2.6E BIT P2.7ORG 0000HSJMP STARTORG 000BHLJMP Timer_ITORG 0030HSTART:MOV SP,#60HMOV TMOD,#01HMOV TH0,#0A6HMOV TL0,#00HSETB EASETB ET0CLR TR0MAIN:MOV P0,#01H //清屏ACALL ENABLEMOV P0,#38H //显示模式设置为16字*2行ACALL ENABLEMOV P0,#0CH //不显示光标ACALL ENABLEMOV P0,#06H //显示方向正向且屏不移动ACALL ENABLEDISPLAY:ACALL DISPLAY_C0//我MOV P0,#80HACALL ENABLEMOV P0,#00HACALL WRITEMOV P0,#81HACALL ENABLEMOV P0,#01HACALL WRITEMOV P0,#82HACALL ENABLEMOV P0,#02HACALL WRITEMOV P0,#0C0HACALL ENABLEMOV P0,#03HACALL WRITEMOV P0,#0C1HACALL ENABLEMOV P0,#04HACALL WRITEMOV P0,#0C2HACALL ENABLEMOV P0,#05HACALL WRITELCALL DELAY1SMOV P0,#01HACALL ENABLEACALL DISPLAY_C1//们MOV P0,#83HACALL ENABLEMOV P0,#00HACALL WRITEMOV P0,#84HACALL ENABLEMOV P0,#01HACALL WRITEMOV P0,#85HACALL ENABLEMOV P0,#02HACALL WRITEMOV P0,#0C3HACALL ENABLEMOV P0,#03HACALL WRITEMOV P0,#0C4HACALL ENABLEACALL WRITEMOV P0,#0C5HACALL ENABLEMOV P0,#05HACALL WRITELCALL DELAY1SMOV P0,#01HACALL ENABLEACALL DISPLAY_C2//的MOV P0,#86HACALL ENABLEMOV P0,#00HACALL WRITEMOV P0,#87HACALL ENABLEMOV P0,#01HACALL WRITEMOV P0,#88HACALL ENABLEMOV P0,#02HACALL WRITEMOV P0,#0C6HACALL ENABLEMOV P0,#03HACALL WRITEACALL ENABLEMOV P0,#04HACALL WRITEMOV P0,#0C8HACALL ENABLEMOV P0,#05HACALL WRITELCALL DELAY1SMOV P0,#01HACALL ENABLEACALL DISPLAY_C3//0MOV P0,#89HACALL ENABLEMOV P0,#00HACALL WRITEMOV P0,#8AHACALL ENABLEMOV P0,#01HACALL WRITEMOV P0,#0C9HACALL ENABLEMOV P0,#02HACALL WRITEMOV P0,#0CAHACALL ENABLEMOV P0,#03HLCALL DELAY1SMOV P0,#01HACALL ENABLEACALL DISPLAY_C4//7MOV P0,#8BHACALL ENABLEMOV P0,#00HACALL WRITEMOV P0,#8CHACALL ENABLEMOV P0,#01HACALL WRITEMOV P0,#0CBHACALL ENABLEMOV P0,#02HACALL WRITEMOV P0,#0CCHACALL ENABLEMOV P0,#03HACALL WRITE//3MOV P0,#8DHACALL ENABLEMOV P0,#04HACALL WRITEMOV P0,#8EHACALL ENABLEMOV P0,#05HACALL WRITEMOV P0,#0CDHACALL ENABLEMOV P0,#06HACALL WRITEMOV P0,#0CEHACALL ENABLEMOV P0,#07HACALL WRITELCALL DELAY1SMOV P0,#01HACALL ENABLELJMP DISPLAY DISPLAY_C0:MOV DPTR,#TAB0MOV R2,#48ACALL DISPLAY_CRET DISPLAY_C1:MOV DPTR,#TAB1MOV R2,#48ACALL DISPLAY_CRET DISPLAY_C2:MOV DPTR,#TAB2MOV R2,#48ACALL DISPLAY_CRET DISPLAY_C3:MOV DPTR,#TAB3MOV R2,#32ACALL DISPLAY_CRET DISPLAY_C4:MOV DPTR,#TAB4MOV R2,#64ACALL DISPLAY_CRETDISPLAY_C:MOV P0,#40HACALL ENABLEMOV R3,#0DISPLAY_CC:MOV A,R3MOVC A,@A+DPTRMOV P0,ALCALL WRITEINC R3DJNZ R2,DISPLAY_CCRETENABLE:CLR RSCLR RWCLR EACALL DELAYSETB ERETWRITE:SETB RSCLR RWCLR EACALL DELAYSETB ERETDELAY1S:SETB TR0CJNE R0,#20,DELAY1SCLR TR0MOV R0,#0RETDELAY:MOV R5,#08HL1:MOV R4,#0FAHL0:DJNZ R4,L0DJNZ R5,L1RETTimer_IT:MOV TH0,#0A6HMOV TL0,#00HINC R0RETITAB0: //我DB 0x00,0x07,0x01,0x01,0x01,0x1F,0x01,0x01 DB 0x19,0x01,0x01,0x01,0x01,0x1F,0x01,0x01 DB 0x00,0x08,0x04,0x04,0x00,0x1F,0x00,0x04 DB 0x01,0x07,0x19,0x01,0x01,0x01,0x05,0x02 DB 0x18,0x00,0x00,0x01,0x06,0x00,0x00,0x00 DB 0x14,0x18,0x10,0x08,0x09,0x05,0x03,0x01TAB1: //们DB 0x01,0x01,0x02,0x02,0x06,0x04,0x0c,0x14 DB 0x08,0x04,0x06,0x04,0x10,0x10,0x10,0x10 DB 0x00,0x00,0x1e,0x02,0x02,0x02,0x02,0x02 DB 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00 DB 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00 DB 0x02,0x02,0x02,0x02,0x02,0x0a,0x04,0x00TAB2: //的DB 0x02,0x02,0x04,0x0f,0x08,0x08,0x08,0x0f DB 0x02,0x02,0x02,0x13,0x14,0x14,0x18,0x12DB 0x00,0x00,0x00,0x1e,0x02,0x02,0x02,0x02DB 0x08,0x08,0x08,0x08,0x0f,0x08,0x08,0x00DB 0x11,0x11,0x10,0x10,0x10,0x10,0x00,0x00DB 0x02,0x12,0x12,0x02,0x02,0x14,0x08,0x00TAB3: //0DB 0x00,0x00,0x03,0x04,0x08,0x08,0x08,0x08DB 0x00,0x00,0x18,0x04,0x02,0x02,0x02,0X02DB 0x08,0x08,0x08,0x08,0x04,0x03,0x00,0x00DB 0x02,0x02,0x02,0x02,0x04,0x18,0x00,0x00TAB4: //7DB 0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00DB 0x00,0x00,0x1E,0x1E,0x06,0x06,0x06,0X06DB 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00DB 0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00//3DB 0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x0FDB 0x00,0x00,0x1E,0x1E,0x06,0x06,0x06,0X1EDB 0x0F,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00DB 0x1E,0x06,0x06,0x06,0x1E,0x1E,0x00,0x00END四、总结:虽然LCD1602可以利用自建字符显示中文,但最多不能超过8个字符位。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一种单片机不完整字库的生成和使用方法
作者:刘先红
来源:《价值工程》2012年第28期
摘要:针对小型单片机系统LCD显示程序中字模的特点,提出了一种高效的不完整字库的生成方法,可自动完成字模提取和字符串的重新编码,并生成C语言代码,有效的提高了开发效率。

Abstract: According to the features of character in LCD display program of small SCM,an efficient method of building incomplete fonts is proposed in the paper. By acquiring Chinese matrix automatically and recoding character string,the exploit efficiency is increased.
关键词:字库;重新编码;单片机
Key words: matrix fonts;character string recode;SCM
中图分类号:TN873.93 文献标识码:A 文章编号:1006—4311(2012)28—0192—02
0 引言
在嵌入式系统软件设计中,尤其是基于小型单片机的LCD显示仪器仪表软件,汉字字库和一些特殊符号字库是必备要素。

虽然市场上有很多带字库的LCD,但字库会超出普遍使用的单片机的寻址范围,成本也较不含字库的高。

在很多LCD显示仪器仪表中,软件中用到的字符数一般有限,甚至只有十几个;若将完整的汉字字库存入到单片机ROM中,往往ROM 容量不够,而若只存储使用到的字符字模,需要建立每个汉字内码及其字模首地址的映射表,当显示某个字时,需首先查找这个表找到对应的字模首地址,但查找效率随着字符数的增多越来越低,而且需要把所有用到的字符输入到字模提取软件中提取字模。

因此,本文提出一种高效的单片机不完整字库的生成和使用方法,适用于绝大部分小型单片机的软件设计。

1 不完整字库生成方法
不完整字库的生成基于这样的方法:程序员首先将显示程序中用到的汉字字符串和特殊符号字符存入到一个文本文件中,采用[英文字符串]{中文字符串}格式,其中作为后续程序中访问字符串的标识,[英文字符串]作为{中文字符串}的对应的英文翻译,如“[Main Menu]{主菜单}”。

在程序设计中,可以顺序按行添加字符串。

采用Microsoft Visual C++ 6.0编程,程序流程图如图1所示,首先读入文本文件,并对文件中所有{}内的汉字进行扫描,根据汉字内码大小顺序存储所有汉字,如“[Main Menu]{主菜单}”中的汉字存储为“单菜主”,重复汉字只存储一次,这样就找到了程序中用到的所有汉字。

其次,提取找到的汉字字模并按顺序生成C语言数组,如“单菜主”生成的16×16的字模数组为:
const unsigned char ucGB16x16Dot[] =
{
0x08,0x20,0x06,0x30,0x04,0x40,0x3f,0xf8,0x21,0x08,
0x3f,0xf8,0x21,0x08,0x21,0x08,
0x3f,0xf8,0x21,0x08,0x01,0x00,0xff,0xfe,0x01,0x00,0x01,
0x00,0x01,0x00,0x01,0x00, /* —单—*/
0x04,0x40,0xff,0xfe,0x04,0x40,0x04,0x40,0x3f,0xf8,0x22,
0x08,0x11,0x10,0x08,0x20,
0x01,0x00,0x7f,0xfe,0x03,0x80,0x05,0x40,0x09,
0x30,0x11,0x1c,0x61,0x08,0x01,0x00, /* —菜—*/
0x02,0x00,0x01,0x80,0x01,0x00,0x00,0x08,0x3f,0xfc,0x01,0x00,0x01,0x00,0x01,0x08,
0x3f,0xfc,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x04,0x7f,0xfe,0x00,0x00,0x00,0x00, /* —主—*/
}
由于包括英文字母的ASCII码只有127个,字模占的空间很小,所以每次字库生成之后首先生成常用ASCII码的字模。

当所有的字模提取完成后,重新扫描文本文件中的字符串,对字符串的字符重新编码,编码规则如下:
①占一个字节的ASCII码和占两个字节的汉字或特殊字符编码均以两字节编码,ASCII码的编码最高位为1,非ASCII码最高位为0,低15位为字符字模在字模数组中的位置;
②每个字符串以0xffff为结束符。

如“{主菜单}”的编码为:
const unsigned short strings[] =
{
0x804d,0x8061,0x8069,0x806e,0x8020,0x804d,0x8065,0x806e,0x8075,
0xffff, /* Main Menu */0x0002,0x0001,0x0000,0xffff, /* 主菜单 */
}
在生成重新编码的数组同时,以字符串标识生成每个字符串在数组位置的宏定义,如
TID_MAINMENU_E 0
TID_MAINMENU_C 10
2 不完整字库使用方法
当显示程序中所有字符串均重新编码后,显示程序即可方便地显示这些字符串,显示程序的流程如图2所示。

首先根据宏定义找到重新编码的字符串在字符串编码数组中的位置,其次读取每个字符的16位编码,根据每个编码的最高位和低15位确定字符在字模数组中位置并显示。

当读取到0xffff时显示结束。

3 结论
将不完整字库的生成程序作为嵌入式软件资源生成工具,无需使用字模提取软件提取程序中用到的每一个字符的字模,自动完成字模提取和字符串的重新编码,显示程序无需查找,可以直接定位字模位置,由于使用宏定义,不会降低程序的可读性和可维护性。

同时,目标代码中不包含任何字符串,增加了程序被反汇编的难度。

目前,该方法已成功应用于LPC2000系列和STM32F系列单片机显示程序的开发中,提高了开发效率。

参考文献:
[1]黄海宏,王海欣.液晶显示汉字的字模提取新方法[J].液晶与显示,2005,20(4):346~349.
[2]国家技术监督局.汉字内码扩展规范[S].1995.。

相关文档
最新文档