设置jdialog显示在最前面_透彻理解液晶显示模组LCD1602指令集与驱动编程(2)

通过前一篇文章的学习,我们已经可以在液晶显示模组LCD1602上显示想要的字符,接下来就是逐条指令逐步调试的过程。在实际学习与应用时,新手工程师不可能从一开始就能够透彻理解每一条指令的细节,此时我们最好给LCD1602发送指令并且观察相应的显示效果,同时对照数据手册来理解指令的具体行为。

有些人老早就憋了一肚子话了:你丫的就只有从屏幕左上角开始显示字符本事吗?能不能把字符写在右上角,使字符串“dzzzzcn”的最后一个字母“n”恰好显示在液晶屏的最右侧呢?做到了我给你写个“服”字。

坦率的讲,我的本事的确不大,但是将显示位置加以修改这种“高难度”的操作还是难不倒我的,只需要使用“DDRAM地址设置(Set DDRAM address)”指令即可,如下图所示:

16678e94b9acef3116e3177cce49a806.png

可以看到,“DDRAM地址设置”指令的低7位是可以更改的,换句话说,这条指令可以设置的DDRAM地址有效范围为0x00~0x7F,总共128个地址。前面我们已经提过,HD44780内部DDRAM地址有80个,最大的地址为0x67,所以“DDRAM地址设置”指令可以指定80个DDRAM地址中任意一个作为数据写入的目的地。值得一提的是:设置DDRAM地址本质上就是设置AC(地址计数器)值,所以它同样也改变了光标的位置。

假设需要在右上角贴着右边界显示字符串“dzzzzcn”,应该设置的地址为多少呢?我们还是观察一下DDRAM地址与屏幕显示位置对应关系,如下图所示:

db9314be132e456f4491aa7c2536eed0.png

由于我们需要连续写入多个字符,所以只需要确定小写字母“d”的首地址即可,从上图可以看到,我们应该使用“DDRAM地址设置”指令将AC设置为“0x09”,然后连续写入“dzzzzcn”即可。但是需要注意的是,“DDRAM地址设置”指令的DB7位是为1的,所以应该写入指令应该是“0x89(0b1000_1001)”,我们来看看VisualCom软件平台中相应的预置数据:

a9299614ae3b0afe9b81a54373ccd074.png

我们只是在往DDRAM中写入字符串“dzzzzcn”之前,设置了DDRAM地址为0x09。另外,我们关闭了光标闪烁,这样就可以清楚地看到光标及所在位置显示的字符(光标闪烁状态下只能看到一个黑块,或只能看到显示字符),相应的仿真结果如下图所示:

cfbd1940790d09ddea8aaf42979c87a8.png

可以看到,此时AC值为0x10,它已经超出了正常情况下屏幕可以显示的区域(第一行最右侧DDRAM地址为0x0F),由于AC值同样也是光标地址,所以在屏幕上是看不到光标的。

尽管我很不愿意再次讨论类似“从屏幕左上角显示字符”的话题,以免让你太过于小看我。然而,佛家有云:我不入地狱谁入地狱!为了更全面地讨论HD44780的指令集,我毅然决定忍辱负重介绍另外一条可以让我们从左上角开始显示字符的指令,它就是“归位(Returnhome)” 指令,如下图所示:

05b6754874655430132477fbbf1aad57.png

由于DB0是无效的,所以“0x2”与“0x3”都可以作为归位指令。我们来看看执行这条指令后都做了什么,数据手册的说明如下:

1ad909532422bf65d3ee30ef51363302.png

可以看到,归位指令首先将AC清零,如果移屏了就恢复原位,也就意味着光标位置回到显示屏的左上角(也就是说,关于光标位置变化的描述其实是多余的)。

前面仿真结果中的光标不是不见了嘛?我们使用归位指令就可以把光标显示在左上角,只需要在前面的预置数据结尾再加一条命令“0x2”或“0x3”即可,相应的效果如下图所示:

2083332950ba18d07b24ad4d12e57352.png

注意到AC=0,所以光标在左上角,但是DDRAM中的数据与前图并无二致。

HD44780还有一条可能会引起初学者混淆的“光标与屏幕移动(Cursor or Display shift)”指令,顾名思义,它可以控制光标的位置与移屏量,如下图所示:

4168b1e1ceadc8bdb34f2e2f56fd2092.png

有人可能会想:前一篇文章不是已经介绍了“进入模式设置”指令吗?其中就有移屏S位呀!这条指令是不是重复了?非也!这里需要指出的是,“进入模式设置”指令中开启的移屏功能只有在往DDRAM中写入数据时才是有效的,而“光标与屏幕移动”指令是一条专门用于移动光标与屏幕的指令,每写一次指令就会引起一次光标与移屏的变化,S/C表示你想要移动光标(S/C=0)还是想移动屏幕(S/C=1),而R/L则表示想往左移(R/L=0)还是往右移(R/L=1),数据手册有对这两位组合的说明,如下图所示:

7caa4b43500df09e4735289359631a9f.png

假设我现在要使光标往右移一次,应该设置S/C=0(移动光标)与R/L=1(右移)。由于DB4为1,所以应该执行的指令为“0x14(0b0001_0100)”。(因为DB1、DB0无效,所以0x15、0x16、0x17与0x14的执行结果一样)

有心人可能会问:这条指令把光标移动了,那AC值是不是也发生了相应的变化呢?这是一个好问题!答案是肯定的。从上图中也可以看到括号中的说明:移动光标时,AC会自动累加或自减(AC isincremented/decremented by one)。反正我们始终要记往关键的一点即可:AC值代表着光标位置!就像只要学了九阳神功,神马龙爪手之类的少林绝学都是浮云,学其它神马武功也都不在话下,万变不离其宗,张无忌也忒厉害,武当山大展神威,太极剑以己之钝挡敌之无锋……

数据手册对AC的变化也有详细的说明,如下图所示:

59da06bc4599629d5741cd8f89eefecc.png

我们注意最后一句:如果你执行的只是移屏操作,AC值是不变的。这句话反过来理解就是:如果你执行的是光标移动,AC值也会有相应的变化。另外,我们还要注意一个细节:使用“光标与屏幕移动(Cursoror Display shift)”指令移动光标时,在两行显示模式下,如果光标增加到了第一行结尾(0x27),再执行该指令将会使光标移到第二行的开始(0x40),这与往DDRAM中写入数据而引起的光标变化是不一样的,因为这时光标总是不会换行。

前面我们已经通过返回指令把光标定位到了左上角,现在我要把光标定位到小写字母“d”的位置,应该怎么做呢?你当然再次可以使用“DDRAM地址设置”指令,这里毫无疑问的,但你也可以使用9次“光标与屏幕移动(Cursoror Display shift)”指令将光标往右移9次。我们在前面的预置数据后插入9次“0x14”命令,如下图所示:

b399debfc9bcd092a02e9593c64fa673.png

相应的效果如下图所示:

801a96b8e92efe84cbbcd952433adedf.png

移屏功能有时也很有用,例如我需要在屏幕上显示的数据超过了一屏(字模数量超过了32个),由于屏幕的限制,某一时刻只能显示一部分,所以我决定按一定的速度左右移屏以展示所有内容,如下图所示:

395897d386129e2b1880e3ca41f3e4a8.png

这种移屏效果使用以前介绍的“进入模式设置”指令不太好实现,因为它每次移屏需要往DDRAM中写入数据,当然,也并不是实现不了,只要我们设置好地址重新刷一遍相同数据就可以,但是如果使用“光标与屏幕移动”指令则要简单得多。

最后我们来分析数据手册自带的一个实例,如下图所示:

80ae435f9bd8f9f3ce28d2f14e6fe5ed.png

该案例中的全部指令我们已经全部详细讨论过,但请大家注意第3步,它打开了显示与光标(不闪烁),但是在此之前只执行了“功能设置”指令,那为什么光标却还在左上角呢?大家请看第1步说明:HD44780U在上电时会被内部复位电路初始化。初始化后是什么状态呢?数据手册说明如下:

29ca4ba36b303f240a616b9087145a88.png

看到没有,复位后会执行清屏指令,而我们前面已经提过,清屏指令会将AC清零,也就是把光标移到左上角,所以在第3步执打开显示与光标指令后,光标就显示在左上角了。

在写第二行数据时(第8步),该案例使用了一条“DDRAM地址设置”指令(0xC0),在第12步开启了移屏功能,此后我们每往DDRAM中写入一个数据,屏幕就会进行一次左移屏。最后使用归位指令取消了移屏状态,并且将光标显示在左上角。

需要特别注意的是:虽然数据手册已经说明上电会复位,并且给出了复位后的状态,但是在实际产品设计时,我们仍然还是会使用相应的指令重新设置一遍,毕竟你要考虑到芯片复位失败的可能性,产品稳定性的设计还是需要考虑的

我们也按照案例将指令输入到VisualCom软件平台,相应的预置数据如下图所示:

b11e19aaf4cfe3e8588c8eb7597a49fb.png

与案例有所不同的是,我们多添加了一条清屏指令,因为为了突显《电子制作站》,我们从库中调出来的器件已经初始化了“join weixin mp dzzzzcn”这几行字。另外,我们写的都是字符串“dzzzzcn”,我想你是能够理解的,么么哒。相应的效果如下图所示:

0c728f3cf78b84c3c3846475e5df5cdc.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值