文档库 最新最全的文档下载
当前位置:文档库 › LCD1602工作原理

LCD1602工作原理

?========================================第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);
}
}

相关文档