发布者: 未知 来源:网络
在智能仪表等小型单片机应用系统中,一般采用发光二极管作功能提示,数码管显示数据。随着智能仪表功能的不断扩充和提高,这种显示方式逐渐不能满足需求。为系统添加一片液晶显示器作为显示设备,显然能够很大程度扩展系统功能,提升产品的档次。若在液晶显示器上显示汉字信息,如果采用带汉字库的液晶显示器会有一些弊端:成本高,汉字大小固定,缺乏一些特殊的功能函数。针对这种情况,本文分析了一种低成本的汉字液晶显示实现方法,并给出了其C语言实现函数的源程序,以及汉字字符串提取程序和点阵字模提取程序的源程序。显示函数的实现中还重点设计了灵活的putchar函数,以便在程序中使用printf函数作为显示输出函数。
1 基本原理
这种低成本汉字液晶显示实现方法的基本原理是:采用一片图形液晶显示器作为显示设备,用软件实现汉字显示,汉字点阵字模直接从汉字库中提取出来后写到程序文件中。
整个实现过程包括以下部分;汉字字符串的提取;汉字点阵字模的提取;图形液晶显示器驱动程序设计;汉字显示函数及putchar函数的设计。
2 汉字字符串及点阵字模的提取
图形液晶显示器要显示汉字,必然需要汉字点阵字模,而要提取汉字点阵字模必须首先从程序中提取要显示的汉字字符串。一个汉字以两个字节的数据表示,这两个字节的数据有一个共同的特点就是数据最高位是“1”,这是与其他字符区分的重要特征。在C程序中,要显示的字符一般以双引号作为起始和终止,因此设计汉字字符串提取程序时只需要判断开始双引号和结束双引号之问的字符,将最高位为“1”的字符提取出来保存到另一汉字字符串文本文件中即可。C源程序FIND_CH.C,运行时可在命令行带多个C程序的文件名,输出汉字字符串文本文件到STRINGCH.TXT中。
汉字字符串提取出来后,就将针对这些汉字从字库中提取其对应的点阵字模了。在此之前,先要设计保存这些点阵字模数据的方式,即数据结构。图形显示的每一个点对应用一位表示,对于不同点阵的字库,需要的数据字节长度是不相同的:8×8的点阵英文字母需要8×8/8—8个字节;12×12的点阵汉字需要12×12/8=18个字节16×16的点阵汉字需要16×16/8=32个字节;24×24的点阵汉字需要24×24/8=96个字节。生成的点阵字模数据,可以用H头文件的形式存储,以上字库对应为:EN8X8.H;C12X12.H;C16X16.H;C24X24.H。文件中首先定义包含的汉字数目,例如C12X12.H中:
#define chl2x12_num 5
表明本12*12点阵字库中有50个汉字。因为只提取了需要的汉字字模数据,并且将重复的字剔除掉。为了方便索引,在汉字字库建立汉字GB码信息数组,将汉字GB码的两字节数据用unsigned int表示,例如C12X12.H中:
code unsigned int chl2x12_code[chl2x12一num]={0xalal,0xbaba,0xd7d6,0xd2ba,0xbea7},/*汉字液晶*/
注意:在数据中总要预留1个汉字的空格(Oxalal),以便在以后程序设计时遇到显示没有找到字模数据的汉字时,显示空格,它对应的数据是全空。在汉字GB码信息数据后注释行中写入了对应汉字,以方便阅读。
接下来的汉字点阵字模数据以二维数组表示:
code unsigned char ehl2x12_dat[ehl2x12_num][18]={
/*汉字12×12点阵库*/
{Ox00,0x00,0x00,0x00,0x00,0x00,0x00.0x00,Ox00.0x00,0x00,Ox00,0x00,Ox00,Ox00,0x00,0x00,0x00},
/*(BABA):88926418021e628262H0200201f20488884*/
{0x88,0x92,0x64,0x18,0x02,0xle,0x62,0x82,0x62,OxIf,0x02,Ox00,Ox20,Oxlf,0x20,0x48,0x88,0x84},
/*字(D7D6):0886828a8a8bcaaa9a82ca86f00000000408*/
{0x08,0x86,0x82,0x8a,0xSa,0x8b,0xca,0xaa,Ox9a,Ox82,0xca,0x86,0xf0,0x00,0x00,Ox00,Ox04,Ox08),
/*液(D2BA):88d22450e49c44a75c947404805f20508f88*/
{0x88,Oxd2,0x24,Ox50.0xe4,0x9c,0x44,Oxa7,Ox5c,Ox94,0x74,0x04,0x80,0x5f,0x20,0x50,0x8f,0x88},
/*晶(BEA7):00c0405fd51515d55f40c00000ff5555ff00*/
{0x00,0xc0,0x40.0x5f,0xd5,0x15,0x15,0xd5,0x5f,0x40,0xc0.0xOO,0x00,Oxff.0x55,0x55,0xff,0x00)
}:
为了方便阅读和使用,除了对每个汉字将其GB码写入注释外,还将其数据直接写到注释中。
提取字模程序的C源程序MK_CHIJlB.C,运行时除了在命令行参数中输入汉字字符串文本文件名之外,缺省字库16×16点阵,以参数S指定为12×12点阵,以参数H指定为24×24点阵。
笔者发现KeiI_C51(V7.O以前的版本)在编译时,字符串中汉字GB码第二字节如果为0xfd,会错误地被忽略,造成显示错误。因此,在汉字点阵字模数据头文件内的注释中,对应的GB码后加入了一个“!”,以提示程序员在C程序的字符串中以\x??\xfd替换相应的字符。
3 液晶驱动程序设计
以常用的12864液晶模块为例,它与51单片机的接口非常简单。一般12864模块接口信号线的功能如表1所列。
如果采用以上方法连接以后,编写驱动程序时就可用以下地址。
左右半部操作时:数据地址0xffff,状态地址0xfeff。
仅左半部操作时:数据地址Oxefff,状态地址Oxeeff
仅右半部操作时:数据地址0xf7fff,状态地址0xf6ff。
驱动程序除提供复位、开关显示、整屏填充、画点、读写显存等基础函数外,还提供了显示位置设定、英文显示、各点阵汉字显示、显示输出函数等。驱动程序源程序为kddrv.c及lcdd rv.h和deL_port.h。
4 汉字显示函数设计
C语言程序员都非常熟悉和习惯使用printf系统输出函数,在汉字显示函数设计时尽量利用printf函数的功能,方便程序设计。在Keil_C5l中,printf函数词用putchar函数完成数据输出,而缺省的putchar函数是将数据通过串口输出。我们可以通过设计自己的putchar函数来实现输出送到液晶显示。
在Keil-C51的LlB子目录下有一个putchal.c文件,提供了一个串口输出数据的putchar函数源程序。通过修改putchaI函数,设置一个标志变量,当需要将数据送液晶显示时,设置lcd_id=l,否则当Icd_jd=0时,数据仍然通过串口输出。
结语
通过以上介绍,从硬件接口、底层函数、高级函数等方面,完全实现了汉字液晶显示的整个过程。通过对整个过程及原理的了解,您可以很轻松地实现和修改液晶显示函数,以配合您的系统需要,以极低的成本获取较好的效果。