proteus仿真液晶显示教程 目录 1 LCD12864简介
2 LCD12864显示原理
2.1汉字和英文显示原理
2.2图形显示
2.3应用说明
2.4指令描述
3软件仿真
3.1汉字显示
3.2图形显示
3.3同时显示多个汉字
3.4向上滚动显示
4小结
1LCD12864简介- ST7920类 这种控制器带中文字库,为用户免除了编制字库的麻烦,该控制器的液晶还支持画图方式。该类液晶支持68时序8位和4位并口以及串口。
(2)KS0108类 这种控制器指令简单,不带字库。支持68时序8位并口。
(3)T6963C类 这种控制器功能强大,带西文字库。有文本和图形两种显示方式。有文本和图形两个图层,并且支持两个图层的叠加显示。支持80时序8位并口。
(4)COG类 常见的控制器有S6B0724和ST7565,这两个控制器指令兼容。支持68时序8位并口,80时序8位并口和串口。COG类液晶的特点是结构轻便,成本低。
ST7920 GND VCC V0 RS R/W E DB0-DB7 PSB RES VOUT BLA BLK
KS0108 GND VCC V0 RS R/W E DB0-DB7 CS1 CS2 RES VOUT BLA BLK
T6963C FG GND VCC V0 WR RD DB0-DB7 RS CS RES FS BLA BLK
S6B0724 GND VCC RS WR RD CS DB0-DB7 RES BLA BLK 12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。可完成图形显示,也可以显示8×4个(16×16点阵)汉字。 | | | | | | | | | | | | | | D/I=“H”,表示DB7∽DB0为显示数据 D/I=“L”,表示DB7∽DB0为显示指令数据 | | | R/W=“H”,E=“H”数据被读到DB7∽DB0 R/W=“L”,E=“H→L”数据被写到IR或DR | | | R/W=“L”,E信号下降沿锁存DB7∽DB0 R/W=“H”,E=“H”DDRAM数据读到DB7∽DB0 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
在使用12864LCD前先必须了解以下功能器件才能进行编程。12864内部功能器件及相关功能如下: 1. 指令寄存器(IR) IR是用于寄存指令码,与数据寄存器数据相对应。当D/I=0时,在E信号下降沿的作用下,指令码写入IR。 2.数据寄存器(DR) DR是用于寄存数据的,与指令寄存器寄存指令相对应。当D/I=1时,在下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7∽DB0数据总线。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行。 12864LCD的指令系统 模块控制芯片提供两套控制命令,基本指令和扩充指令如下: 指令表1:(RE=0:基本指令) 指 | 指 令 码 | 功 能 | 令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| 清除 显示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H" | 地址 归位 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | X | 设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容 | 显示状态开/关 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B | D=1: 整体显示 ON C=1: 游标ON B=1:游标位置反白允许 | 进入点 设定 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S | 指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位 | 游标或显示移位控制 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | X | X | 设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容 | 功能 设定 | 0 | 0 | 0 | 0 | 1 | DL | X | RE | X | X | DL=0/1:4/8位数据 RE=1: 扩充指令操作 RE=0: 基本指令操作 | 设定CGRAM 地址 | 0 | 0 | 0 | 1 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 设定CGRAM 地址 | 设定DDRAM 地址 | 0 | 0 | 1 | 0 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 设定DDRAM 地址(显示位址) 第一行:80H-87H 第二行:90H-97H | 读取忙标志和地址 | 0 | 1 | BF | AC6 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 | 读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值 | 写数据到RAM | 1 | 0 | 数据 | 将数据D7——D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM) | 读出RAM的值 | 1 | 1 | 数据 | 从内部RAM读取数据D7——D0 (DDRAM/CGRAM/IRAM/GRAM) |
指令表2:(RE=1:扩充指令) 指 | 指 令 码 | 功 能 | 令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| 待命 模式 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 进入待命模式,执行其他指令都棵终止 待命模式 | 卷动地址开关开启 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | SR | SR=1:允许输入垂直卷动地址 SR=0:允许输入IRAM和CGRAM地址 | 反白 选择 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | R1 | R0 | 选择2行中的任一行作反白显示,并可决定反白与否。初始值R1R0=00,第一次设定为反白显示,再次设定变回正常 | 睡眠 模式 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | SL | X | X | SL=0:进入睡眠模式 SL=1:脱离睡眠模式 | 扩充 功能 设定 | 0 | 0 | 0 | 0 | 1 | CL | X | RE | G | 0 | CL=0/1:4/8位数据 RE=1: 扩充指令操作 RE=0: 基本指令操作 G=1/0:绘图开关 | 设定绘图RAM 地址 | 0 | 0 | 1 | 0 AC6 | 0 AC5 | 0 AC4 | AC3 AC3 | AC2 AC2 | AC1 AC1 | AC0 AC0 | 设定绘图RAM 先设定垂直(列)地址AC6AC5…AC0 再设定水平(行)地址AC3AC2AC1AC0 将以上16位地址连续写入即可 |
备注:当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。 2、字符显示 带中文字库的128X64-0402B每屏可显示4行8列共32个16×16点阵的汉字,每个显示RAM可显示1个中文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。带中文字库的128X64-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及CGRAM(自定义字形)的内容。三种不同字符/字型的选择编码范围为:0000~0006H(其代码分别是0000、0002、0004、0006共4个)显示自定义字型,02H~7FH显示半宽ASCII码字符,A1A0H~F7FFH显示8192种GB2312中文字库字形。字符显示RAM在液晶模块中的地址80H~9FH。字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示。 80H | 81H | 82H | 83H | 84H | 85H | 86H | 87H | 90H | 91H | 92H | 93H | 94H | 95H | 96H | 97H | 88H | 89H | 8AH | 8BH | 8CH | 8DH | 8EH | 8FH | 98H | 99H | 9AH | 9BH | 9CH | 9DH | 9EH | 9FH | 2 LCD12864显示原理2.1汉字和英文显示原理 在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。 那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示:
图1 “A”字模图 而中文的“你”在字模中的记载却如图2所示:
图2 “你”字模图 根据芯片的不同取模的方式不同,有多种取模方式:单色点阵液晶字模,横向取模,字节正序,单色点阵液晶字模,横向取模,字节倒序,单色点阵液晶字模,纵向取模,字节正序,单色点阵液晶字模,纵向取模,字节倒序等等。 2.2图形显示 先设垂直地址再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址) 垂直地址范围 AC5...AC0 水平地址范围 AC3…AC0 绘图RAM 的地址计数器(AC)只会对水平地址(X 轴)自动加一,当水平地址=0FH 时会重新设为00H 但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需重新设定。GDRAM的坐标地址与资料排列顺序如下图:
2.3应用说明 用带中文字库的128X64显示模块时应注意以下几点: ①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。 ②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。 ③当字符编码为2字节时,应先写入高位字节,再写入低位字节。 ④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。 ⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。 2.4指令描述 1、显示开/关设置 CODE: 功能:设置屏幕显示开/关。 DB0=H,开显示;DB0=L,关显示。不影响显示RAM(DD RAM)中的内容。 2、设置显示起始行 CODE: 功能:执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。 3、设置页地址 CODE: 功能:执行本指令后,下面的读写操作将在指定页内,直到重新设置。页地址就是DD RAM 的行地址,页地址存储在X地址计数器中,A2-A0可表示8页,读写数据对页地址没有影响,除本指令可改变页地址外,复位信号(RST)可把页地址计数器内容清零。
DD RAM地址映像表 Y 地址 0 | 1 | 2 | ……………………… | 61 | 62 | 63 |
| DB0 ∫ PAGE0 DB7 | X=0 | DB0 ∫ PAGE1 DB7 | X=1 | ∷ ∷ ∷ ∷ |
| DB0 ∫ PAGE6 DB7 | X=7 | DB0 ∫ PAGE7 DB7 | X=8 |
|
|
|
|
|
|
|
|
|
4、设置列地址 CODE: 功能: DD RAM 的列地址存储在Y地址计数器中,读写数据对列地址有影响,在对DD RAM进行读写操作后,Y地址自动加一。 5、状态检测 CODE: 功能:读忙信号标志位(BF)、复位标志位(RST)以及显示状态位(ON/OFF)。 BF=H:内部正在执行操作; BF=L:空闲状态。 RST=H:正处于复位初始化状态; RST=L:正常状态。 ON/OFF=H:表示显示关闭; ON/OFF=L:表示显示开。 6、写显示数据 CODE: 功能:写数据到DD RAM,DD RAM是存储图形显示数据的,写指令执行后Y地址计数器自动加1。D7-D0位数据为1表示显示,数据为0表示不显示。写数据到DD RAM前,要先执行“设置页地址”及“设置列地址”命令。 7、读显示数据 CODE: 功能:从DD RAM读数据,读指令执行后Y地址计数器自动加1。从DD RAM读数据前要先执行“设置页地址” 及“设置列地址”命令。 8、屏幕显示与DD RAM地址映射关系 [td]
|
| Y1 | Y2 | Y3 | Y4 | ………… | Y62 | Y63 | Y64 |
| X=0 | Line 0 | 1/0 | 1/0 | 1/0 | 1/0 | ………… | 1/0 | 1/0 | 1/0 | DB0 | Line 1 | 1/0 | 1/0 | 1/0 | 1/0 | ………… | 1/0 | 1/0 | 1/0 | DB1 | Line 2 | 1/0 | 1/0 | 1/0 | 1/0 | ………… | 1/0 | 1/0 | 1/0 | DB2 | Line 3 | 1/0 | 1/0 | 1/0 | 1/0 | ………… | 1/0 | 1/0 | 1/0 | DB3 | Line 4 | 1/0 | 1/0 | 1/0 | 1/0 | ………… | 1/0 | 1/0 | 1/0 | DB4 | Line 5 | 1/0 | 1/0 | 1/0 | 1/0 | ………… | 1/0 | 1/0 | 1/0 | DB5 | Line 6 | 1/0 | 1/0 | 1/0 | 1/0 | ………… | 1/0 | 1/0 | 1/0 | DB6 | Line 7 | 1/0 | 1/0 | 1/0 | 1/0 | ………… | 1/0 | 1/0 | 1/0 | DB7 | ………… ………… ………… |
| X=7 | Line60 | 1/0 | 1/0 | 1/0 | 1/0 | ………… | 1/0 | 1/0 | 1/0 | DB4 | Line61 | 1/0 | 1/0 | 1/0 | 1/0 | ………… | 1/0 | 1/0 | 1/0 | DB5 | Line62 | 1/0 | 1/0 | 1/0 | 1/0 | ………… | 1/0 | 1/0 | 1/0 | DB6 | Line63 | 1/0 | 1/0 | 1/0 | 1/0 | ………… | 1/0 | 1/0 | 1/0 | DB7 |
| 3软件仿真3.1汉字显示 在Protues软件中选择所需元件,搭建的电路图如图1所示。
图1 仿真硬件原理图 将编写的代码烧写到单片机里,运行液晶显示不正常,如图2所示。
图2 运行图 开始我还以为是程序问题,把程序看了又看,改了又改,显示结果还是一样。后来问了下张勇生,出现这种情况的原因是P0口没接上拉电阻。因为P0口是开漏的,不管它的驱动能力多大,相当于它是没有电源的,需要外部的电路提供,绝大多数情况下P0口是必需加上拉电阻的。接上拉电阻后,重新运行这下运行正常了,如图3所示。
图3正常显示
由于本人开发实验板不同,对其修改如下:(详细代码请下载附件) 整个部件连接图,包括51最小系统,复位电路,还有无字库12864实际应用连接图,用标签连接的好处是(可观性),还有如需修改,改仿真图标签及keil 自定义标号即可
代码一座修改如下所示:(详细代码请下载附件)
3.2图形显示 我选了一张128x64的图片在字模软件中生产相应的C代码,将C代码写入到程序中。 由于液晶由两个控制芯片来控制,所以有片选信号端口CS1和CS2。我在字体显示程序中把改了显示那一块的代码,主程序中改了片选信号。开始同时将左右屏都开了,显示事,左右屏同时显示一样的图形,并且显示的图形不完整。主程序中显示部分的程序不对,我想了后,将主程序中程序改了一下,先开左屏调用左屏显示函数,在关左屏开右屏调用右屏显示函数。最后显示成功。如图4所示。
图4 图形显示 代码如下所示: 3.3同时显示多个汉字 用字模软件取模后通过改写软件,仿真图形如图5所示。
图5 显示多个汉字的仿真图 代码如下所示:(详细代码请下载附件)
3.4向上滚动显示 仿真图形如图6所示。
(a)第一次全部显示 (b)开始滚动显示
(c) (d) 程序如下所示: (详细代码请下载附件)
4小结 刚开始学液晶时感觉好难,字模就困扰了我好多天。通过看资料查资料,以及看程序搞懂了,通过写程序仿真,对液晶的控制更明白,主要写的是并行数据传输的代码。写了一个汉字的显示,多个汉字显示程序,图形显示的程序,还有汉字动态显示。由于取字模软件运行有点问题,左上角上自动多出一撇,所以显示字或图形的左上角多出一撇。后面写一个汉字一个汉字显示程序并仿真,还有波形显示程序和仿真。
完整资料下载(word格式 可编辑)还附带仿真和源码:
http://www.51hei.com/bbs/dpj-89569-1.html
|