首页 » 通讯 » 透彻理解液晶显示模组LCD1602指令集与驱动编程(1)_地址_字模

透彻理解液晶显示模组LCD1602指令集与驱动编程(1)_地址_字模

落叶飘零 2024-10-02 14:27:21 0

扫一扫用手机浏览

文章目录 [+]

其实在博客园的博文中,我已经整理了一篇关于LCD1602的文章(原作者已不可考),从技能角度来讲,这篇文章写得还是不错的,该谈论的地方都涉及到了,对LCD1602显示有兴趣的读者可以去阅读一下。
但是大家可能都知道,曾几何时,某人曾经对兄弟夸了海口:要说写技能文章,我谁也不服(此剧情纯属虚构,如有雷同,实属巧合,哈哈~~)!
以是我决定百尺竿头更进一步,利用另一种办法来磋商它们,Let's Go Go Go, Fire in Hole,不好意思,走神了。

为了本文的完全性,我们大略先容一下HD44780中DDRAM的组织办法,如下图所示:

透彻理解液晶显示模组LCD1602指令集与驱动编程(1)_地址_字模 透彻理解液晶显示模组LCD1602指令集与驱动编程(1)_地址_字模 通讯

透彻理解液晶显示模组LCD1602指令集与驱动编程(1)_地址_字模 透彻理解液晶显示模组LCD1602指令集与驱动编程(1)_地址_字模 通讯
(图片来自网络侵删)

DDRAM(Display DataRAM)即“显示数据随机存取存储器”,一样平常我们简称为“显存”,大略的说,你往显存中写入什么,屏幕上就会显示什么。
显示位置(Display position)表示DDRAM地址对应的屏幕位置。
例如,显示位置1(屏幕左上角)对应DDRAM地址0x00(当然,这只是默认情形下)。

HD44780包含80个显存地址(第一行0x00~0x27、第二行0x40~0x67),也就意味可以显示最多80个字符。
但是,我们利用的LCD1602只能显示2行,每行16个字符。
换句话说,默认情形下,它只利用到了32个DDRAM地址(第一行0x00~0xF、第二行0x40~0x4F),相应的DDRAM地址与屏幕对应关系如下图所示(把稳:两行DDRAM地址不是连续的)。

例如,你想在LCD左上角显示内容,就该当把数据写入到DDRAM地址0x00中,如果想在LCD右下角显示内容,该当把相应的数据写入到DDRAM地址0x4F中。
总之,液晶显示屏上的内容与DDRAM地址是逐一对应的。

当然,我们往DDRAM中写入数据是字模的地址(而不是字模本身),详细屏幕上显示什么取决于字模地址中对应的字模。
HD44780芯片已经预定义了一些字模,它们保存在一个称为CGROM(Character Generator ROM,字符天生只读存储器)的地方,大略的说,CGROM便是一个字库,相应的字模如下图所示(当然,还有一个CGRAM,它许可用户自定义字模,后续有机会再谈论)。

利用CGROM中预定义的字模非常大略,只须要把字模对应的地址写入到DDRAM即可。
例如,你要显示小写字母“j”,我们就该当写入0b0110_1010(0x6A),个中0110表示高4位地址(Upper 4 Bits),1010表示低4位地址(Lower 4 Bits)。

好的,我们已经知道如何确定字模地址,那怎么来定位DDRAM地址呢?总不能乱写一通吧!
HD44780内部有一个地址计数器(AddressCount, AC),它保存的便是DDRAM(或CGRAM)的地址,我们通过指令就可以掌握详细访问的DDRAM地址。

咱们来看看HD44780数据手册定义的指令集,后续的单条指令截图都可以从这里查到,如下图所示:

首先我们来看看“功能设置(Function Set)”指令,它用来设置与硬件干系的配置,功能设置不当可能会导致数据传输或显示不正常,以是“功能设置”指令常日也是发送给LCD1602的第一条指令,个中包含DL、N、F三个配置位,如下图所示:

DL位(Data Length)选择数据总线的宽度为4位(DL=0)还是8位(DL=1),一样平常我们常用的还是8位总线。

N位(Number)表示一行(N=0)还是两行(N=1)显示(它们对应的DDRAM地址是不一样的,有兴趣可以参考数据手册查阅一行显示的DDRAM组织办法),LCD1602当然该当设置为2行显示。

F位(Font)表示显示的字体为5x8点阵(F=0)还是5x10(F=1),两行显示下只能显示5x8点阵,下图左侧给出了两种字体的差异(包含光标位置,右侧是光标闪烁时的状态转换)

我们决定利用8位数据总线给LCD1602发送数据,相应的指令该当为“0b11_1000(0x38)”。

然后我们可以利用显示开关掌握(Display on/offcontrol)指令,之以是紧赶慢赶地先谈论它,是由于只要精确利用该指令,就可以打开显示并开启(闪烁)光标。
在实际硬件调试时,能打开光标就意味着硬件的连接正常,且单片机往模组中写入的数据被正常吸收(即写数据的时序精确),至此显示模组的驱动过程基本上已经完成了一半,接下来便是逐个指令调试的过程了。

显示开关掌握指令可以设置D、C、B三位,HD44780数据手册对该指令的详细描述如下:

D位(Display)是显示开关掌握位,当D=1时显示开启,当D=0时显示关闭。
当然,该位状态并不影响DDRAM中已经写入的数据,如果你反复开启与关闭显示,DDRAM中的内容仍旧是不变的,由于实质上它只是掌握液晶屏驱动时序是否天生。

C位(Cursor)表示是否显示光标,当C=1时显示,当C=0时不显示光标。
B位(Blink)表示光标是否闪烁,当B=1时表示闪烁,当B=0时不闪烁。

假设我们须要打开显示,且开启光标闪烁,须要给HD44780的指令是什么呢?我们把显示开关掌握(Display on/off control)指令重新剪贴如下:

打开显示须要设置D=1,显示光标须要设置C=1,而让光标闪烁须要设置B=1,也便是说,我们须要给HD44780发送指令“0xF”。
我们来看看VisualCom软件平台相应的仿真效果,如下图所示

VisualCom软件平台中“内存”与“寄存器”窗口中的数据取决于详细的调入元器件类型,一样平常的显示掌握芯片(这里是HD44780)都会有,而像LED、数码管、按键之类器件则无。
VisualCom软件平台有一个非常实用的功能,便是预置数据,它可以给当前选择的器件预置一些数据或命令,当你运行仿真之后,器件会先实行预置数据。

我们先调入“LCD1602”仿真器件,右击后在弹出的快捷菜单中选择“预置数据”项即可打开如下图所示对话框。

对话框中有一个表格,你可以插入想要的数据行,“类型”栏中可以是数据或命令;“附加栏”是扩展项,对付HD44780是无效的;“十进制”与“十六进制”表示插入的详细数据或命令,两栏的数据完备一样,你往十进制写入15,十六进制中就会显示F,反之亦然,这可以方便不同的进制数据输入的场合;“自定义备注”栏可以为你插入的行做注释。

为了插入数据或命令行,你可以选择左下角的“插入数据”或“插入命令”按钮插入数据行,它们会在表格的结尾插入,你也可以右击后选择相应的选项,它可以在你点击的某行上方插入一行。
当然,也可以对数据行进行移动、删除等操作,此处不再赘述

我们先插入一条“功能设置指令”(0x38),再插入了一条“显示开关掌握指令”(0xF),然后点击“单步运行”按钮,就可以看到液晶显示模组的左上角涌现了一个闪烁的光标。
同时我们把稳到,“寄存器窗口”中的B、C、D位均为1。
光标的位置由地址计数器(AC)决定,由于AC=0,以是光标涌如今左上角。

实行“0xF”指令后还显示了两行字符“join weixin mp XXXXX”,我们可以查看“内存窗口”中对应的字模地址。
例如,0x01地址中数据为0x6A,也便是小写字母“j”的字模地址,其它依此类推。
我们买到的真实LCD1602模组当然不会显示这两行字,然而即便如此,我们常日也会习气利用一条清屏指令(Clear Display)打消屏幕的显示内容,由于上电之后DDRAM中的数据可能是乱码,相应的指令如下所示:

清屏,顾名思义,一旦实行该指令,屏幕上不会有任何内容显示。
实际上,清屏指令把所有DDRAM地址中的数据都设置为0x20。

有些人可能会想:为什么不全部设置为0x00呢?由于前面已经提过,DDRAM中的数据代表的是字模地址,而不是字模本身。
我们看看前面的CGROM字模表,0x20(0b0010_0000)恰好对应一个空缺的字模(实际上,0x20便是空格的ASCII码),这样也就可以打消屏幕显示。

我们在之前的预置数据后再添加了一条指令“0x1”,单步运行后的效果如下图所示:

可以看到,“内存窗口”中的有DDRAM地址的数据全部都修正为0x20,但是原来光标状态还是不变的,该显示的显示,该闪烁的还是闪烁,由于光标不属于显示内容,只不过其位置总会回到左上角(如果原来没在左上角的话),数据手册对此已经明确解释,如下图所示:

这段解释中还提到了I/D位(Increment/Decrement)与S位(Shift),这就要涉及到另一条“进入模式设置(Entry mode set)”,如下图所示。

前面我们不是说过,想往哪个DDRAM地址写数据就须要先设置AC吗?现在我们要写一行16个字符,如果每写一个字符都要利用指令设置一下DDRAM地址,是不是很麻烦?HD44780许可我们往(从)DDRAM地址写(或读)数据后,将AC自动加1(I/D=1)或减1(I/D=0),这样如果你要写一行字符,只须要确定首地址就可以了,是不是很方便?由于光标的位置取决于AC,如果光标显示已经打开,当你往DDRAM连续写入字符时,光标位置也会随之移动。

现在我们要从左上角开始写入字符串“dzzzzcn”,首先从CGROM字模表中找到小写字母“d”、“z”、“c”、“n”对应的字模地址分别为“0x64”、“0x7A”、“0x63”、“0x6E”、,然后在VisualCom软件中再接着添加7个预置数据,即“0x64”、“0x7A”、“0x7A”、“0x7A”、“0x7A”、“0x63”、“0x6E”,如下图所示:

运行后的效果如下图所示:

有人可能会想问:没看到你利用DDRAM地址设置指令呀?也没有利用“进入模式设置”指令设置地址增加模式,怎么它就会从左上角(0x00)开始写起呢?由于我们已经利用的清屏指令,它会把AC清零,并且它还会将I/D位设置为1(地址增加模式)。

S位用来掌握移屏功能的开启与否。
移屏是个神马东西?实在跟卷屏差不多,只不过卷屏常日是显示内容高下卷动,而HD44780只有两行,它的移屏方向要么左(I/D=1)要么向右(I/D=0),你想要开启它,只要将S位设置为1即可,数据手册解释如下:

把稳该段解释中有句话:如果S=1,看起来光标没有移动但屏幕移动了。
这是什么意思呢?我们仿真一下不就知道了,将预置数据修正如下:

我们只是在写数据前插入了一条“进入模式设置”指令(0x5),它打开了移屏功能,并且将I/D设置为0。
也便是说,每往DDRAM写一个数据,地址会自减1,而且会往右移屏。

我们来看看相应的仿真效果,如下图所示。

运行结果彷佛有点耐人寻味?怎么会是这样的呢?实在并没有错,由于我们设置了地址自减模式,而清屏后的AC=0,那么你再写一个数据,它减到哪里去了?就跳到第一行DDRAM的尾地址0x27(而不是0xF)。
我们前面已经提过,LCD1602只利用了32个DDRAM地址(第一行0x00~0xF、第二行0x40~0x4F),以是在正常情形下,当你往DDRAM地址0x27写入字模地址时,屏幕上是不会显示相应的字模,对不对?

但是由于你开启了右移屏指令,当你写第一个字母d的时候,AC指向了DDRAM地址0x27,同时往右移了一次屏,以是此时屏幕最左侧对应的DDRAM地址便是0x27(第一行)与0x67(第二行),而不再是原来的0x0与0x40,更不是正常情形下LCD1602最右侧对应的DDRAM地址0xF与0x4F。

当你全部写完“dzzzzcn”字符串后,光标所在的位置(AC)便是0x21。
也便是说,你写7个字符的同时也往右移了7次屏。
看到没有,光标原来的位置并没有改变便是这个意思。

如果我们把地址模式改为自加模式(“进入模式指令”为0x7),写入同样的数据会涌现什么结果呢?自加模式下为左移屏,每写一次数据左移一次,以是末了的结果该当是:从显示屏上来看,相称于什么都没写。
我们来看看仿真的结果,如下图所示:

彷佛跟清屏后的效果一样呀!
但是请把稳,现在的AC值为0x7,从“内存窗口”可以看到,DDRAM地址0x00~0x07中还是写入了“dzzzzcn”的字模,只不过由于写数据的同时往左移了7次屏,以是看起来彷佛什么都没写一样。

好的,剩下的指令我们后续有机会再来谈论吧,么么哒~~

标签:

相关文章