51单片机学习笔记——LCD1602

一、液晶的概述

液晶的型号命名规则

液晶的命名规则有两种,第一种是按照显示字符的行数和列数命名的,如LCD1602,表示液晶上显示2行,一行16个字符;第二种是按照液晶点阵的行数和列数命名的,如LCD12232,表示液晶上有122x32个点来显示图形。

二、LCD1602

1.概况

LCD1602为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置128个字符的ASCII字符集字库,既可显示库中的字符,也可显示自定义字符。只有并行接口,无串行接口。LED可以静态显示字符,也可以使用移屏指令实现整屏幕左移。
LCD1602外形图

2.引脚详情

引脚 名称 解释
1 VSS 电源地
2 VDD 电源正极
3 VL 液晶显示偏压信号,可以改变背光亮度,对比调整电压
4 RS 数据/命令选择端,0输入指令,1输入数据
5 R/W 读/写选择的端,0写入指令或数据,1读取信息
6 E 使能信号,1时读取信息,下降沿执行指令
7-14 D0-D7 数据输入/输出端
15 BLA 背光源正极
16 BLK 背光源负极

3.I/O口与操作

在大多数时候很少使用LCD1602的读取功能,因此在第5引脚R/W置0时,有如下功能:

命令操作

当第4引脚RS置0时,D0-D7为命令接收位,有如下指令和模式可以设置:
(0为低电平,1为高电平,X为任意电平,?为不同电平对应指令在下表中)

  • 清屏
    清除液晶显示器,DDRAM的内容填入空白ASCII码20H;光标归位,撤回到显示屏左上方;地址计数器(AC)设置为0。
位序号 D7 D6 D5 D4 D3 D2 D1 D0
电平 0 0 0 0 0 0 0 1
  • 光标归位
    光标归位,撤回到显示屏左上方;地址计数器(AC)设置为0。
位序号 D7 D6 D5 D4 D3 D2 D1 D0
电平 0 0 0 0 0 0 1 X
  • 模式设置
    模式设置包括设置光标的移位方向和写入数据后显示屏是否移动。
位序号 D7 D6 D5 D4 D3 D2 D1 D0
电平 0 0 0 0 0 1 ? ?
位序号与电平 功能解释
D1=0 写入新数据后光标左移
D1=1 写入新数据后光标右移
D0=0 写入新数据后显示屏不移动
D0=1 写入新数据后显示屏右移一个字符
  • 显示开关控制
    显示开关控制包括控制显示器开/关,光标的显示/关闭以及是否闪烁。
位序号 D7 D6 D5 D4 D3 D2 D1 D0
电平 0 0 0 0 1 ? ? ?
位序号与电平 功能解释
D2=0 显示功能关
D2=1 显示功能开
D1=0 无光标
D1=1 有光标
D0=0 光标闪烁
D0=1 光标不闪烁
  • 设定显示屏或光标移位
    可以使光标移位或使整个显示屏移位。
位序号 D7 D6 D5 D4 D3 D2 D1 D0
电平 0 0 0 1 ? ? X X
位序号与电平 功能解释
D3=0,D4=0 光标左移1格,AC值-1
D3=0,D4=1 光标右移1格,AC值+1
D3=1,D4=0 显示器上字符全部左移1格,光标不动
D3=0,D4=0 显示器上字符全部右移1格,光标不动
  • 功能设定
    功能设定包括设定数据总线位数、显示的行数和字型。
位序号 D7 D6 D5 D4 D3 D2 D1 D0
电平 0 0 1 ? ? ? X X
位序号与电平 功能解释
DB4=0 数据总线为4位
DB4=1 数据总线为8位
DB3=0 显示1行
DB3=1 显示2行
DB2=0 5×7点阵/字符
DB2=1 5×10点阵/字符
  • 其他位与指令的关系
位序号 功能解释
D6=1 设定下一个要存入数据的CGRAM的地址
D7=1 设定下一个要存入数据的DDRAM的地址

注:
1.在D7=1设置地址时,由于地址只有80个字节,因此只需要七位就能表示了。(2^7^=128)
2.总线即为单片机与D0-D7连接时的使用线的数量。8位总线即LCD1602上D0-D7都与单片机的IO口进行数据交换,4位总线为D4-D7(高四位)与单片机的IO口进行数据交换。在液晶屏刷新率不高时,或者单片机IO口数量紧张时,采用4线。
3.AC(Address Counter)地址计数器。汇编常用,不过这里表示保存地址指针的空间。地址指针(光标)通过地址计数器寻址。

地址操作

LCD1602中有3个储存器:

  • DDRAM(Display Data RAM)
    DDRAM是显示数据随机存储器。共80个字节。从下图可以看出,DDRAM中的地址对应的LCD每个字符的位置。但只有2×16个地址可以对应到液晶上的每一位,剩余的地址只能储存信息但不会显示在液晶上。LCD地址映射图
    事实上,我们不会直接操纵液晶的地址。而是通过地址指针(光标)来进行左移右移,然后写入数据。当第4引脚RS置1时,D0-D7为数据接收位,通过接收到的数据写入地址指针(光标)指向的地址。
  • CGROM(Character Generation ROM)
    CGROM是标准字符储存器。储存了每个字符的点阵形状。在液晶出场时就固化在控制芯片中的,不能更改。
    CGROM字符码对照表
  • CGRAM(Character Generation RAM)
    CGRAM是存放字符点阵的储存器,能存放自定义字符库。用户可以更改。

4.时序图

写操作时序图

写操作步骤
步骤 操作 解释
1 判断D7是否处于忙状态 由于LCD1602速度高于单片机,因此不需要判断或简单延时即可
2 设定RS 选择写命令还是写数据
3 设定R/W 置低电平为写模式
4 操作D0-D7 将数据送达到数据线上
5 给E端口一个高频脉冲 把数据送入液晶,完成写操作
初始化步骤
步骤 操作 解释
1 RS = 0,R/W=0 设置写入指令模式
1 D0-D7=0x38 写入功能设定 总线选择为8 显示2行 5×7点阵
2 D0-D7=0x0d 写入显示开关 显示功能开 无光标 光标不闪烁
3 D0-D7=0x06 写入模式选择 光标右移 屏幕不移动
3 D0-D7=0x01 清屏
3 D0-D7=0x80 设置数据指针起点

注:在每一步操作中间可以加入延时函数,防止指令输入有误。

5.例程:在LCD1602上打印Hello world!

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
56
57
58
59
60
61
62
63
64
65
66
#include <reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;

#define LCD1602_DATAPINS P0 //P0口连接到LCD1602的D0-D7
sbit LCD1602_E=P2^7; //使能端口
sbit LCD1602_RW=P2^5; //读写选择端口
sbit LCD1602_RS=P2^6; //数据命令选择端口
u8 Disp[]=" Hello world! ";

void Delay(u16); //延时函数
void LcdWriteCom(u8); //写命令函数
void LcdWriteData(u8); //写数据函数
void LcdInit(); //LCD1602初始化函数

void main(void)
{
u8 i;
LcdInit();
for(i=0;i<16;i++)
{
LcdWriteData(Disp[i]);
}
while(1);
}

void Delay(u16 c) //延时函数
{
u8 a,b;
for (;c>0;c--)
for(b=199;b>0;b--)
for(a=1;a>0;a--);
}

void LcdWriteCom(u8 com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放入命令
Delay(1); //延时1ms,等待数据稳定
LCD1602_E = 1; //写入时序
Delay(5); //延时1ms,保持时间
LCD1602_E = 0;
}

void LcdWriteData(u8 dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Delay(1);
LCD1602_E = 1; //写入时序
Delay(5); //延时1ms,保持时间
LCD1602_E = 0;
}

void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //总线选择为8 显示2行 5×7点阵
LcdWriteCom(0x0d); //显示功能开 无光标 光标不闪烁
LcdWriteCom(0x06); //光标右移 屏幕不移动
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}

注:
1.例程采用的是8位总线,4位总线需要线接收高四位然后进行移位再写入低四位。
2.若要在第二行打印,只需要加一句LcdWriteCom(0x80+0x40);使得地址指针移动到第二行开头。


51单片机学习笔记——LCD1602
http://blog.mingxuan.xin/2020/05/19/20200519/
作者
Obscure
发布于
2020年5月19日
许可协议