1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图
图二
3`LCD1602主要技术参数:
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
4`引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表
|
编号
|
符号
|
引脚说明
|
编号
|
符号
|
引脚说明
|
|
1
|
VSS
|
电源地
|
9
|
D2
|
数据
|
|
2
|
VDD
|
电源正极
|
10
|
D3
|
数据
|
|
3
|
VL
|
液晶显示偏压
|
11
|
D4
|
数据
|
|
4
|
RS
|
数据/命令选择
|
12
|
D5
|
数据
|
|
5
|
R/W
|
读/写选择
|
13
|
D6
|
数据
|
|
6
|
E
|
使能信号
|
14
|
D7
|
数据
|
|
7
|
D0
|
数据
|
15
|
BLA
|
背光源正极
|
|
8
|
D1
|
数据
|
16
|
BLK
|
背光源负极
|
表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脚:背光源负极。
5`其与单片机的连接如下图所示
LCD1602中文资料二(续一)
由于篇幅限制,此是LED中文资料的续写,如访问上篇内容请点击:LCD1602中文资料一
6`1602液晶模块内部的控制器共有11条控制指令,如下表所示
|
序号
|
指令
|
RS
|
R/W
|
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
|
1
|
清显示
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
|
2
|
光标返回
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
*
|
|
3
|
置输入模式
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
I/D
|
S
|
|
4
|
显示开/关控制
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
D
|
C
|
B
|
|
5
|
光标或字符移位
|
0
|
0
|
0
|
0
|
0
|
1
|
S/C
|
R/L
|
*
|
*
|
|
6
|
置功能
|
0
|
0
|
0
|
0
|
1
|
DL
|
N
|
F
|
*
|
*
|
|
7
|
置字符发生存贮器地址
|
0
|
0
|
0
|
1
|
字符发生存贮器地址
|
|||||
|
8
|
置数据存贮器地址
|
0
|
0
|
1
|
显示数据存贮器地址
|
||||||
|
9
|
读忙标志或地址
|
0
|
1
|
BF
|
计数器地址
|
||||||
|
10
|
写数到CGRAM或DDRAM)
|
1
|
0
|
要写的数据内容
|
|||||||
|
11
|
从CGRAM或DDRAM读数
|
1
|
1
|
读出的数据内容
|
|||||||
表一
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:忙标志位,高电平表示忙,此时模块不能接收命令或数据,如果为低电平表示不忙。
与HD44780相兼容的芯片时序表如下:
|
读状态
|
输入
|
RS=L,R/W=H,E=H
|
输出
|
D0—D7=状态字
|
|
写指令
|
输入
|
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
|
输出
|
无
|
|
读数据
|
输入
|
RS=H,R/W=H,E=H
|
输出
|
D0—D7=数据
|
|
写数据
|
输入
|
RS=H,R/W=L,D0—D7=数据,E=高脉冲
|
输出
|
无
|
表二:基本操作时序表
读写操作时序如图所示
图三:读操作时序
图四:写操作时序
7:1602LCD的RAM地址映射及标准字库表
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在,哪里显示字符,图是1602的内部显示地址。


图五:LCD1602内部显示地址
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
附代码
#include<reg52.h>
#include<intrins.h> //包含_nop_()函数的头文件
sbit RS=P2^0; //将RS定义为P2^0
sbit RW=P2^1; //将RW定义为P2^1
sbit E=P2^2; //将E定义为P2^2
sbit BF=P0^7; //将BF定义为P0^7
sbit K1=P1^0;
sbit K2=P1^1;
unsigned char code User[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};//自定义字符℃
unsigned char str1[]="FREEDOM";
unsigned char str2[]="zhengzhongjie";
unsigned char Count;
unsigned char Digits_of_6DSY[6]={0,0,0,0,0,0};
unsigned int yx;
/************************************
函数功能:1ms基准延时
入口参数:n
************************************/
void delay1ms(unsigned int n )
{
unsigned char i;
while(n--)
for(i=0;i<115;i++);
}
/************************************
函数功能:判断液晶的忙碌状态
返回值:result=1,忙碌;result=0,不忙
************************************/
bit BusyTest()
{
bit result;
RS=0; //读状态时,RS=0,RW=1,E=1
RW=1;
E=1;
_nop_(); //延时一个时钟周期
_nop_();
_nop_();
_nop_(); //4个周期延时,给硬件反应时间
result=BF;
E=0; //将E置0,不允许读
return result;
}
/************************************
函数功能:将模式设置指令或显示地址送入液晶
入口参数:dictate
************************************/
void Write_com(unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //写指令时,RS=0.RW=0,E=负跳变
RW=0;
E=1; //先将E拉高
_nop_();
_nop_(); //给硬件反应时间
P0=dictate; //将数据送入P0口,即指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/************************************
函数功能:指定字符显示的实际地址
入口参数:x
************************************/
void WriteAddress(unsigned char x)
{
Write_com(x|0x80); //显示位置的确定方法为“0x80+地址码x”
}
/************************************
函数功能:将数据(ASKII码)写入液晶模块
入口参数:y(字符常量)
************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1); //如果忙碌就等待
RS=1; //写数据时RS=1,RW=0,E=负跳变
RW=0;
E=1; //先将E拉高
P0=y;
_nop_();
_nop_();
_nop_();
_nop_(); //反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/************************************
函数功能:对LCD的显示模式进行初始化
************************************/
void LcdInt()
{
delay1ms(15); //首次写指令时给LCD一段较长的反应时间
Write_com(0x38); //显示模式设置:16X2显示,5X7点阵,8位数据总线
delay1ms(5);
Write_com(0x38);
delay1ms(5);
Write_com(0x38);
delay1ms(5); //3次写 设置模式
Write_com(0x0C); //显示模式设置:显示开,有光标,光标闪烁
delay1ms(5);
Write_com(0x06); //显示模式设置:光标右移,字符不移
delay1ms(5);
Write_com(0x01); //清屏
delay1ms(5);
}
void Lcdvbeta()
{
unsigned char i,j;
Write_com(0x01); // 清屏
delay1ms(5);
WriteAddress(0x05); //设置显示位置为第1行,第6个位置
delay1ms(5);
i=0;
for(;str1[i]!='\0';i++){
WriteData(str1[i]); // 显示字符"FREEDOM"
delay1ms(100);
}
WriteAddress(0x41); // 设置显示位置为第2行,第2个位置
i=0;
for(;str2[i]!='\0';i++){
WriteData(str2[i]); // 显示字符"zhengzhongjie"
delay1ms(100);
}
delay1ms(3000);
//右侧移位进来
Write_com(0x01); //清屏
delay1ms(5);
WriteAddress(0x15); // 设置显示位置为第1行,第22个位置
delay1ms(5);
i=0;
for(;str1[i]!='\0';i++){
WriteData(str1[i]);
delay1ms(100);
}
WriteAddress(0x51); // 设置显示位置为第2行,第18个位置
delay1ms(5);
i=0;
for(;str2[i]!='\0';i++){
WriteData(str2[i]);
delay1ms(100);
}
for(j=0;j<16;j++){ //左移指令
Write_com(0x18);
delay1ms(300);
}
delay1ms(3000);
//关闭显示
Write_com(0x08);
delay1ms(5);
delay1ms(3000);
//开启显示
Write_com(0x0f);
delay1ms(5);
delay1ms(3000);
//右移,移出
for(j=0;j<16;j++){
Write_com(0x1c);
delay1ms(300);
}
delay1ms(3000);
//显示一个自定义的字符℃
Write_com(0x40); //设置CGRAM地址
delay1ms(5);
for(j=0;j<8;j++){
WriteData(User[j]); //写入℃
delay1ms(5);
}
WriteAddress(0x05); //设定屏幕上的显示位置
WriteData(0x00); //因为执行过Write_com(0x40),默认从CGRAM取出℃
delay1ms(3000);
}





