摘要:介绍一种基于AVR单片机和硬件汉字库的VRAM型彩色液晶显示模块的设计。给出彩色液晶显示器的显示原理、硬件接口设计框图以及硬件汉字库的制作和应用,同时给出基于C语言的程序设计模块,实现了应用VRAM型液晶的模块化,便于移植在其他类型的单片机。
1 引言
随着电子技术的飞速发展,越来越多的领域应用到以单片机为控制核心、用液晶作为显示终端的数字化设备。彩色液晶显示器作为当代高新技术的结晶产品,不但具有超薄平面、显示信息丰富、色彩逼真的特点,而且还具有体积小、耗电省、寿命长、无辐射、抗震、防爆等其他类型显示器无可比拟的优点,因而是工控仪表、机电设备等行业更新换代的理想显示器件。因此基于单片机系统的彩色液晶显示模块的使用也越来越广泛。本文介绍一种基于AVR单片机和硬件汉字库的彩色液晶显示模块,该模块实现了在彩色液晶显示器上显示不同颜色的中文、英文、数字及简单的画图功能。
2 液晶显示器显示原理
本模块采用的液晶显示器是河南友利华高科技有限公司生产的YD2502彩色液晶VRAM型显示器。它的点阵数是320×240,VRAM容量是64k×8 位,由于屏幕上的任何一点都是由R(红) 、G(绿) 、B(蓝)3种颜色组成,且灰度不可调节,因此显示颜色为8色。基本原理框图如图1所示。DC/DC转换器产生液晶所用各种驱动电压,DC/AC逆变器则用来点亮冷阴极背光灯,显示驱动逻辑电路采用了优化逻辑电路,利用分时技术让显示与写入数据同时进行,实现了画面的高速更新,且互不干扰。其显示原理是:在显示器内部含有一个显示缓冲区与屏幕显示一一对应,使用时只需向缓冲区里写入相应的数据,屏幕上即可显示出对应的彩色图形或文字,也就是说该显示器可作为单片机系统的一个外部存储器就可以实现彩色信息的显示。
图1 YD2502原理框图
3 硬件系统设计
3.1 硬件总体设计
本模块中使用的单片机是AVR系列单片机中功能最强的ATmega128 。该单片机具有丰富的片上资源如具有128kB在线可重复编程Flash、4kB的E2 PROM、4kB的内部SRAM、48个I/O端口、34个不同的中断源、可寻址64kB的地址空间、ISP下载以及JTAG仿真等功能。详细介绍请参考其数据手册。
图2是该模块硬件系统总体设计框图。由于YD2502的显示缓冲区里的内容是不能读出的,为了保存写入内容,在该模块中还外扩了一片存储器芯片61LV5128,其存储容量为512kB,除了保存YD2502显示缓冲区里的数据外,还为使用本模块的嵌入式系统提供了扩展应用。由于ATmega128的寻址范围只达到64KB,因此采用了分页管理技术来操作512kB的存储空间。在具体电路设计时,将ATmega128的PB3~PB0连接到61LV5128的高4位地址线上,将512kB的存储空间分成16页,每页32kB。硬件汉字库芯片AT29C040A的存储容量也是512kB,与CPU的接口设计与61LV5128是类似的,只需将片选信号和高4位地址线接在不同的I/O口上就可以了。
图2 硬件设计图
3.2 YD2502的接口设计
YD2502的接口方式采用总线方式,外部引线包括数据总线(DB7~DB0) 、片选信号(/CS) 、读写输入(/RD、/WR)和寄存器选择信号(RS),可以直接挂接到单片机的总线上,作为单片机的某部分内存来使用。接口采用16针插座,引脚定义请参阅其说明书。
根据YD2502可以作为单片机的外部存储器使用的接口特性,将ATmega128的读写信号线与YD2502的读写信号线直接连接,具体接口设计原理如图3所示。
图3 AT128与YD2502的接口
3.3 硬件汉字库的制作
本模块使用了硬件汉字库,省去了利用汉字取模软件获取点阵数据的麻烦,而且还避免了为保存这些数据而开辟的大量程序存储空间。
汉字库中要烧写的点阵文件是UCDOS软件中的文件HZK16,该文件是16×16的国际汉字点阵文件,文件中按汉字区位码从小到大依次存放国标区位码表中的所有汉字,每个汉字占用32字节,每个区为94个汉字。汉字库芯片采用的是AT29C040A,该芯片是ATMEL公司生产的512kB的Flash ROM。在制作时,烧写过程和普通的程序存储器的编程基本相同,只要注意选择正确的型号和在选择打开HZK16的方式时用二进制方式就可以了,编程校验成功后,取下备用,硬件汉字库芯片就制作好了。
实际上若显示HZK16的文件属性,其大小为262kB,而AT29C040A的存储容量为512kB,超出部分可以存储用户固定的汉字、字母和数字的代码,从而使显示内容更加灵活丰富。
4 软件系统设计及实现
4.1 操作YD2502的程序设计
YD2502的指令码格式如下:
其中:CA1,CA0组合功能为内部寄存器通道的选择,功能如下:
DISP:显示控制位。
当DISP设置为“1”时,液晶显示模块为开显示状态。
当DISP设置为“0”时,液晶显示模块为关显示状态。
X:表示未用位,可设为“0”。
ATmega128访问外部存储器的软件设计步骤是:先用extern声明一个外部变量,再用map2ping_init函数(外部存储地址分配函数)分配给此变量一个外部存储地址(因ATmega128内部有4kB的SRAM所以外部存储地址范围为1000H~0FFFFH),那么对该变量的操作就实现了CPU对相应地址的外部存储空间的访问。
根据此步骤,对YD2502写指令和写数据的具体函数如下:
写指令函数如下:
写数据函数如下:
除了上面两个基本的函数外,对YD2502最基本的操作是往VRAM 里写数据,根据上面给出的指令码,具体函数如下:
4.2 画点函数的实现
要在液晶上实现显示字符和画图等功能,在屏幕上显示一个点是实现这些功能的基础。画点函数实现的步骤是:首先确定该点对应的VRAM中的内存位置,找到该点具体对应的数据位,填充显示颜色的数据,该点就按对应的颜色显示出来了。
4.2.1 显示内存与屏幕点阵的对应关系
YD2502屏幕点阵为320×240,每一个点对应3个像素(RGB),屏幕上8个点对应内存3个字节,一行对应320/8×3=120个字节,其对应关系如下:
其中R,G,B表示红、绿、蓝三原色,D7~D0表示对应的数据位。
对于屏幕上坐标为(X,Y)的点,其对应内存地址的计算方法为:
当Y=0时 SRAM=0EFH×100H+[INT(X/8)]×3
当Y>0时 SRAM=(Y-1)×100H+[INT(X/8)]×3
通过(X/8)的余数得出具体的内存位置:
当余数为0 则 RAM=SRAM [1110,0000]
当余数为1 则 RAM=SRAM [0001,1100]
当余数为2 则 RAM1=SRAM [0000,0011]
RAM2 = SRAM + 1[1000 ,0000 ]
当余数为3 则 RAM = SRAM + 1[0111 ,0000 ]
当余数为4 则 RAM = SRAM + 1[0000 ,1110 ]
当余数为5 则 RAM1 = SRAM + 1[0000 ,0001 ]
RAM2 = SRAM + 2[1100 ,0000 ]
当余数为6 则 RAM = SRAM + 2[0011 ,1000 ]
当余数为7 则 RAM = SRAM + 2[0000 ,0111 ]
其中[ ]内为“1”的位表示应该填充颜色的位置,SRAM表示该点对应的基础地址,RAM、RAM1和RAM2表示该点对应的实际内存地址。
当数据位为“1”时,对应色点为亮;为“0”时,对应色点为暗。通过RGB三原色组合而得到的8种颜色代码如下:
例1:若X 、Y坐标为(7,0)
SRAM = 0EFH ×100H + 0 = 0EF00H
余数为7 ,则 RAM = 0EF00H + 2 = 0EF02H
若此点为红色,则送入0EF02H 内存单元里的数据为[ 0EF02H] &11111000B + 00000100B
例2 :若X 、Y坐标为(15,5)
SRAM = (5 - 1) ×100H + 1 ×3 = 403H
余数为5 ,则 RAM1 = 403H + 1 = 404H
RAM2 = 403H + 2 = 405H
若此点为白色,则送入这两个单元的数据为
[ 404H] &11111110B + 00000001B
[ 405H] &00111111B + 11000000B
4.2.2 画点函数的具体实现
从例1和例2可以看出,要只显示一个色点,就必须知道该点对应的内存中的数据,而前面提到过内存中的数据是不能读出的,所以要将写入内存中的数据先保存起来,即在向YD2502的显示缓冲区里写数据之前,应先将此数据写入61LV5128 。若在坐标(X,Y)处画颜色为color的点,其具体函数如下:
以上只给出了余数是0的情况,其他的情况可依此类推。计算内存地址的LCD_pixeladdr函数可根据给出的内存地址计算方法编写,读写61LV5128的read_exram函数和write_exram函数可根据具体的硬件设计编写,这里不再给出。
4.3 显示汉字和其他功能的实现
在屏幕上显示16×16点阵汉字的基本步骤是:首先取得该汉字的32个字节的点阵数据,再确定屏幕上显示的位置,利用画点函数即可显示该汉字。因本模块使用了硬件汉字库技术,所以汉字的点阵数据是从汉字库中获取的。
在计算机汉字系统中,汉字是用机内码的形式存储的,将汉字机内码减去0A0A0H就得到该汉字的区位码,通过区位码就可以找到该汉字点阵数据在汉字库中的位置。例如:汉字“中”的机内码是十六进制的“D6D0”,其中前两位“D6”表示机内码的区码,后两位“D0”表示机内码的位码。所以“中”的区位码为0D6D0H - 0A0A0H =3630H,将区码和位码分别转换为十进制,得汉字“中”的区位码为“5448”。即“中”的点阵位于第54区的第48个字的位置,在文件HZK16中的位置为第32×[(54 - 1)×94 + (48 - 1)] = 160928D以后的32个字节为“中”的点阵数据,用SUPER2PRO25编程器读入文件HZK16后利用其编辑功能中的缓冲区编辑查找到274A0H(160928D的十六进制表示)开始的32个字节:01H,00H,01H,00H,01H,04H,7FH,FEH,41H,04H,41H,04H,41H,04H,41H,04H,7FH,FCH,41H,04H,01H,00H,01H,00H,01H,00H,01H,00H,01H,00H,01H,00H。这些数据与其点阵图形的对应关系如图4所示,图中黑色方格表示二进制位“1”,即对应该显示的点,白色方格表示二进制位“0”,即不该显示的点。因此要在液晶屏幕上显示16×16点阵的汉字,首先应找到该汉字在硬件汉字库中的位置,取出其后的32个字节数据。取这32个字节数据的函数如下:
图4 汉字“中”的点阵图形
读AT29C040A的read_exrom函数可根据硬件设计编写,这里不再给出。
取得这32个字节数据后,下面的程序设计就比较容易了,这里只给出程序流程(如图5所示),具体函数可根据此流程编写。其中(X,Y)是该汉字显示的起始点,color是该汉字的显示颜色,number是该汉字在chinese数组中的位置。显示英文和数字的函数可根据显示汉字的函数稍加改造后即可得到,这里不再详细分析。
图5 显示一个汉字程序流程图
在本模块中也实现了在屏幕上画斜线、圆等功能,其具体实现过程就是在画点函数的基础上通过相应的算法来编写这些函数。画线和画圆算法比较多,在这里画线算法采用的是整数数字微分分析法,画圆算法采用的是贝森海姆算法。
鉴于篇幅所限,这里不再具体分析。由于YD2502是点阵式液晶显示器,还可以通过移植嵌入式GUI(如μC/GUI)软件,使其显示多种曲线,各种窗口对象,如按钮、编辑框、滑动条等更加丰富灵活的图形界面。
5 结语
以上程序均在ICCAVR编译器里调试通过,实现了在液晶屏幕上正常显示各种颜色的汉字、英文、数字及简单的图形功能。在笔者参与开发的油田探测爆炸机设备中,采用了本液晶模块,达到了显示稳定,显示色彩丰富,人机界面友好的较理想的显示效果。