0%

LCD1602使用

LCD全称Liquid Crystal Display,中文名液晶显示器。要实现机器与人的交互,那么就要给人一个直观的输出显示,数码管的丰富性过低,于是便要学习LCD显示器

LCD1602液晶显示屏的使用

工作原理

LCD1602专门用来显示字母、数字、符号,由两行,每行16个57或510的点阵自字符位组成,每个字符位可以显示一个字符。显示器内置128个ASCII码字符库,只有并行接口。

接口信号说明

1602有16个接口控制,接口功能如下图

接口说明

基本时序操作

读状态:输入: RS=L,R/W=H,E=H;
读数据: 输入:RS=H,R/W=H,E=H;
写指令: 输入:RS=L,R/W=L,D0D7=指令码,E=高脉冲;
写数据: 输入:RS=H,R/W=L,D0
D7=数据,E=高脉冲.

DDRAM

1602显示器基于HD44780芯片,其内置了DDRAM、CGRAM和CGROM。DDRAM相当于RAM,用来寄存待现显示的字符代码,共80个字节,地址和屏幕的对应关系如下:

当我们想要在第二行第一列显示“A“,只要在40H地址输入”A”的字形码就行了。
显示器只有16列,那么第一行10H和第二行50H之后的地址上的数据,需要通过移屏指令将他们移入。

状态字说明

原则上每次对单片机进行读写操作之前,都必须先进行读写检测,确保STA7=0,实际上,单片机操作速度慢于液晶控制器反应速度,因此可不进行检测,只进行短暂延时即可。

指令操作

清屏指令

功能:
1.将DDRAM全部填入“空白”ASCII码20H;
2.光标归位;
3.将地址计数器值设置为0。
进入模式设置指令

功能:进入一位数据后光标移动方向,字符是否移动。
|I/D:| 0 =光标左移 | 1=光标右移|
| – | – | – |
S: | 0=显示屏不移动 | 1=显示屏整体右移
显示开关控制指令


功能:控制显示器开关、光标是否显示及光标是否闪烁
|位名|0|1
|–|–|–|
D|显示功能关|显示功能开
C|无光标|有光标
B|光标闪烁|不闪烁
功能设定指令

功能:设定数据总线位数、显示的行数及字形。
|位名|0|1
|–|–|–|
DL|数据总线4位|8位
N|显示一行|两行
F|每字符57点阵|510点阵

写操作时序

  1. 通过RS确定写数据还是命令
  2. R/W端设置为写模式
  3. 将数据或命令送达数据总线
  4. 给E一个高脉冲,将数据送入液晶显示器
    图中各个时序的延时因厂家不同而不同,大多很小,但为了运行稳定,最好短暂延时。

单片机接口

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<reg52.h>

typedef unsigned int uint;
typedef unsigned char uchar;

sbit rs=P2^6;
sbit wr=P2^5;
sbit e=P2^7;
void delay(uint a){
uint i=100;
while(a--){
while(i--);
}
}
void w_com(uchar com){ //写指令
rs=0;
wr=0;
P0=com;
delay(1);
e=1; //使能推动
delay(1);
e=0;
}
void w_dat(uchar dat){ //写数据
rs=1;
wr=0;
P0=dat;
delay(1);
e=1;
delay(1);
e=0;
}
void init(){ //初始化
w_com(0x0c); //各种指令,详见上
w_com(0x38);
w_com(0x06);
w_com(0x01);
delay(5);
}
void pos_w(uchar x,uchar y,uchar a){ //显示字符‘a’在x行y列
if(y){
w_com(0x80+x);
}
else
{
w_com(0xc0+x);
}
w_dat(a);
}

int main(){
init();
pos_w(0,1,'a');
while(1);
}