基于AT89C52的液晶显示的实现
扫描二维码
随时随地手机看文章
1 引言
随着单片机应用领域的不断扩大,用单片机控制汉字显示已成为一种单片机发展的必然趋势。以前那种将汉字点阵编码存入ROM ,在显示时再调用的方法已经不能适应当前的需求。好的应用所能显示的决不能仅仅局限于显示事先定义好的个别汉字,而应该提供直接使用至少包含国家标准的一、二级汉字字库的功能。
2 芯片器件介绍
2.1 AT89C52单片机
AT89C52单片机是EPROM型单片机,可寻址64KB字节的程序存储器和64KB字节的外部数据存储器。
以单片机为核心,配以一定的外围电路和软件,实现某些功能,就组成了单片机应用系统。
2.2 液晶显示模块
我们选用北京精电蓬远公司的VPG12864T液晶显示模块,内置T6963C控制器,实现了T6963C与行、列驱动器及显示缓冲区RAM的接口,带有LED边光/底光,温度范围较广,属宽温型,无须外部提供液晶驱动电压,点阵数为128×64,支持图形、文本以及图文合成方式的三显示方式,且T6963C带有内部字符集。
液晶模块与微处理器MPU的接口电路有两种方式:一是直接访问方式,将AT89C52数据口P0直接与液晶模块的数据口连接;二是采用间接控制方式,MPU通过I/O并行接口,模拟液晶模块的时序,间接实现对液晶显示模块的控制。本文讨论的实现方法采用第一种方式。
2.3 字库芯片
字库芯片采用具有256K空间的可编程ROM芯片都可以,我们采用了ATMEL公司的AT27C020芯片,其中烧录含有国家标准的一、二级汉字的16×16点阵字库。
汉字点阵在字库中的首地址由如下公式计算:
起始地址=[(区号-1)×94+(位号-1)]×32
自此起始地址起的后续32个字节就是该汉字的字模数据。从字库芯片中的32个字节的字模数据按下表排列构成汉字:
其中,汉字由两字节ASCII码组成,分别减去0xA0即得到该汉字的区号和位号。这样就可以直接由汉字的ASCII码来计算该汉字在字库中的地址:
起始地址=[(第一字节-0xA1)×94+(第二字节-0xA1)]×32
由于AT89C52最大寻址64K空间,所以在实现时将AT27C020分成多页,每页的空间不大于64KB,页号通过译码器的有效输出或其他扩展方式确定。
3 硬件线路设计
AT89C52与字库芯片AT27C020及液晶显示模块VPG12864T的接口逻辑如图1所示:
图2 硬件逻辑接口
由于AT89C52的最大寻址空间为64K,而AT27C020的空间为256K,因而要对寻址进行扩展。地址扩展的方式有两种,一种是利用MPU的IO口进行扩展,AT27C020的低16位地址直接与MPU的地址线相连,而高2位则需进行地址扩展,上图中AT27C020的A16和A17分别接到AT89C52的P1.6和P1.7,片选信号CE接到P1.5上,此时寻址的页大小为64KB(页大小还可以根据需要设置为32KB,16KB等)。寻址由软件编程来实现,例如要读38400H单元的内容,可由下列程序实现:
此种方法实现起来简单明了,不需额外的硬件,缺点是占用MPU的IO资源较多,适用于IO资源有富余的情况。在笔者的应用中,MPU的IO需要余留给其他应用,不能分配这么多的IO来,故采用另外一种方法,由硬件逻辑实现,见图3:
本例中的页大小为32KB。AT27C020的片选信号CS1由地址线A15产生(即A15连到片选信号CE上),如要读38400H单元的内容,先由程序产生高位地址AA17、AA16、AA15。对字库芯片寻址时,先产生页地址,再进行页内寻址,利用此种方法可进行多位地址的扩展。举例如下:
4 软件的实现与控制
VPG12864T液晶模块的系统指令集其实就是T6963C控制器的指令集,模块的初始化设置一般都由管脚设置完成。T6963C的指令可带一个或两个参数,或无参数。每条指令的执行都是先送入参数,再送入指令代码,且每次操作之前要进行状态字检测。T6963C的状态字如下说明。在处理显示操作时,首先要指定字符串、文字段的有效显示位置。
STA0:指令读写状态
STA1:数据读写状态
STA2:数据自动写状态
STA3:数据自动读状态
STA5:读/写出错状态
STA6:运行控制器检测
STA7:闪烁状态检测
另外STA4保留.
4.1 显示字符
VPG12864T液晶模块字符的显示有两种实现方式,一是利用T6963C提供的字符集,另一种方法是将字符的点阵数据存放在ROM内,需要时以图形方式显示。当电路驱动能力不够时,可以采用第二种方式。字符显示相对比较简单,在这里不做详细描叙。
4.2 显示汉字
处理汉字显示时,由于VPG12864T液晶模块是128×64点阵的,所以显示16×16点阵的汉字一行最多显示8个,且最多显示4行。对于每一个汉字的显示,首先应该计算该汉字在字库中的地址,然后读出该汉字的点阵排列。当显示至一行的末尾时要换行显示。在处理汉字显示时有两种方法:一是一次只显示一个汉字,即对于每一个汉字,先计算出此汉字地址,读出其点阵数据,显示完毕再处理下一个汉字,直到处理完所有的汉字;第二种方法是将所要显示的所有汉字的点阵数据从字库中读出存放外部RAM中,再集中处理显示的问题。本文讨论的是后一种方法。
字符半角码与全角码有如下的对应关系:
半角字符对应的全角字符的起始地址的计算公式:
起始地址=[(2×94+(ASCII-0x21))×32
汉字显示处理的流程如下(用“#”作为显示汉字段的结束标志):
在处理汉字显示时,如果要实现汉字的反显(例如实现菜单操作),将汉字的32字节字模数据分别与0xFF异或(XRL)运算,或者取反(CPL)运算后再显示即可。
4.3 实现进度条和动画
进度条显示的原理就是在连续的位置不间断地显示一些点阵,来表示某事务的完成进度。实现进度条的程序如下。程序中用R1、R2记录点阵数据,RLEN记录显示的进度条长度范围。
上面的程序段中,ST01是判STA0、STA1状态的子程序;DELAY是延时子程序,具体应用时可根据需要设置延时的时间;C_ADD=8100H,表示指令通道地址,D_ADD=8000H,表示数据通道地址。
显示动画的与显示进度条原理大致相同,不同的是进度条在不同位置显示,而动画则在同一个位置交替显示不同的点阵。动画显示的例子略。
5 结束语
本文是我们实际工作的经验总结,所给的程序都调试通过,希望能够给你的开发带去一点启发。