上面学的两招,操控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所示:
第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: 低电平时显现5×7的点阵字符,高电平时显现5×10的点阵字符。
指令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;
}