摘 要: 研究了图形液晶模块的汉字显示方法, 以8051 单片机为基础, 介绍了液晶模块与单片机的典型接口电路, 描述了通过外扩的EEPROM 存储汉字字模数据, 将其作为外部数据存储器进行寻址, 通过C51 程序详细介绍了使用方法。对于程序存储器和数据存储器分开寻址的单片机, 该方式能起到节省程序存储器, 扩大程序容量的作用。
1 引 言
液晶显示器件( LCD) 独具的低压、微功耗特性使它可以直接与大规模集成电路结合开发出一系列具有便携显示功能的产品。这些产品不仅改变了人类生活甚至也改变了社会。例如, 液晶显示的电子表、电子计算器已成为生活必需品, 而液晶显示的移动通讯已成为人类社会活动的必备工具。
常用的液晶显示模块分为数显液晶模块、点阵字符液晶模块和点阵图形液晶模块。图形液晶模块在我国应用较为普及, 因为中文不能像西文字符那样用字符模块即可显示, 要想显示中文必须用图形模块。
2 液晶模块显示汉字方法
使用图形液晶模块可以显示汉字和图形。以DG12864( 128×64) 液晶模块为例, 其内置的液晶显示驱动控制器为日本东芝公司的T6963C, 在液晶屏上横向8 个点为1 个字节数据, 每个字节在显示缓冲区内有对应的地址, 液晶屏幕的左上角横向8 个点对应液晶模块显示缓冲区的首地址。采用图形显示方式, 在液晶显示器上汉字用点阵来显示, 最常用的是16×16 的汉字, 一个16×16 的汉字用32 个字节表示, 这32 个字节存放方式如下所示:
而一个24 ×24 的汉字则需72 个字节, 存放方式如下:
其他规格的汉字存放方式依此类推。在液晶显示器上需显示汉字时, 只要将要显示的汉字的点阵按其存放方式依次写入液晶控制器的显示缓冲区即可。
通过单片机将已提取的汉字的字模输入液晶控制器, 即可按设定在液晶模块显示屏上显示汉字。常见的做法是事先通过字模提取软件提取要显示的汉字的字模, 将其作为常量数组存放在单片机的程序存储区内。以C 语言格式建立包含"合"和"肥"两字的汉字字模常量数组, 如下:
Code const char Hz-Dot [ ] = {0x01, 0x01, 0x02, 0x04, 0x08, 0x 10, 0x 2F,0xC0, / / 合0
0x00, 0x1F, 0x 10, 0x10, 0x10, 0x 10, 0x1F, 0x10,0x00, 0x00, 0x 80, 0x40, 0x 20, 0x10, 0xEE, 0x 04,0x10, 0xF8, 0x 10, 0x10, 0x10, 0x 10, 0xF0, 0x10,0x04, 0x 7F, 0x 45, 0x45, 0x45, 0x7D, 0x 45,0x45, / / 肥0x 20
0x45, 0x7D, 0x 45, 0x45, 0x 45, 0x45, 0x 54, 0x 88,0x04, 0xFE, 0x 24, 0x24, 0x 24, 0x24, 0x 24, 0xFC,0x04, 0x 00, 0x 00, 0x02, 0x02, 0x02, 0xFE,0x00} ;
每个汉字字模由32 个字节组成, 单片机通过接口电路, 根据规定的时序, 将要显示的汉字字模的所有字节按液晶控制器规定的方式, 按预定位置写入液晶控制器显示缓冲区即可。这种方式适用于程序不大或单片机无外部扩展数据存储区功能的情况。
采用哈佛结构的单片机, 如8051 单片机及其派生产品, 程序存储器( ROM) 和数据存储器( RAM) 可分别寻址, 8051 单片机ROM 和RAM最大的寻址空间均为64 K.通常来说, 对于中型的嵌入式系统, 尤其是带液晶模块的单片机系统,64 K 的程序空间并不富裕, 而将汉字字模作为常量数组会大大占用ROM 的空间。而相对来说,数据存储器只需几K 就够用了, 剩下很多空间可用于功能芯片的扩展。将提取的汉字字模数据存放在EPROM 或EEPROM 内作为扩展的数据存储器供CPU 调用, 则只要设定该芯片的片选地址, 并知道每个汉字字模数据在该芯片的存储位置, 通过程序计算出偏移地址, 即可实现同样的显示功能。
3 单片机通过EEPROM 调用汉字字模的方法
图1 是DG12864 液晶模块与8051 单片机的接口电路。在电路中, 地址线A13??A15 通过GAL16V8 译码得到外扩芯片的片选信号, 其中液晶模块的译码地址为0xE000, 将地址线A0 与液晶模块控制口的C/ D 相连。当A0 为低时液晶控制器接收数据, A0 为高时液晶控制器接收命令码。因此液晶模块数据端口地址为0xE000, 液晶模块命令端口为0xE001.采用Keil C51 进行程序设计, 在程序中可进行如下定义:
# define XBYTE ( ( unsigned char volat ile x data* ) 0)
# def ine Lcd-Data XBYT E[ 0xE000]/ / 液晶模块数据端口
# def ine Lcd-Code XBYT E[ 0xE001]/ / 液晶模块命令端口
存放汉字字模数据的EEPROM 芯片2864的片选地址为0x 9000, 则通过程序定义:
# def ine Hz-Dot 0x 9000
# define VBYTE ( unsigned char volatile x data* )
图1 51 单片机与液晶模块接口电路
编制16 ×16 汉字显示子函数Wr ite-Hz.其中要调用另外两个子函数Lcd-Wait 和Disp-address.Lcd-Wait 为读取液晶控制器是否忙函数, 而Disp-address 为液晶控制器显示缓冲区地址设置函数, 可根据液晶控制器资料编制。根据液晶控制器T 6963 的操作方法, 每次对液晶控制器进行读写时, 应执行Lcd-Wait 函数判断液晶控制器是否忙, 在将汉字字模数据写入液晶控制器显示缓冲区前, 应根据汉字在液晶屏上的显示位置设定写入数据的液晶控制器显示缓冲区地址, 具体Write-Hz 如下:
void Write-Hz( Uchar x ,U char y, Uint p) // 写汉字
// x , y 为汉字在液晶屏的显示位置坐标,
// p 为要显示的汉字在数组中的下标。
{
Uchar i, low-ad, hig h??ad;
Uint addr ess, tp;
address= ( Uint) x * Wide+ y ; / / * *
// 根据要显示汉字在液晶屏幕的横坐标和纵坐标
// 设定液晶控制器的显示缓冲区的偏移地址
tp= address;
for ( i= 0; i< 16; i+ + ) / / 写左半部
{
low-ad= ( Uchar) ( tp & 0x f f) ;
hig h-ad= ( Uchar) ( tp 8) ;
Disp-address( low-ad, high-ad) ;
/ / 设定写入地址
Lcd-Wait ( ) ;
Lcd-Data = * ( VBYT E( Hz-Dot+ p+ i ) ) ;
/ / 从EEPROM 中提取汉字字模
Lcd-Wait ( ) ;
Lcd-Code= 0xC4; / / 写数据命令
tp= tp+ Wide;
}
address+ + ;
tp= address;
fo r( i= 0; i< 16; i+ + ) / / 写右半部
{
low-ad= ( U char) ( tp & 0xf f ) ;
hig h-ad= ( Uchar) ( tp 8) ;
Disp-address( low??ad, high??ad) ;
Lcd-Wait ( ) ;
Lcd-Data = * ( VBYTE ( Hz-Dot+ p+16+ i) ) ;
Lcd-Wait ( ) ;
Lcd-Code= 0xC4;
tp= tp+ Wide;
}
}
函数Wr ite??Hz 的参数x 和y 对应液晶屏幕的显示位置, 以屏幕左上角为原点, x 为纵坐标, y为横坐标, 其在液晶控制器显示缓冲区中的地址通过行* * 计算出, 该行中Wide 为事先定义的液晶屏每行字节数, 对于DG12864 液晶模块而言,Wide 为16。
函数Write-Hz 根据16×16 点阵汉字在液晶控制器显示缓冲区的存放形式, 依次改变显示地址, 先将左半部1~ 16 个字节写入显示缓冲区, 再写入右半部17~ 32 个字节。设"合肥"两字存放在2864 中最前列, 则"合"字模首字节在2864 中的偏移地址为0, 共32 个字节, 紧跟在后面的肥!字模的首地址为0x20, 若要液晶模块显示合肥!两字, 只要在程序中带显示地址参数调用该函数即可。如:
Write-Hz( 0, 4, 0) ; / / 合
Write-Hz( 0, 10, 0x20) ; / / 肥
4 结 语。
本文介绍了图形液晶的汉字显示方法, 并以8051 单片机为基础, 结合液晶模块与单片机的典型接口电路, 叙述了使用EEPROM 或EPROM存放汉字字模的方法, 并给出C51 程序例子, 具有很强的使用指导性。