电子DIY、Arduino、51单片机、STM32单片机、FPGA……
电子百科、开发技术、职业经验、趣味知识、科技头条、设备拆机……
http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect
1602液晶它也可以被叫做1602字符型液晶,这个是一种只用来显示字母、数字、符号等的点阵型液晶模块。1602里面存储器有三种:CGROM、CGRAM、DDRAM。
DDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下,如图1:
图1 数据地址和屏幕对应的关系
DDRAM其实就是我们平时说的PC机的显存,如果说我们想要在屏幕上显示我们想要显示的,直接把需要的字符代码送入现实就可以了,很简单就能够在屏幕上显示我们想要显示的。相同的LCD1602总共存在80个字节的显存,就是DDRAM。遗憾的是LCD1602显示不出来这么多的字符,正是因为这样,不是每一个写在DDRAM上的字符
都能够在显示器上显示出来,只有在上图提及到的才能够正常的显示,而上图未提到的则不能够显示出来。正是因为这样,我们在程序中可以利用下面的“光标或显示移动指令”使字符慢慢移动到可见的显示范围内,看到字符的移动效果。
那么如何在液晶上显示字符呢,就是把要写入的字符给DDRAM。举个例子,我现在想在屏幕上显示“A”,我就把我要的字符“A”的字符代码41H写入DDRAM的00H地址处然后得到。那我们应该怎么去写入呢,我们在后面经行及一步的阐述。我们下面将要介绍的是A的字模,如图2。
图2 A的字模
上面的图左侧显示的就是“A”的字模数据,上面的图右侧显示“○”代表0,用“■”代表 1。这样我们就能够显示出“A”这个字形。
在LCD1602模块上固化了字模存储器,就是CGROM和CGRAM,HD44780内置了192个常用字符的字模,存于字符产生器CGROM(Character Generator ROM)中,另外还有8个允许用户自定义的字符产生RAM,称为CGRAM(Character Generator RAM)。下图(字模表)说明了CGROM和CGRAM与字符的对应关系。从ROM和RAM的名称我们也可以知道,ROM是早已固化在LCD1602模块中的,只能读取;但是RAM即可以读又可以写。那么就是说,若是指要求在屏幕上显示CGROM中已经拥有的字符,那就仅仅需要在DDRAM中写入它的字符代码就可以了;若是说我想显示的是CGROM中不存在的字符,例如美元的符号,那就只能先在CGRAM中规定了,下一步再在DDRAM中写入我们之前自己定义的字符就可以了。但是相比于CGROM中固化的字符不一样,
CGRAM内自身没有任何字符,那就必须在DDRAM中写入一些CGROM没有的字符,一定要在CGRAM中首先把符号定义然后再去使用。程序退出后,CGRAM内之前定义的字符也会随着程序的退出而不再存在,若要是在使用的时候,就一定要重新定义。
那么如何在CGRAM中自定义字符呢?在上面的介绍中,我们知道如何设置CGRAM地址指令,同写DDRAM指令相似,只须设置好某个自定义字符的字模数据,然后按照上面介绍的方法,设置好CGRAM地址,依次写入这个字模数据即可。我们在后面的例子中再进行说明。如图3。
图3 设置CGRAM地址指令
1602使用三条控制线:EN、RW、RS。
他们当中EN的作用其实就是中线的功能,RW和RS指示了读、它写的是写的方向和内容。在读数据(或者Busy标志)期间,EN线必须保持高电平;而在写指令(或者数
据)过程中,EN线上必须送出一个正脉冲。RW、RS的组合一共有四种情况,分别对应四种操作:
RS=0、RW=0——表示向LCD写入指令。
RS=0、RW=1——表示读取Busy标志。
RS=1、RW=0——表示向LCD写入数据。
RS=1、RW=1——表示从LCD读取数据。LCD1602引脚定义如表3.2。
表3.2 LCD1602引脚定义
引脚号 |
符号 |
引脚说明 |
引脚号 |
符号 |
引脚说明 |
1 |
VSS |
电源地 |
9 |
D2 |
数据端口 |
2 |
VDD |
电源正极 |
10 |
D3 |
数据端口 |
3 |
V0 |
偏压信号 |
11 |
D4 |
数据端口 |
4 |
RS |
命令/数据 |
12 |
D5 |
数据端口 |
5 |
RW |
读/写 |
13 |
D6 |
数据端口 |
6 |
E |
脉冲使能 |
14 |
D7 |
数据端口 |
7 |
D0 |
数据端口 |
15 |
A |
背光正极 |
8 |
D1 |
数据端口 |
16 |
K |
背光负极 |
说明:
(1) 各部分功能:
①VSS接电源地
②VDD接+5V
③V0代表的是液晶上的偏压信号,它是能够接收10K的精准电位器。也可以说相同的阻值的RM065,RM063数据的蓝白是可以调节的。
④RS是命令/数据选择引脚,接单片机的其中一个I/O口。当RS=0,选择指令模式;RS=1,选择数据模式。
⑤RW为读/写模式选择引脚,接单片机的一个I/O口,
RW=0——写,向1602写数据或是指令。
RW=1——读,我们可以说是从1602读取信息也可以是说是状态,是没有必要进行读取操作,它能够直接接Vss。
⑥LCD1602执行命令的使能信号,接单片机的一个I/O口。
⑦D0~D7:LCD1602的并行数据输入/输出端口,能够接单片机上的所有的8位的I/O端口(P0~P3),要是说是接P0口的话一定要接一个8位的上拉电阻。当应用4线并行驱动模式的时候,只需接4个并行的I/O端口。
⑧A:背光正极,可以接一个10~47Ω的限流电阻接到VDD。
⑨K:背光负极,接VSS。
(2) LCD1602的基本操作
①读状态:RS=0,RW=1,E=高脉冲。输出:D0~D7为状态字。
②读数据:RS=1,RW=1,E=高脉冲。输出:D0~D7为数据。
③写指令:RS=0,RW=0,E=高脉冲。输出:无
④写数据:RS=1,RW=0,E=高脉冲。输出:无。
读操作时序如图4。
图4 读写做时序
写操作时序如图5。
图5 写操作时序
LCD1602液晶显示屏指令:
(1)工作方式设置指令,如图6。
Code |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
0 |
0 |
0 |
0 |
1 |
DL |
N |
F |
X |
X |
X:忽略,也就是说这个位是0或1都可以,一般取0。
DL:设置数据接口位数。
DL=1:8位数据接口(D7—D0)。
DL=0:4位数据接口(D7—D4)。
N=0:一行显示。
N=1:两行显示。
F=0:5×8点阵字符。
F=1:5×10点阵字符。
说明:正是由于是写指令字,那就是说RS与RW全是0。LCD1602仅仅能用并行方式驱动,并不允许使用串行方式驱动。而并行方式又可以选择8位数据接口或4位数据接口。这里我们选择8位数据接口(D7—D0)。我们的设置是8位数据接口,两行显示,5×8点阵,即0b00111000也就是0x38。
(2) 显示开关控制指令,如图7。
Code |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
D=1:显示开,D=0:显示关。
C=1:光标显示,C=0:光标不显示。
B=1:光标闪烁,B=0:光标不闪烁。
(3) 进入模式设置指令,如图8。
Code |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
(4) I/D=1:写入新数据后光标右移。
I/D=0:写入新数据后光标左移。
S=1:显示移动。
S=0:显示不移动。如图9,光标控制指令。
S=1 |
I/D=1 |
It shift the display to the left |
S=0 |
I/D=0 |
It shift the display to the right |
说明:这里的设置是0x06。
(5) 显示移动指令,如图10。
Code |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
0 |
0 |
0 |
0 |
0 |
1 |
S/C |
R/L |
X |
X |
(6) 清屏指令,如图11。
Code |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
(7) 光标归位指令,如图12。
Code |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
X |
说明:光标返回屏幕左上角,它不改变屏幕显示内容。
(8) 设置CGRAM地址指令,如图13。
Code |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
0 |
0 |
0 |
1 |
a |
a |
a |
a |
a |
a |
(9) 设置DDRAM地址指令,如图14。
Code |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
0 |
0 |
1 |
a |
a |
a |
a |
a |
a |
a |
(10) 读忙信号和地址计数器AC,如图15。
Code |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
0 |
1 |
BF |
a |
a |
a |
a |
a |
a |
a |
有很多人都会有这样的问题,就是执行一条指令的时候,从来都没有成功过。好在我们有另外的办法,也就是延时。通过查看每条指令的执行时间,再经过一些试验,可以确定指令的延时。这样就可以在上一条指令执行完毕后再执行下一条指令了。
(11) 写数据到CGRAM或DDRAM指令,如图16。
Code |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
1 |
D |
d |
d |
d |
d |
d |
d |
d |
d |
(12) 从CGRAM或DDRAM读数据指令,如图17。
Code |
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
1 |
1 |
d |
d |
d |
d |
d |
d |
d |
d |
1602LCD的一般初始化(复位)过程
延时15mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:显示模式设置
写指令08H:显示关闭
写指令01H:显示清屏
写指令06H:显示光标移动设置
写指令0CH:显示开及光标设置
它的特性有:
(1)3.3V或5V工作电压,对比度可调;
(2)内含复位电路;
(3)提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;
(4)有80字节显示数据存储器DDRAM;
(5)内建有192个5X7点阵的字型的字符发生器CGROM;
(6)8个可由用户自定义的5X7的字符发生器CGRAM。