LCD1602工作原理及与51单片机的接口电路.docx
《LCD1602工作原理及与51单片机的接口电路.docx》由会员分享,可在线阅读,更多相关《LCD1602工作原理及与51单片机的接口电路.docx(13页珍藏版)》请在冰豆网上搜索。
LCD1602工作原理及与51单片机的接口电路
LCD1602工作原理及与51单片机的接口电路
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光
的厚,是否带背光在应用中并无差别
1602LCD主要技术参数:
显示容量:
16×2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×4.35(W×H)mm
引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13
所示:
编号符号引脚说明编号符号引脚说明
1VSS电源地9D2数据
2VDD电源正极10D3数据
3VL液晶显示偏压11D4数据
移位方式
0
0
0
0
0
1
S/C
R/L
x
x
S/C=0、R/L=0:
光标左移;S/C=0、R/L=1:
光标右移S/C=1、R/L=0:
字符和光标左移;S/C=1、R/L=1:
字符和光标右移
功能设定
0
0
0
0
1
DL
N
F
x
x
DL=1:
数据长度为8位,DL=0:
数据长度为4位N=1:
双列字,N=0:
单列字;F=1:
5x10字形,F=0:
5x7字形
CGRAM地址设定
0
0
0
1
CGRAM地址
将所要操作的CGRAM地址放入地址计数器
DDRAM地址设定
0
0
1
DDRAM地址
将所要操作的DDRAM地址放入地址计数器
忙碌标志位BF
0
1
BF
地址计数器内容
读取地址计数器,并查询LCM是否忙碌,BF表示LCM忙碌
写入数据
1
0
写入数据
将数据写入CGRAM或DDRAM
读取数据
1
1
读取数据
读取CGRAM或DDRAM的数据
图10-571602LCD内部显示地址
例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行
第一个字符的位置呢?
这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以
实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,
无需人工干预。
每次输入指令前都要判断液晶模块是否处于忙的状态。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,
如图10-58所示,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名
等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),
显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”
图表1写数据流程
图表2写命令流程
图表3判断LCD是否忙碌,忙则返回1
#include
#include
sbitrs=P3^5;//寄存器类型,1表示数据寄存器,2表示指令寄存器
sbitrw=P3^6;//读写选择,1表示读,0表示写
sbitep=P3^7;//读写使能,下降沿使能
voiddelay(unsignedcharms)//延时nms
{
unsignedchari;
while(ms--)
{
for(i=0;i<123;i++)
{
;
}
}
}
bitlcd_bz()//判断LCD是否忙碌,1忙碌
{
bitresult;
rs=0;
rw=1;
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P1&0x80);
ep=0;
returnresult;
}
voidlcd_wcmd(unsignedcharcmd)//写指令
{
while(lcd_bz());//判断LCD是否忙碌
rs=0;
rw=0;
ep=0;
_nop_();
_nop_();
P1=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
voidlcd_pos(unsignedcharpos)//显示地址
{
lcd_wcmd(pos|0x80);
}
//写数据
voidlcd_wdat(unsignedchardat)
{
while(lcd_bz());//判断LCD是否忙碌
rs=1;
rw=0;
ep=0;
P1=dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
voidlcd_wstr(constunsignedchar*s)//写字符串
{
unsignedchari=0;
while(s[i]!
='\0')
{
lcd_wdat(s[i]);//显示字符
delay(1000);
i++;
}
}
voidlcd_init()//LCD初始化
{
lcd_wcmd(0x38);//功能设定
delay
(1);
lcd_wcmd(0x0c);//显示器开关
delay
(1);
lcd_wcmd(0x06);//设定进入模式
delay
(1);
lcd_wcmd(0x01);//清除显示屏,把光标移至左上角
delay
(1);
}
voidmain(void)
{
lcd_init();//初始化LCD
delay(10);
lcd_pos(0x01);//设置显示位置
//i=0;
while
(1){
lcd_wstr("abcdefg");
lcd_pos(0x42);
lcd_wstr("abcdefg");
lcd_wcmd(0x01);
delay(3);
}
}