×
单片机 > 单片机程序设计 > 详情

初步认识51单片机-2.2单片机控制LCD1602液晶显示模块

发布时间:2020-08-31 发布时间:
|
上面学的两招,控制IO和延时,在这里要举的第一个例子就是LCD1602。LCD1602什么意思,表示一行可以显示16个字符,一共有两行。先来个LCD1602的简单介绍,1602LCD主要技术参数:

显示容量:16×2个字符

芯片工作电压:4.5—5.5V

工作电流:2.0mA(5.0V)

模块最佳工作电压:5.0V

字符尺寸:2.95×4.35(W×H)mm

引脚功能说明

1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,

第1脚:VSS为地电源。

第2脚:VDD接5V正电源。

第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

第15脚:背光源正极。

第16脚:背光源负极。

我们来看看如何使用这两招控制LCD1602液晶模块。既然是用单片机控制LCD1602,那么根据前面的分析思想,首先要搞清楚谁是控制对象,谁是被控制对象。很显然,LCD1602是被控制对象,那么我们就先从LCD1602开始分析。所谓控制也可以理解为沟通,那么如何与LCD1602沟通呢?可以想一想,平时人与人是如何沟通的?沟通之前先要打个招呼吧,比如“你好”之类的,电话里面要先讲个“喂?”,之后才进入沟通正题了。其实单片机与LCD1602的沟通方式也一样,“喂?”在这个例子里面就叫初始化。后面也会经常碰到这个“初始化”的概念。其实器件也是人设计的,所以他的工作方式从某种程度上讲,也是人的沟通方式。打完招呼后,就开始进入真正主题了。什么主题呢?LCD1602是显示模块,主要作用当然是显示了。那么显示什么呢?很明显,显示内容当然来自于单片机了,单片机让它显示什么它就显示什么。这个‘显示什么’就是传送的数据。那么怎么往1602传送数据呢?1602什么意思,表示2行16个字符,也就是有不同的显示地点,那么如何确定显示地点呢?因此前面的分析可以总结为三个问题,如何初始化,如何传送显示的内容(显示什么),在哪里显示。这三个问题如何解答呢?当然要去看芯片手册了。

为了解决这三个问题,我们先来看看人与人之间是如何沟通的,如果当面沟通,你的信号(声音)能够直接传到对方,而且能让对方听懂。如果相距比较远,那么就使用电话等通信工具。前者信号传递载体是空气,后者是电话线。那么我们来看看MCU与LCD1602的信号传递载体是什么样的。查看原理图。因为是MCU与1602之间的沟通,当然这里我们只查看与单片机相连接的部分。

从图中我们看到,单片机通过P2.7,P2.6分别与RS,EN连接,P0端口与D0到D7连接,一共10根线。那么也就是说,单片机的所有指令,数据等都是通过这10根线来完成的。怎么样去控制LCD呢,当然是阅读LCD的说明手册。这里来个比喻,房间内一个人规定,敲三下门,屋内的人才把门打开。如果你要进入屋内,就必须敲三下,如果你不知道这个规则,敲了四下,或者大喊大叫,门也开不了。这个规定可以是多样化,比如一共敲两下,第一下要敲重一点,第二下要敲轻一点。或者重敲三下,轻敲一下,等等。而且这里你不需要问为什么,照着做就行了。其实LCD1602包括后面会讲到的其他模块同样如此,你要与它沟通,当然必须按照它的规则来。下面我们就来解读它的规则,来解决前面提到的三个问题,

LCD1602初始化;在哪里显示;显示什么。

(1)LCD1602初始化

关于这一点,说明手册上已经告诉我们了,这里全盘复制过来。

延时15ms

写指令38H

延时5ms

写指令38H

写指令08H

写指令01H

写指令06H

写指令0CH

以上为初始化过程,延时部分好解决,前面讲过了。这里就看如何写指令了。写指令这个过程肯定是通过上图中10根线来完成的。D0-D7一共八根线应该是用来存放指令的内容。问题来了,1602怎么知道单片机给我的是命令还是数据。(命令是什么,在哪里显示,屏幕清零;数据是什么,显示什么内容,显示A还是B)。LCD1602看到RS为高时,就明白了,哦,你要通过P0端口给我数据了,于是LCD1602就把这些数据拿过来了。看到RS为低时,就知道你要给我指令了。通过这种方式,单片机能准确的传递指令或者数据信息,实现与LCD1602的沟通。是不是这样就能让LCD1602正常执行了。不是的。回到我们前面讲的那个例子,这里加个条件,屋内人听到敲门三下后,判断暗号正确了,但是没有直接开门,而是通知了他的上级,得到上级的授权后,才开门。也就是两个条件,暗号正确和上级授权。LCD1602也一样,收到指令没有立即执行,还要等另外一个信号,就是EN使能信号。此时EN给个一定宽度的脉冲,LCD1602开始执行。

 

时序图如上图所示,这里少了R/W信号,用于控制从LCD1602读取还是写入的,为了简化过程,在硬件上把R/W接地了,也就是只能写不能读。同时,读忙信号也不能操作,这里采用延时的方法替代。根据前面的分析很容易的写出写指令的代码:

​void write_com(unsigned char mycmd)

{

  delayMs(5);//注意这里需要延时5ms比较保险 代替判断忙信号

  P0=mycmd;        //准备好指令

  RS=0;         //告诉LCD1602,P0中放的是指令不是数据

  EN=1;

  delayUs(5); //根据时序图,脉冲要有一定宽度

  EN=0;           //使指令有效,开始执行

}

同样的道理,以上代码中,只需改一下RS信号为1,就是写数据的代码了

void write_com(unsigned char mydata)

{

  delayMs(5);//注意这里需要延时5ms比较保险 代替判断忙信号

  P0=mycmd;        //准备好指令

  RS=1;         //告诉LCD1602,P0中放的是数据不是指令

  EN=1;

  delayUs(5); //根据时序图,脉冲要有一定宽度

  EN=0;           //使指令有效,开始执行

}

讲到这里,LCD1602初始化代码应该能写出了。同时我们也已经写出了传递指令的代码,那么现在我们只要知道指令内容就可以了。

1602LCD的指令说明及时序

1602液晶模块内部的控制器共有11条控制指令,如表2所示:

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)

指令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(unsignedchar mycmd)函数中的mycmd参数就行了。

(2)在哪里显示

知道了这个,现在我们就能解决前面提到的第二个问题,在哪里显示,

 

例如第二行第一个字符的地址是40H,那么是不是它的地址就是40H了。注意表2中第8条数据存储地址,D7已经被写死了。最终的显示地址是40H+10000000B,因此我们只要把这个值传给mycom,LCD1602就知道在第二行第一个位置显示了。

(3)显示什么

前面讲了,如果传送数据就是要显示的内容。比如我要显示字母A,怎么操作呢。

以上图中可以知道,如果你要显示A,那么数据的高位为0100,低位为0001,因此为01000001。把这个数据传送给LCD1602,它就知道要显示A了。

现在回过头来看看,我们在使用单片机控制LCD1602这个过程中用到了单片机的哪些知识。回去看看图1,10根连接线,P2.6和P2.7引脚,再加上P0端口,主要是通过P2.6和P2.7高低变化来发出指令或数据,P0的变化反映指令或数据的内容。可见,这个过程中我们只用到了IO口控制和延时。其他很长的部分我们用在理解1602的使用规则了。注意这里是使用规则,谈不上原理。比如你给LCD1602发送清屏指令时,你明白LCD1602收到这个指令是如何操作清屏的吗?不知道,也没有必要知道。液晶模块说明书也不告诉你。好比你使用手机时,你点击一下某个应用程序就打开了,然后按照它的规则去使用就行了,比如听歌,上网等等,你不用关心它们是怎么实现的。其实手机也是个模块,我们只要学会操作就行了,不管它里面发生了什么事情。

附参考代码如下:

#include

void LCD_init(void);

void delayUs(unsigned char t);

void delayMs(unsigned char t);

void write_com(unsigned char mycmd);

void write_data(unsigned char mydata);

sbit RS=P2^7;

sbit EN=P2^6;

void main (void)

{

        

        LCD_init();        

        write_com(0x0f);

        write_data(0x41);

        while(1);

}

void LCD_init(void)

{

delayMs(15);

write_com(0x38);

delayMs(5);

write_com(0x38);

write_com(0x08);

write_com(0x01);

write_com(0x06);

write_com(0x0c);

}

void delayUs(unsigned char t)

{

        while(--t);

}

void delayMs(unsigned char t)

{

        while(--t)

        {

                delayUs(245);

                delayUs(245);

        }

}

void write_com(unsigned char mycmd)

{

  delayMs(5);//注意这里需要延时5ms比较保险代替判断忙信号

  P0=mycmd;        //准备好指令

  RS=0;         //告诉LCD1602,P0中放的是指令不是数据

  EN=1;

  delayUs(5); //根据时序图,脉冲要有一定宽度

  EN=0;           //使指令有效,开始执行

}                

void write_data(unsigned char mydata)

{

  delayMs(5);//注意这里需要延时5ms比较保险

  P0=mydata;

  RS=1;

  EN=1;

  delayUs(5);

  EN=0;

}

关键字:51单片机  单片机控制  LCD1602  液晶显示模块 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析