一种单片机不完整字库的生成和使用方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.