您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
bd hd(透彻理解液晶显示模组LCD1602指令集与驱动编程(1))
地址,字模,数据bd hd(透彻理解液晶显示模组LCD1602指令集与驱动编程(1))
发布时间:2019-02-08加入收藏来源:互联网点击:
LCD1602可以说是大多数单片机工程师了解液晶显示的入门级模组,其显示原理与其它很多显示模组也是相似的,今天我们就来详细讨论一下它的指令集。所谓模组的指令集,本质上是该模组使用的控制芯片的指令集,本文主要讨论基于HD44780芯片的LCD1602。
其实在博客园的博文中,我已经整理了一篇关于LCD1602的文章(原作者已不可考),从技术角度来讲,这篇文章写得还是不错的,该讨论的地方都涉及到了,对LCD1602显示有兴趣的读者可以去阅读一下。但是大家可能都知道,曾几何时,某人曾经对兄弟夸了海口:要说写技术文章,我谁也不服(此剧情纯属虚构,如有雷同,实属巧合,哈哈~~)!所以我决定百尺竿头更进一步,使用另一种方式来探讨它们,Let's Go Go Go, Fire in Hole,不好意思,走神了。
为了本文的完整性,我们简单介绍一下HD44780中DDRAM的组织方式,如下图所示:
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。
上一篇:bb霜哪个牌子好(兰蔻、兰芝、巴黎欧莱雅,凭什么入榜bb霜十大品牌?)
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |