先来看看LCD1602什么意思?Liquid Crystal Display(LCD)表示液晶显示,1602 表示一行可以显示16个字符,一共有两行。
现在我们来看看如何使用简单的IO控制和延时来实现操作LCD1602液晶模块。既然是用单片机控制LCD1602,那么根据前面的分析,首先要搞清楚谁是控制对象,谁是被控制对象。很显然,LCD1602是被控制对象,那么我们就先从LCD1602开始分析。所谓控制也可以理解为沟通,比如你与室友沟通,希望他帮你买瓶绿茶,那么就表示至少你的室友能听懂你的“指令”,能知道绿茶是什么,如何去买等等信息。好了,那么如何与LCD1602沟通呢?可以想一想,平时人与人是如何沟通的?沟通之前先要打个招呼吧,比如“你好”之类的,电话里面要先讲个“喂?”,确定通迅正常了之后才进入沟通正题了,很少有人打电话一上来就开始“哇哇”的说,万一说了半天发现信号还没连上呢,那不是白讲了。其实单片机与LCD1602的沟通方式也一样,电话中使用的“喂?”在我们这里其实就叫初始化。后面也会经常碰到这个“初始化”的概念。其实器件也是人设计的,所以他的工作方式从某种程度上讲,也是人的沟通方式。打完招呼后,就开始进入真正主题了。什么主题呢?LCD1602是显示模块,主要作用当然是显示了。既然是显示,我们可以想一想,无非就是两个内容:
(1)你想要显示什么内容?
(2)你打算在哪里显示?
很明显,这两个内容都是来自于单片机的控制,单片机让它显示什么它就显示什么(叁议电子)。这个‘显示什么’就是传送的数据。那么怎么往LCD1602模块传送数据呢?前面讲了,LCD1602表示2行16个字符,也就是有不同的显示地点,那么单片机如何告诉LCD1602的显示地点呢?因此前面的分析可以总结为三个问题,如何初始化;如何传送显示的内容(显示什么);在哪里显示。这三个问题如何解答呢?当然要去看LCD1602说明手册了。
为了解决这三个问题,我们还是先来看看人与人之间是如何沟通的,如果当面沟通,你的信号(声音)能够直接传到对方,而且能让对方听懂。如果相距比较远,那么就使用电话等通信工具。前者信号传递载体是空气,后者是电话线。那么我们来看看MCU与LCD1602的信号传递载体是什么样的,这就需要去查看原理图了。
如图3-1所示,LCD1602一共16个引脚,其中引脚1,2,15,16是与电源相关的,我们不去理它。另外引脚3连接到了可调电阻Rv1,用于液晶模块背光调节的,这里也暂且不管。我们现在关心的是与信号传输相关的引脚,很明显与引脚4到引脚14有关。从图中我们看到,单片机通过P4.1,P4.4,P4.5分别与RS,RW,EN连接,P2端口与D0到D7连接,一共10根线。那么也就是说,单片机的所有指令,数据等都是通过这10根线来完成的。怎么样去控制LCD呢,当然是阅读LCD的说明手册。这里来个比喻,房间内一个人规定,敲三下门,屋内的人才把门打开。如果你要进入屋内,就必须敲三下,如果你不知道这个规则,敲了四下,或者大喊大叫,门也开不了。这里要说明什么意思?当你要与某个器件沟通的时候,你必须严格按照这个器件的规则来操作。比如一个德国人只会讲德语,如果你想与他沟通那么你就只能和他讲德语了。如果你讲汉语,他讲德语,这就乱套了,信息无法传递(www.ppptalk.com)。这个时候,你可以选择会讲汉语的德国人沟通,也就是换一个沟通对象。同样的,如果你觉得某个器件操作起来太麻烦,那么你可以更换另外一个具有同样功能能满足你使用要求的器件来代替。但是,一旦你选定了某个器件后,你必须100%的按照“这个器件的使用规则”来操作。不同的外围器件的规则是不一样,也就是说这些规则是多样化的。回到前面讲的开门的例子,也可以这样设计,比如一共敲两下,第一下要敲重一点,第二下要敲轻一点。或者重敲三下,轻敲一下,等等。但是对于我们而言,不需要问为什么,照着做就行了。规则如何设计,那是设计这个器件或者模块的工程师应该思考的工作,我相信这些规则的设计一定有他们的理由。但我们只是从应用层面来思考问题,不管你怎么规定的,我照做就行了。这些规则在哪里呢?查看芯片手册或者官方说明书。罗嗦这么多,其实就为了强调学习这门技术一定要以芯片手册(官方说明资料)为本,而且后面还会继续强调。其实LCD1602包括后面会讲到的其他模块同样如此,你要与它沟通,当然必须按照它的规则来。下面我们就来解读它的规则,来解决前面提到的三个问题,初始化,内容显示,显示地址。
关于这一点,LCD1602说明手册上已经明确告诉我们了,想都不要去想,管你这些什么意思,照做即可。
延时15ms
写指令38H
延时5ms
写指令38H
写指令08H
写指令01H
写指令06H
写指令0CH
以上为初始化过程,延时部分好解决,前面讲过了。这里就看如何“写指令”了。问题来了,液晶模块怎么知道单片机给我的是命令还是数据。(叁议电子www.ppptalk.com)LCD1602看到RS为高时,就明白了,哦,你要给我传送数据了;看到RS为低时,就知道你要给我指令了。这个只是选择“命令”还是“数据”,还有一个问题,我们的目的是“写指令”,那么液晶模块怎么知道是“写”还是“读”呢?再来看RW信号,当RW为低的时候,液晶模块就知道了,单片机要给我“写”了;当RW为高的时候,液晶模块也知道了,单片机要“读”了。很明显,我们这里要把RW设置为低。“写/读”和“指令/数据”都知道如何告诉液晶模块了,那么这个指令从怎么传过去呢?通过D0-D7这8根线(也就是P2端口)来传输,比如我要传送的指令为x033,那么就把这个数据0x33放到P2端口,当LCD1602看到“写”和“指令”的时候,就知道把P2端口上的0x33这个指令拿过来了。这样就达到了“写”“指令”“0x33”的目的。
但是不是这样就能让LCD1602正常执行了。不是的。回到我们前面讲的那个例子,这里加个条件,屋内人听到敲门三下后,判断暗号正确了,但是没有直接开门,而是通知了他的上级,得到上级的授权后,才开门。也就是两个条件,暗号正确和上级授权。LCD1602也一样,收到指令没有立即执行,还要等另外一个信号,就是EN使能信号。此时EN给个一定宽度的脉冲,LCD1602才开始执行。
这样根据前面的分析很容易的写出写指令的代码:
void Lcd_Write_Cmd(unsigned char Cmd) {
delayMs(5);//注意这里需要延时5ms比较保险 代替判断忙信号
RW = 0;
P2 = Cmd; //准备好指令
RS=0; //告诉LCD1602,P0中放的是指令不是数据
EN=1;
delayUs(5); //根据时序图,脉冲要有一定宽度
EN=0; //使指令有效,开始执行
}
同样的道理,以上代码中,只需改一下RS信号为1,就是写数据的代码了
voidLcd_Write_Data(unsignedcharmData) {
RW = 0;
delayMs(5);//注意这里需要延时5ms比较保险代替判断忙信号
P2=mData;//准备好指令
RS=1;//告诉LCD1602,P0中放的是数据不是指令
EN=1;
delayUs(5);//根据时序图,脉冲要有一定宽度
EN=0;//使指令有效,开始执行
}
讲到这里,LCD1602初始化代码应该能写出了。同时我们也已经写出了传递指令的代码,那么现在我们只要知道指令内容就可以了。
指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。
这样你需要给LCD1602什么指令,只需要传递给void write_com(unsigned char Cmd)函数中的Cmd参数就行了。
现在我们就来解决前面提到的第二个问题:“在哪里显示?”也就是液晶模块的这32个空格是如何确定的。
从以上这个图可以看到,一共两行,00到0F和40到4F刚好与LCD1602的32个空格对应。可见,液晶模块的显示位置是通过这个表格对应的码值来确定的。例如第二行第一个字符的地址是40H,那么是不是它的地址就是40H了。注意表3-2中第8条数据存储地址,D7已经被写死了。最终的显示地址应该是40H+10000000B(40H+80H),因此我们只要把这个值传给Cmd,这样LCD1602就知道在第二行第一个位置显示了。
前面讲了,如果传送数据就是要显示的内容。比如我要显示字母A,怎么操作呢?
以上图中可以知道,如果你要显示A,那么数据的高位为0100,低位为0001,因此为01000001。把这个数据传送给LCD1602,它就知道要显示A了。
这样三个问题都解决了,“初始化”,“写指令”,“写数据”。
现在回过头来看看,我们在使用单片机控制LCD1602这个过程中用到了单片机的哪些知识。回去看看图1,10根连接线,P4.1,P4.4和P4.5,再加上P2端口,主要是通过P4.1,P4.4和P4.5高低变化来发出指令或数据,P2端口的变化反映指令或数据的内容。可见,这个过程中我们只用到了IO口控制和延时。其他很长的部分我们用在理解1602的使用规则了。注意这里是使用规则,谈不上原理。比如你给LCD1602发送清屏指令时,你明白LCD1602收到这个指令是如何操作清屏的吗?不知道,也没有必要知道。液晶模块说明书也不告诉你。好比你使用手机时,你点击一下某个应用程序就打开了,然后按照它的规则去使用就行了,比如听歌,上网等等,你不用关心它们是怎么实现的。其实手机也是个模块,我们只要学会操作就行了,不管它里面发生了什么事情。
现在对以上分析内容小结一下。LCD1602液晶模块的作用就是显示,既然是“显示”,无非就是显示什么内容,在哪里显示。那么如何确定显示的内容呢?通过ASCII码表来确定。如何确定显示的位置呢?通过表格3-3来确定。在单片机控制LCD1602液晶模块时,也就是这两个对象沟通时,一定要先“打招呼”,也就是初始化。如何初始化呢?说明手册中已经给出了具体步骤,照搬即可。理清了这个思路,剩下的就是去实现各个步骤了。里面涉及到如何写指令,写数据以及如何读忙信号。具体查看时序图即可。