说明
? ? ? ? 本文并非原创,而是结合了两篇博文,需要看两篇博文原创的可以直接点击本文最后的链接。
一、LCD1602显示屏的具体引脚与基本配置
????????一般来说,LCD1602显示屏共有16个引脚,各个厂家的LCD1602可能略有不同,但基本上一样,其16个引脚具体如下所示:
LCD1602引脚
引脚号 | 引脚名 | 电压等级 | 功能 | 1 | VSS | 0V | 电源地 | 2 | VDD | +5V | 电源正极 | 3 | V0 | 0V | 电压偏置 | 4 | RS | H/L | 命令/数据 | 5 | R/W | H/L | 读/写 | 6 | E | H/L | 使能 | 7~14 | DB0~DB7 | H/L | 数据端口 | 15 | LEDA | +5V | 背光正极 | 16 | LEDK | 0V | 背光负极 |
?说明:
第1脚:?VSS, 为电源地。 第2脚:?VDD,接5V正电源。 第3脚:?VO,为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 ? ? ? ? ? ? ? ? ? ? ? ? 第4脚:?RS,为命令/数据选择引脚,接一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。 第5脚:?R/W,为读写信号线,接一个I/O,高电平时进行读操作,低电平时进行写操作。 第6脚:?E,为使能端,接一个I/O,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~?14脚:??DB0—DB7,并行数据输入/输出引脚(双向),可接单片机的P0—P3任意的8个I/O口。如果接P0口,P0口应该接4.7K—10K的上拉电阻。如果是4线并行驱动,只须接4个I/O口。 第15脚:A,背光正极,可接一个10—47欧的限流电阻到VDD。
第16脚:K,背光源负极,接VSS。? ?如图所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
二、基本操作与读写时序图:
LCD1602的基本操作,根据RS和RW引脚的0/1搭配,具体分为四种:
1. ? ?读取状态:输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。
2. ? ?读取数据:输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。
3. ? ?写入命令:输入RS=0,RW=0,E=高脉冲。输出:无。
4. ? ?写入数据:输入RS=1,RW=0,E=高脉冲。输出:无。
读操作时序图
?写操作时序图:
?
时序时间参数:
?三、3个重要的寄存器DDRAM、CGROM和CGRAM
(一)DDRAM
????????DDRAM相当于计算机的显存,我们为了在屏幕上显示字符,就把字符代码送入显存,这样该字符就可以显示在屏幕上了。同样LCD1602共有80个字节的显存,即DDRAM。但LCD1602的显示屏幕只有16×2大小,因此,并不是所有写入DDRAM的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不能显示出来
(二)CGROM和CGRAM
? ? ? ? 在LCD1602模块上固化了两个字模存储器——CGROM和CGRAM。
????????在字符产生器CGROM(Character Generator ROM)中,内置了192个常用字符的字模;
????????在CGRAM(Character Generator RAM)中,还有8个允许用户自定义的字符产生RAM。
????????从ROM和RAM的名字我们也可以知道,ROM是早已固化在LCD1602模块中的,只能读取;而RAM是可读写的。和CGROM中固化的字符不同,CGRAM中本身没有字符,所以要在DDRAM中写入某个CGROM不存在的字符,必须在CGRAM中先定义后使用。
????????也就是说,如果只需要在屏幕上显示已存在于CGROM中的字符,那么只须在DDRAM中写入它的字符代码就可以了;但如果要显示CGROM中没有的字符,比如摄氏温标的符号,那么就只有先在CGRAM中定义,然后再在DDRAM中写入这个自定义字符的字符代码即可。程序退出后CGRAM中定义的字符也不复存在,下次使用时,必须重新定义。
四、具体字符显示的实现
????????上图可知DDRAM一共有40个地址,但是对应于1602显示,只能有32个地址有效。这是因为1602可以显示上下两行,每一行显示16符号,一共显示32个符号,每个显示对应于DDRAM一个地址。例如,我需要在1602的第一行最左边显示一个字母A。首先找到第一行最左边对应DDRAM的地址是什么,查看上图可知是:00H,然后大写字母A对应于ASCII中为41H,此时我们只需要给DDRAM的00H地址写个数据41H即可显示了。
问题1:为何写个41H,就可以显示为"A"呢?
? 对于这个问题,就需要理解CGROM和CGRAM的作用。在芯片HD44780中内置了192个常用字符的字模,存于CGROM(character generate ROM)中,还有8个允许用户自定义字符(也就是可以显示八个中文字)的RAM,也就是CGRAM。具体描述为下图
? ? ? ??可以从上图分析A在字模中代码:高4位为0100,低4位为0001.所以组成8位就变成了41H,这就说明了为何写入41H就可以显示“A”。
????????上图红框里面表示为CGRAM,字模代码为:00H-0FH;ASCII的字模代码为:20H-7FH;日文和希腊字符的字模代码为:A0H-FFH;10H-1FH和80H-9FH没有使用。
问题2:如何任意显示一个字母,数字?
? ? ? ?这个问题是接着上面一个问题而言,具体就是:在1602中我要在某一行某个位置显示我想要的数字或是字母,我应该对应DDRAM地址写个什么样的八位数据?例如,我想显示“1”,那不是就写个01H呢?此时就需要一个思维转换,我们要显示的“1”不再是一个数据,而是需要转换为一个图案,可以看到上图有1的图案,该图案对应了31H,所以需要显示一个“1”,我们就需要给1602的数据总线(DB7--DB0)输入31H。
????????以此类推,例如我们需要输入kb129 is a good man,于是就需要给1602顺序输入:6BH,62H,31H,32H,39H ,20H(空格),69H,73H,20H,61H,20H,67H,6FH,6FH,64H,20H,6DH,61H,6EH。
问题3:如何显示汉字?
????????问题2中解决了显示任意一个字母和数字,但是汉字在图中找不到汉字,怎么办?这时候需要使用CGRAM了,先用字模软件,将对应汉字的变为二进制数。
????????例如我想要显示一个“电”字,由于1602中显示的图案为5*7或是5*10,所以在8*8中左边三列不能使用。得到8列八位数据:04, 1F, 15,1F, 15,1F, 04,07.
????????然后就需要将这8个8bit数据写入CGRAM中,写CGRAM需要使用指令:
????????可以设置地址指针自加一模式,所以如果我们想把“电”这个字方在第1个CGRAM中,也就是对应DDRAM中的00H,就需要将地址写为DB7--DB0:0100_0000.然后将数据04, 1F, 15,1F, 15,1F, 04,07依次写进CGRAM中。这样在CGROM字符的字模中00H就代表了“电”。
????????最后就是显示,也就是如果需要将“电”显示在1602中,就讲地址指针指向DDRAM,然后写数据为00H。
? ? ? ? ? ? ? ? ? ? ?
五、LCD1602指令
(1).工作方式设置指令
×:这个位是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。(注意:NF是10或11的效果是一样的,都是两行5×8点阵。因为它不能以两行5×10点阵方式进行显示,换句话说,这里用0x38或0x3c是一样的)。
(2).显示开关控制指令
D=1:显示开,D=0:显示关。
C=1:光标显示,C=0:光标不显示。
B=1:光标闪烁,B=0:光标不闪烁。
说明:这里的设置是显示开,不显示光标,光标不闪烁,设置字为0x0c。
(3).进入模式设置指令
I/D=1:写入新数据后光标右移。
I/D=0:写入新数据后光标左移。
S=1:显示移动。
S=0:显示不移动。
说明:这里的设置是0x06。
(4).光标或显示移动指令
说明:在需要进行整屏移动时,这个指令非常有用,可以实现屏幕的滚动显示效果。初始化时不使用这个指令。
(5).清屏指令
说明:清除屏幕显示内容。光标返回屏幕左上角。执行这个指令时需要一定时间。
(6).光标归位指令
说明:光标返回屏幕左上角,它不改变屏幕显示内容。
(7).设置CGRAM地址指令
说明:这个指令在上面已经介绍过。用法在后面例子中说明。
(8).设置DDRAM地址指令
说明:这个指令用于设置DDRAM地址。在对DDRAM进行读写之前,首先要设置DDRAM地址,然后才能进行读写。前面我们说过,DDRAM就是LCD1602的显示存储器。我们要在它上面进行显示,就要把要显示的字符写入DDRAM。同样,我们想知道DDRAM某个地址上有什么字符,也要先设置DDRAM地址,然后将它读出到单片机。
(9).读忙信号和地址计数器AC
说明:这个指令用来读取LCD1602状态。对于单片机来说,LCD1602属于慢速设备。当单片机向其发送一个指令后,它将去执行这个指令。这时如果单片机再次发送下一条指令,由于LCD1602速度较慢,前一条指令还未执行完毕,它将不接受这新的指令,导致新的指令丢失。因此这条读忙指令可以用来判断LCD1602是否忙,能否接收单片机发来的指令。当BF=1,表示LCD1602正忙,不能接受单片机的指令;当BF=0,表示LCD1602空闲,可以接收单片机的指令。RS=0,表示是指令;RW=1,表示是读取。这条指令还有一个副产品:即可以得到地址记数器AC的值(address counter)。LCD1602维护了一个地址计数器AC,用来记录下一次读写CGRAM或DDRAM的位置。需要强调的是:这条指令我一次也没有执行成功。很多网友似乎也是这样。好在我们有另外的办法,也就是延时。通过查看每条指令的执行时间,再经过一些试验,可以确定指令的延时。这样就可以在上一条指令执行完毕后再执行下一条指令了。
(10).写数据到CGRAM或DDRAM指令
说明:RS=1,数据;RW=0,写。指令执行时,要在DB7—DB0上先设置好要写入的数据,然后执行写命令。
(11).从CGRAM或DDRAM读数据指令
说明:RS=1,数据;RW=1,读。先设置好CGRAM或DDRAM的地址,然后执行读取命令。数据就被读入后DB7—DB0。
六、LCD1602一般初始换步骤(在FPGA里边必须初始化)
1.延时15mS 2.写指令38H(不检测忙信号) 3.延时15mS 4.写指令38H(不检测忙信号) 5.延时15mS 6.写指令38H(不检测忙信号) 7.以后每次写指令、读/写数据操作均需要检测忙信号 8.写指令38H:显示模式设置 9.写指令08H:显示关闭 10.写指令01H:显示清屏 11.写指令06H:显示光标移动设置 12.写指令0CH:显示开及光标设置 注意:11和12 两个顺序不能互换
链接1:https://blog.csdn.net/weixin_42168194/article/details/90277703 链接2:https://blog.csdn.net/qq_33231534/article/details/108484995
|