1.简介
作为各类单片机实物设计的常用显示屏,LCD1602是一种专门用于显示字母、数字、符号等点阵式LCD,其1602是指LCD显示的内容为16X2,即可以显示两行,每行16个字符(1个汉字占用2个字符)。
2.硬件参数
(1) LCD1602主要技术参数
a.显示容量:16×2个字符
b.芯片工作电压:4.5—5.5V
c.工作电流:2.0mA(5.0V)
d.模块最佳工作电压:5.0V
e.字符尺寸:2.95×4.35(W×H)mm
(2) 引脚定义
LCD1602引脚主要有逻辑电源引脚VDD,VSS;背光带电源引脚BLA,BLK;数据引脚D0-D7、RS、R/W、EN;偏压信号引脚VL;其中:
- VL引脚:为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度;
- RS引脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
- R/W引脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
- EN引脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
(3)电路图
其中可调电阻P用于调整显示器的对比度。电阻R作为限流电阻,防止过流烧坏显示屏背光灯。
3.控制程序
LCD1602显示屏控制程序简化下来,也相对简单,只需要实现写数据、写指令、初始化三个控制函数即可实现对LCD1602的控制。(写操作一般不用,这里就省略不说)
(1)写操作时序
要实现下面的写数据和写指令函数,都是以写操作时序来进行编程,实现有效的控制;其中,可以通过写时序和RS引脚的定义,写数据和写指令的区别在于RS引脚的电平;RS为高电平时,写数据;RS为低电平时,写指令。
(2)写数据函数
//写数据
void write_data(uchar date)
{LCDRS=1;P0=date;LCDdelay(5);LCDEN=1;LCDdelay(5);LCDEN=0;
}
(3)写指令函数
//写命令
void write_com(uchar com)
{LCDRS=0;P0=com;LCDdelay(5);LCDEN=1;LCDdelay(5);LCDEN=0;
}
(4)初始化函数
LCD1602初始化需要做以下设置:
a.设置写操作:R/W设为低电平;
b.屏幕设置模式:写指令38H;
c.打开显示,关闭光标:写指令0CH;
d.设置显示光标移动位置:写指令06H;
e.设置字符显示位置:写指令(字符显示的起始位置);
void Init1602()
{uchar i=0;
LCDRW = 0;write_com(0x38);//屏幕初始化write_com(0x0c);//打开显示 无光标 无光标闪烁write_com(0x06);//当读或写一个字符是指针后一一位write_com(0x01);//清屏write_com(0x80);//设置位置
}
注:由于对LCD1602进行控制时不需要实现读操作,所以R/W在初始化后恒为低电平(或者此引脚直接对地短路)。
4.显示字符
要在LCD1602上显示特定的字符,实际上就是对LCD1602的DDRAM上写入对应的数据,显示屏便显示你想要的字符。
(1)DDRAM地址映射图
从RAM可以看出来,是读的意思,地址与显示位置如下,每行40个地址,1602只用到前16个,共两行,对应关系如图:
根据写指令格式,由于地址为7位,在写入地址是,第8位恒为1,如图:
当我们想在指定位置写入内容时,要先指定地址,如在第一行第一位写入,地址位是00H,再加上DB7的1,即80H(0010000000),第二行第一位是40H,再加上DB7的1,即C0H(0011000000),依次类推。
比如要在第1行第3位写入“HELLO WOLRD”,即先写入地址,再写入数据:
write_com(0x40+0); //第1行第3位
write_com(‘H’);
write_com(‘O’);
.....
write_com(‘D’);
如果是写在第2行第2位:
write_com(0x40+0x80+2); //第2行第2位
//写数据与上面一样
(2)显示函数
为了程序的简洁与方便,我们将显示程序整合成一个显示函数:
void Display_1602(uchar x,uchar y,uchar *str)
{unsigned char addr;if (y == 0){addr = 0x00 + x; //第一行的x位置显示}else{addr = 0x40 + x; //第二行x的位置显示}write_com(addr + 0x80);while (*str != '\0'){write_data(*str++);}}
要实现上面显示就比较简单:
第1行第3位显示“HELLO WOLRD”:
Display_1602(3,1,”HELLO WOLRD”);
第2行第2位显示“HELLO WOLRD”:
Display_1602(2,2,”HELLO WOLRD”);
更多LCD1602设计资料及例程 请关注公众号,首页回复“1602”获取资料