四、知识拓展
1. 点阵LCD的显示原理
在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(1字节)即可。而对于中文显示,常用的字符却有6000个以上,于是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码,而剩下的低128个数值则留给英文字符使用,即英文的内码。
得到了汉字的内码后,这仅是一组二进制数字,那又如何在屏幕上显示呢?这就涉及了文字的字模,字模虽然也是一组数字,但它的意义却与字码相比,有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文字母“A”在字模中的记载方式如图7.2所示,而中文的“你”在字模中的记载方式如图7.3所示。
图7.2 “A”字模图
图7.3 “你”字模图
2. 12864点阵型LCD介绍
LCD12864是一种图形点阵液晶显示器,它主要由行驱动器、列驱动器以及128×64全点阵液晶显示器组成,可实现图形显示,也可以显示8×4个汉字(16×16点阵),其接口引脚如表7.1所示。
表7.1 LCD12864的引脚说明
续表
在使用LCD12864前先必须了解以下功能器件才能进行编程。LCD12864内部功能器件及相关功能如下:
1)指令寄存器(IR)
IR用于寄存指令码,与数据寄存器数据相对应。当D/I=0时,在E信号下降沿的作用下,指令码被写入IR。
2)数据寄存器(DR)
DR是用于寄存数据的,与指令寄存器寄存的指令相对应。当D/I=1时,在下降沿作用下,图形显示数据被写入DR,或在E信号高电平作用下由DR读到DB0~DB7数据总线。DR和DDRAM之间的数据传输是模块内部自动执行的。
3)忙标志:BF
BF标志提供内部工作情况。BF=1表示模块在内部操作,此时模块不接受外部指令和数据;BF=0时,模块为准备状态,随时可接受外部指令和数据。
利用STATUS READ指令,可以将BF读到DB7总线,从而检验模块工作状态。
4)显示控制触发器DFF
此触发器用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY OFF),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。
DDF的状态是由指令DISPLAY ON/OFF和RST信号控制的。
5)XY地址计数器
XY地址计数器是一个9位计数器,高3位是X地址计数器,低6位为Y地址计数器。XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。
X地址计数器是没有记数功能的,只能用指令设置。
Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针范围为0~63。
6)显示数据RAM(DDRAM)
DDRAM是用来存储图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。DDRAM与地址和显示位置的关系见DDRAM地址表。
7)Z地址计数器
Z地址计数器是一个6位计数器,此计数器具备循环记数功能,用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器为0。
Z地址计数器可以用指令DISPLAY START LINE预置。因此,显示屏幕的起始行就由此指令控制,即控制DDRAM的数据从哪一行开始显示在屏幕的第一行。此模块的DDRAM共64行,屏幕可以循环滚动显示64行。
3. 12864LCD的指令系统及时序
该类液晶显示模块(即KS0108B及其兼容控制驱动器)的指令系统比较简单,总共只有7种。其指令如表7.2所示。
表7.2 LCD12864指令表
各功能指令分别介绍如下:
(1)显示开/关指令:
当DB0=1时,LCD显示RAM中的内容;DB0=0时,关闭显示。
(2)显示起始行(ROW)设置指令:
该指令设置了对应液晶屏最上一行的显示RAM的行号,有规律地改变显示起始行,可以使LCD实现显示滚屏的效果。
(3)页(PAGE)设置指令:
显示RAM共64行,分8页,每页8行。
(4)列地址(Y Address)设置指令:
设置了页地址和列地址,就唯一确定了显示RAM中的一个单元,这样MPU就可以用读、写指令读出该单元中的内容或向该单元写进一个字节数据。
(5)读状态指令:
该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下:
BUSY:1—— 内部在工作;0—— 正常状态;
ON/OFF:1—— 显示关闭;0—— 显示打开;
RESET:1—— 复位状态;0—— 正常状态;
在BUSY和RESET状态时,除读状态指令外,其他指令均不对液晶显示模块产生作用。
在对液晶显示模块操作之前要查询BUSY状态,以确定是否可以对液晶显示模块进行操作。
(6)写数据指令:
(7)读数据指令:
读、写数据指令每执行完一次读、写操作,列地址就自动增一。必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。