(单片机/FPGA)LCD1602基础理论

说明

        本文并非原创,而是结合了两篇博文,需要看两篇博文原创的可以直接点击本文最后的链接。

一、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的电位器调整对比度。
                       (单片机/FPGA)LCD1602基础理论_第1张图片
第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。   如图所示:

                                          (单片机/FPGA)LCD1602基础理论_第2张图片

二、基本操作与读写时序图:


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=高脉冲。输出:无。

读操作时序图

(单片机/FPGA)LCD1602基础理论_第3张图片

 写操作时序图:

(单片机/FPGA)LCD1602基础理论_第4张图片
 

时序时间参数:

(单片机/FPGA)LCD1602基础理论_第5张图片

 三、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).工作方式设置指令

(单片机/FPGA)LCD1602基础理论_第6张图片

×:这个位是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).显示开关控制指令

(单片机/FPGA)LCD1602基础理论_第7张图片

D=1:显示开,D=0:显示关。

C=1:光标显示,C=0:光标不显示。

B=1:光标闪烁,B=0:光标不闪烁。

说明:这里的设置是显示开,不显示光标,光标不闪烁,设置字为0x0c。

(3).进入模式设置指令

(单片机/FPGA)LCD1602基础理论_第8张图片

I/D=1:写入新数据后光标右移。

I/D=0:写入新数据后光标左移。

S=1:显示移动。

S=0:显示不移动。

说明:这里的设置是0x06。

(4).光标或显示移动指令

(单片机/FPGA)LCD1602基础理论_第9张图片

(单片机/FPGA)LCD1602基础理论_第10张图片

说明:在需要进行整屏移动时,这个指令非常有用,可以实现屏幕的滚动显示效果。初始化时不使用这个指令。

(5).清屏指令

(单片机/FPGA)LCD1602基础理论_第11张图片

说明:清除屏幕显示内容。光标返回屏幕左上角。执行这个指令时需要一定时间。

(6).光标归位指令

(单片机/FPGA)LCD1602基础理论_第12张图片

说明:光标返回屏幕左上角,它不改变屏幕显示内容。

(7).设置CGRAM地址指令

(单片机/FPGA)LCD1602基础理论_第13张图片

说明:这个指令在上面已经介绍过。用法在后面例子中说明。

(8).设置DDRAM地址指令

(单片机/FPGA)LCD1602基础理论_第14张图片

说明:这个指令用于设置DDRAM地址。在对DDRAM进行读写之前,首先要设置DDRAM地址,然后才能进行读写。前面我们说过,DDRAM就是LCD1602的显示存储器。我们要在它上面进行显示,就要把要显示的字符写入DDRAM。同样,我们想知道DDRAM某个地址上有什么字符,也要先设置DDRAM地址,然后将它读出到单片机。

(9).读忙信号和地址计数器AC

(单片机/FPGA)LCD1602基础理论_第15张图片

说明:这个指令用来读取LCD1602状态。对于单片机来说,LCD1602属于慢速设备。当单片机向其发送一个指令后,它将去执行这个指令。这时如果单片机再次发送下一条指令,由于LCD1602速度较慢,前一条指令还未执行完毕,它将不接受这新的指令,导致新的指令丢失。因此这条读忙指令可以用来判断LCD1602是否忙,能否接收单片机发来的指令。当BF=1,表示LCD1602正忙,不能接受单片机的指令;当BF=0,表示LCD1602空闲,可以接收单片机的指令。RS=0,表示是指令;RW=1,表示是读取。这条指令还有一个副产品:即可以得到地址记数器AC的值(address counter)。LCD1602维护了一个地址计数器AC,用来记录下一次读写CGRAM或DDRAM的位置。需要强调的是:这条指令我一次也没有执行成功。很多网友似乎也是这样。好在我们有另外的办法,也就是延时。通过查看每条指令的执行时间,再经过一些试验,可以确定指令的延时。这样就可以在上一条指令执行完毕后再执行下一条指令了。

(10).写数据到CGRAM或DDRAM指令

(单片机/FPGA)LCD1602基础理论_第16张图片

说明:RS=1,数据;RW=0,写。指令执行时,要在DB7—DB0上先设置好要写入的数据,然后执行写命令。

(11).从CGRAM或DDRAM读数据指令

(单片机/FPGA)LCD1602基础理论_第17张图片

说明: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

你可能感兴趣的:(硬件基础知识)