原标题:什么是LCD1602
LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符。LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,即可以显示出图形。
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
注意:LCD1602仅能显示字母、符号或数字,无法显示汉字。
LCD1602管脚
状态字
RAM地址映射
控制器接口时序
1、读操作时序
2、写操作时序
3、时序参数
基本操作时序
1602的基本操作时序一共有4个,下面一一介绍。
写程序前我们先将用到的总线接口做一个同意声明:
#defineLCD1602_DBP2//并行输入口
sbitLCD1602_RS=P0^5;//数据/命令选择端
sbitLCD1602_RW=P0^6;//读写选择端
sbitLCD1602_EN=P0^7;//使能端
<1>读状态:RS=L,R/W=H,EN=H
LCD1602_DB=0xFF;
LCD1602_RS=0;
LCD1602_RW=1;
LCD1602_EN=1;
sta=LCD1602_DB;
这样就把当前液晶的状态字读到了sta这个变量中,可以通过判断sta最高位的值来了解当前液晶是否处于“忙”状态,也可以得知当前数据的指针位置。
<2>读数据:RS=H,R/W=H,EN=H
在实际使用时,读数据很少使用,大家可以仅了解就行。
<3>写指令:RS=L,R/W=L,D0~D7=指令码,EN=高脉冲
在这里就E=高脉冲需要了解一下。因为这一句很关键,当前状态是写数据,根据时序图,首先保证EN引脚是低电平状态,不管前三句之前怎么设置,1602这里EN引脚没有使能控制,就不会读总线上的信号。当前三句准备好之后,让EN引脚从低电平到高电平变化,然后EN引脚再从高电平到低电平出现一个下降沿,1602检测到这个下降沿之后,并且检测到RS=L,R/W=L,就会马上读取D0~D7的数据,完成单片机写1602指令的过程。
归纳:EN使能引脚先低拉高,再从高拉低,形成一个高脉冲。
<4>写数据:RS=H,R/W=L,D0~D7=数据,EN=高脉冲
写数据与写指令类似,就是把RS改成H,把总线改成数据而已。
指令介绍
1、显示模式设置
写指令0x38:设置16×2显示,5×7点阵,8位数据接口。(这条指令是固定的,必须写0x38)
2、显示开/关以及光标设置指令
如下图所示:
第一条指令:一个字节中8位,前5位是固定的0B0001,低3位分别用DCB从高到低表示
第二条指令:高6位是固定的0B000001,低2位使用NS从高到低表示
3、清屏指令
写入0x01表示显示清屏(固定的),其中包含了数据指针清零,所有的显示清零。
写入0x02仅仅是数据指针清零,显示不清零。
4、RAM地址设置指令
该指令的最高位为1,低7位为RAM地址,RAM地址与液晶上字符的关系如上图所示。通常在读写数据之前都要先设置好地址,然后再进行数据的读写操作。
5、初始化过程
延时15ms
写指令38H(不检测忙信号)
延时5ms
写指令38H(不检测忙信号)
延时5ms
写指令38H(不检测忙信号)
(以后每次写指令、读/写数据操作前,都要检测忙信号)
写指令38H:显示模式设置
写指令08H:显示关闭
写指令01H:显示清屏
写指令06H:显示光标移动设置
写指令0CH:显示开及光标设置
电路图
或者可以参考下图
【程序】
关于LCD1602的参考程序,我在这里放两个,一个是自己最开始做51小车时写的关于LCD1602的程序,以下程序仅供参考
/*写命令*/
voidWrite_Cmd(ucharcmd)
{
LCD1602_RS=0;//写入命令
LCD1602_RW=0;
LCD1602_DB=cmd;
Delay_10us(10);
LCD1602_EN=1;//使能端高电平
Delay_10us(10);
LCD1602_EN=0;
}
/*写数据*/
voidWrite_Dat(uchardat)
{
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DB=dat;
Delay_10us(10);
LCD1602_EN=1;//使能端高电平
Delay_10us(10);
LCD1602_EN=0;
}
/*LCD1602初始化*/
voidLCD_INIT()
{
Write_Cmd(0x38);//设置显示模式
Write_Cmd(0x0c);//开显示不显示光标,光标不闪烁
Write_Cmd(0x06);//写一个指针+1
Write_Cmd(0x01);//清屏
Write_Cmd(0x80);//设置数据指针起点
}
/*延时函数*/
voidDelay_10us(uintn)
{
while(n--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/*LCD1602显示*/
voidPrint_LCD1602()
{
uinti,j;
Write_Cmd(0x80);//写第1行
for(i=0;i<6;i++)
Write_Dat(str1[i]);
for(i=0;i<4;i++)
Write_Dat(disdata[i]);
for(i=0;i<4;i++)
Write_Dat(str2[i]);
Write_Dat(0x20);
if(HAA==1)
Write_Dat('B');
elseif(HAA==0)
Write_Dat('T');
Write_Cmd(0x80+0x40);//写第2行
for(j=0;j<9;j++)
Write_Dat(str3[j]);
for(j=0;j<4;j++)
Write_Dat(distance[j]);
for(j=0;j<2;j++)
Write_Dat(str4[j]);
}
另一个是自己后来多了解之后看的
#defineLCD1602_DBP2//并行输入口
sbitLCD1602_RS=P0^5;//数据/命令选择端
sbitLCD1602_RW=P0^6;//读写选择端
sbitLCD1602_EN=P0^7;//使能端
voidmain()
{
LCD1602_Init();
LCD1602_Show(2,0,"Xiaomo_HAA");
LCD1602_Show(0,11,"HAppy!");
}
//等待液晶准备好
voidLCD1602_wait()
{
unsignedcharsta;
LCD1602_DB=0xff;
LCD1602_RS=0;
LCD1602_RW=1;
do{
LCD1602_EN=1;
sta=LCD1602_DB;//读取状态字
LCD1602_EN=0;
}while(sta&0x80);//bit7等于1表示液晶正忙,重复检测直到其为0为止
}
//写命令
voidLCD1602_cmd(unsignedcharcmd)
{
LCD1602_wait();
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_DB=cmd;
LCD1602_EN=1;
LCD1602_EN=0;
}
//写数据
voidLCD1602_Data(unsignedchardat)
{
LCD1602_wait();
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DB=dat;
LCD1602_EN=1;
LCD1602_EN=0;
}
//设置显示RAM起始地址(x,y对应屏幕上字符坐标)
voidLCD1602_SetRAM(unsignedcharx,unsignedchary)
{
unsignedcharaddr;
if(y==0)
addr=0x00+x;
else
addr=0x40+x;
LCD1602_cmd(addr|0x80);
}
//显示字符串
voidLCD1602_Show(unsignedcharx,unsignedy,unsignedchar*str)
{
LCD1602_SetRAM(x,y);
while(*str!='\0')
{
LCD1602_Data(*str++);
}
}
//初始化LCD1602
voidLCD1602_Init()
{
LCD1602_cmd(0x38);//设置显示模式
LCD1602_cmd(0x0c);//开显示不显示光标,光标不闪烁
LCD1602_cmd(0x06);//写一个指针+1
LCD1602_cmd(0x01);//清屏
}
鲸奇视觉