?========================================第1页========================================
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
所示
:
编号
符号
引脚说明
编号
符号
引脚说明
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
背光源负极
表
表表
表
10-13
:
::
:引脚接口说明表
引脚接口说明表
引脚接口说明表
引脚接口说明表
第
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
脚:背光源负极。
========================================第2页========================================
LCD
寄存器的选择
寄存器的选择
寄存器的选择
寄存器的选择
E R/W RS 功能说明
1 0 0 写入命令寄存器
1 0 1 写入数据寄存器
1 1 0 读取忙碌标志及RAM地址
1 1 1 读取RAM数据
0 X
不动作
LCD
指令表
指令表
指
令表
指令表
指令功能
控制线 数据线
RS R/W
D7 D6 D5 D4 D3 D2 D1 D0
清除屏幕
0 0 0 0 0 0 0 0 0 1
清除屏幕,并把光标移至左上角
光标回到原
点
0 0 0 0 0 0 0 0 1 x
光标移至左上角,显示内容不变
设定进入模
式
0 0 0 0 0 0 0 1 I/D
S
I/D=1:地址递增,I/D=0:地址递减 S=1:开启显示屏,S=0:关闭显
示屏
显示器开关
0 0 0 0 0 0 1 D C B
D=1:开启显示幕 C=1:开启光标 B=1:光标所在位置的字符闪烁
移位方式
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字形
CG RAM地址
设定
0 0 0 1 CG RAM地址
将所要操作的CG RAM地址放入地址计数器
DD RAM地址
设定
0 0 1 DD RAM地址
将所要操作的DD RAM地址放入地址计数器
忙碌标志位
BF
0 1 BF 地址计数器内容
读取地址计数器,并查询LCM是否忙碌,BF表示LCM忙碌
写入数据
1 0 写入数据
将数据写入CG RAM或DD RAM
读取数据
1 1 读取数据
读取CG RAM或DD RAM的数据
========================================第3页========================================
图
10-57 1602LCD
内部显示地址
例如第二行第一个字符的地址是
40H
,那么是否直接写入
40H
就可以将光标定位在第二行
第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位
D7
恒定为高电平
1
所
以
实际写入的数据应该是
01000000B
(
40H
)
+10000000B(80H)=11000000B(C0H)
。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,
无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。
1602
液晶模块内部的字符发生存储器(
CGROM
)已经存储了
160
个不同的点阵字符图形,
如图
10-58
所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假
名
等,每一个字符都有一个固定的代码,比如大写的英文字母“
A
”的代码是
01000001B
(
41H
),
显示时模块把地址
41H
中的点阵字符图形显示出来,我们就能看到字母“
A
”
========================================第4页========================================
开始
结束
判断
LCD
是否忙碌?
rs=1;
rw=0;
ep=0;
P1=dat;
延时
4us
ep=1;
延时
4us
ep=0;
否
是
图表
1
写数据流程
========================================第5页========================================
开始
结束
判断
LCD
是否忙碌?
r
s=0;
rw=0;
ep=0;
P1=dat;
延时
4us
ep=1;
延时
4us
ep=0;
否
是
图表
2
写命令流程
========================================第6页========================================
开始
结束
rs=0;
rw=1;
ep=1;
P1=dat;
延时
4us
result = (bit)(P1 & 0x80);
ep=0;
返回
result
图表
3
判断
LCD
是否忙碌,忙则返回
1
========================================第7页========================================
#include
#include
sbit rs= P3^5; //
寄存器类型,
1
表示数据寄存器,
2
表示指令寄存器
sbit rw = P3^6; //
读写选择,
1
表示读,
0
表示写
sbit ep = P3^7; //
读写使能,下降沿使能
void delay(unsigned char ms) //
延时
n ms
{
unsigned char i;
while(ms--)
{
for(i = 0; i<123; i++)
{
;
}
========================================第8页========================================
}
}
bit lcd_bz() //
判断
LCD
是否忙碌,
1
忙碌
{
bit result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P1 & 0x80);
ep = 0;
return result;
}
void lcd_wcmd(unsigned char cmd) //
写指令
{
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;
}
void lcd_pos(unsigned char pos) //
显示地址
{
lcd_wcmd(pos | 0x80);
}
//
写数据
========================================第9页========================================
void lcd_wdat(unsigned char dat)
{
while(lcd_bz());//
判断
LCD
是否忙碌
rs = 1;
rw = 0;
ep = 0;
P1 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
void lcd_wstr(const unsigned char *s) //
写字符串
{
unsigned char i = 0;
while(s[i] != '\0')
{
lcd_wdat(s[i]);//
显示字符
delay(1000);
i++;
}
}
void lcd_init() //LCD
初始化
{
lcd_wcmd(0x38); //
功能设定
delay(1);
lcd_wcmd(0x0c); //
显示器开关
delay(1);
lcd_wcmd(0x06); //
设定进入模式
delay(1);
lcd_wcmd(0x01); //
清除显示屏,把光标移至左上角
delay(1);
}
void main(void)
========================================第10页========================================
{
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);
}
}