大红鹰娱乐官网风格切换切换到宽版
  • 7763阅读
  • 7回复

[原创]LM1602学习 [复制链接]

上一主题 下一主题
离线mygoodplay
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2010-05-21
— 本帖被 renesasrulz 设置为精华(2010-05-21) —
搞了一天,终于搞好了,玩单片机快两年了,之前玩AVR的时候也有玩过,不过用于产品还真是头一回,各位见笑。
LCD的原理应该都了解了吧,说白一点就是LED,跟数码管的原理一样。就是在想要的地方显示就在对应的地方写1,不然写0,就是LED灯一样,给个High就亮,给个Low就灭。好了不说这个了,直接进入正题吧!^_^
       LM1602一般有14只脚,也有16只脚的,都一样,多出来的那两只接电源就好!
       14只脚现在D0~D7,VSS,VDD,VO,RS,R/W,E.
       D[0..7]就是数据总线,LM1602支持8bit D[0..7],也支持4bit D[4..7]。
       VSS就相当于GND,VO用于调整LM1602的亮度,关键的信号就是RS,R/W,E这三个跟写程序密切相关。下面重点讲述一下:
       RS:定义该数据是指令还是普通数据。(0:command,   1:data)
       R/W:读写信号控制。(0: write     1: read)
       E:     信号使能,你可以看成是锁存信号,当E从High到Low时,LM1602模块就会接受数据(如果当前总线上是CMD,完了就会去执行命令相应的动作,比如清屏,如果当前总线上是data,LM1602就会把数据存起来,至于存在哪里下面会提到)
       LM1602的基本操作其实可以这样认为,就是初始化好之后,把CGRAM跟DDRAM定义好之后,MCU负责的事情就是只要往DDRAM里面写东西就好,LM1602内建的MCU会自动去CGRAM里面找相应的字符(内建的字符库)。
       对于CGRAM,跟DDRAM,我们可以这样去理解,CGRAM就是LM1602内部的字符库,提供了一些常用的字符定义,用户可以直接拿来用,而且很多跟我们常用的ASCII是一致的,不过他也允许我们自定义,当然数量不是很多。而DDRAM就是LM1602显示在屏幕上的,可以认为是显存。我们在定义好DDRAM的地址后,写进去就会显示出来了。这些只是普通的功能,一般的用户了解这些就可以驾御它了,想要更进一步了解就要看你自己的兴趣跟需要了。
       下面重点讲讲8bit与4bit的差异:
       8bit操作起来会比较简单,4bit的其实也不难,稍稍会复杂一些,但想想能省下4只脚,心里是不是觉得暗爽?
       正常流程在写命令前先读状态,如果LM1602的BF为0则可以写入下一条命令,不然写了也白写,得不到你想要的结果,因为LM1602在BF=1时,是不会响应你的CMD跟DATA的。其余也没什么好说,要照着时序去写,没什么问题。
       需要特别注意的是,4bit总线宽度时,先写高4位,后写低4bit,读也是,先读出来的是高4位,然后再读出低4位,所以在写命令前的判断BF时,要读两次,才可以读到正确的状态,这一点很重要。
       显示自定义也一样,因为我们能用的只有8byte,即从0x00~0x07,你用这几个值去设定CGRAM,然后往里面写8个data,这8个data中只有低5位是有效的(我的格式是5x8,当然也可以5x10),这8个data对应1byte,所以比如我们可以设定CGRAM(CMD)为0,然后写个64个数据(8个字节全部指定),然后再设定欲显示的坐标DDRAM(CMD),然后再写入0,即会显示出你刚刚定义在CGRAM中位置为0的字符形状(5x8格式),写入1就会显示出刚刚定义在CGRAM位置0x1的字符形状,依次类好了到此为止,你是不是已经成功了呢?
 
高级功能:(动态显示)
       如果想让屏幕动起来,那就要用到Cursor or Display Shift。写入这个命令就会在不更改DDRAM的DATA情况下,对屏幕做一个动态的显示行为,可以只针对Cursor也可以针对Display的数据。
       我们可以这样操作,将欲显示的数据写入DDRAM的data中,超出屏幕显示部分也没有关系,只要不超出整个范围就OK
比如LM1602一行只能显示16个5x8dot的字符,我们可以一次性写入超过16个字节的,之后再写入移动命令就可以让之前超出显示区域的显示出来。左移右移都可以,总之可以尽情地发挥您的想像去驾驭它吧。
 
对LM1602的总结及联想
        由于LM1602不带颜色(黑白两色),屏幕上的每个dot只有亮灭两种状态,所以用1bit即可以用来表示。由此我们不难联想到,如果我们用1byte来表示1个dot(用1pixel表达更为准确),就可以在该点处表示256种颜色了,也就是类似于8bit的BMP图片就可以显示了。如果用2byte,4byte等就可以表示更多,更炫,更接近与现实的颜色。当然相应LCD内置的ASIC就需要更高的带宽,更大的显存,更快的速度。
2条评分
su37sm 铜币 +20 优秀文章 2010-05-21
renesasrulz 铜币 +10 优秀文章 2010-05-21
http://gyd861024.blog.163.com/
离线renesasrulz

只看该作者 沙发  发表于: 2010-05-21
很久没看到这么精彩的文章了,顶一个。

广告招租

email: admin@renesas-mcu.com
QQ: 2020832894
离线mygoodplay

只看该作者 板凳  发表于: 2010-05-21
谢谢版主,
搞了我一天半的时间。
让过来人指出我的不足,
同时也让后人少走点弯路!
http://gyd861024.blog.163.com/
离线bylandele

只看该作者 地板  发表于: 2010-05-21
离线renesasrulz

只看该作者 4楼 发表于: 2010-05-21
楼主很用心。

广告招租

email: admin@renesas-mcu.com
QQ: 2020832894
离线su37sm

只看该作者 5楼 发表于: 2010-05-21
学51的时候玩过。然后再也没玩了
离线mygoodplay

只看该作者 6楼 发表于: 2010-05-21
呵呵,谢谢各位
http://gyd861024.blog.163.com/
离线happyalan

只看该作者 7楼 发表于: 2010-06-08
呵呵,写软件,还是要先画流程图(复杂些的),这样,流程清楚了,软件就成型了,debug就很简单了,写软件本身没有什么高深学问,良好教育的高中生就够了.所有,关键的是解决问题的方法,为什么这么做,及怎样做,完成转换到MCU可执行的流程,这才是软件的灵魂.
博聚网