目录
[1. 概述](#1. 概述)
[2. LCD1602](#2. LCD1602)
[2.1 介绍](#2.1 介绍)
[2.2 管脚图](#2.2 管脚图)
[2.3 LCD1602 DDRAM 地址映射图](#2.3 LCD1602 DDRAM 地址映射图)
[2.4 常用指令](#2.4 常用指令)
[2.4.1 清屏指令](#2.4.1 清屏指令)
[2.4.2 模式设置指令](#2.4.2 模式设置指令)
[2.4.3 显示开关控制指令](#2.4.3 显示开关控制指令)
[2.4.4 功能设定指令](#2.4.4 功能设定指令)
[3. LCD1602 使用](#3. LCD1602 使用)
[3.1 写时序](#3.1 写时序)
[3.2 时序图](#3.2 时序图)
1. 概述
前面,已经学习过几种显示装置,例如静/动态数码管、8*8LED点阵、串口通信。
使用它们可以直观显示一些字符数据,但是他们也有各种局限性,比如显示字符数据太少,硬件设计复杂,代码编写难度大等。
现在,介绍一种非常简单且常用的显示装置------LCD1602液晶显示器,使用它可以显示更多的字符数字。
开发板上集成了一个 LCD1602 液晶显示器接口,将 LCD1602 液晶对应插入即可
2. LCD1602
2.1 介绍
LCD1602 液晶也叫1602字符型液晶,它能显示 2 行字符信息,每行显示 16 个字符
它是一种专门用来显示字母、数字、符号的点阵型液晶模块
由若干个 5*7 或 5*10 的点阵字符位组成,每个点阵字符位都可以用来显示一个字符
【理解:
可以把 LCD1602 的显示区域想象成一张 "方格纸":
整张纸被划分成 2 行 ×16 列 个独立的 "小方格"(总共 32 个),每个 "小方格" 就是一个点阵字符位;
每个 "小方格" 内部,又被细分成 5列×7行(或 5 列 ×10 行)的更小像素点(类似方格纸里的小格子);
一个字符(比如字母 A、数字 8),就是通过控制这个 5×7 小方格内 "哪些像素点亮、哪些熄灭" 来形成的。】
每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距与行间距的作用
也正因如此,它不能很好的显示图片

2.2 管脚图
从上图可以看到有 16 个管脚孔,从左至右管脚编号顺序是 1 - 16,其功能定义如下所示:

对几个管脚做如下说明:
3 脚:VL ,液晶显示偏压信号。用于调整 LCD1602 的显示对比度,一般会外接电位器用以调整偏压信号,此脚电压为 0 时可以得到最强的对比度
4 脚:RS ,数据/命令选择端。此脚为高电平时,可以对 1602 进行数据字节(在 1602 上显示的字节)的传输操作,而为低电平时,则是进行命令字节(对1602工作方式进行设置的字节)的传输操作
5 脚:R/W,读写选择端。高电平,读操作,反之,写操作
6 脚:E ,使能信号,LCD1602 的数据控制时钟信号。利用该信号的上升沿实现对 LCD1602 的数据传输
7 - 14脚:8 位并行数据口,而 51 单片机一组 IO 也是8位,使得对 LCD1602 的数据读写大为方便
2.3 LCD1602 DDRAM 地址映射图
在 LCD1602 内部含有 80 个字节的 DDRAM,它是用来寄存显示字符的
其地址与屏幕的对应关系如下:


① DDRAM(Display Data RAM)是 LCD1602 内部的显示数据存储器,可以把它理解成一张 "字符地址对照表":
- 你往某个 DDRAM 地址里写入字符的 ASCII 码(比如写入 41H 对应字母 A),LCD1602 就会在这个地址对应的物理显示位置显示该字符;
- 这张图的核心就是告诉你:"哪个 DDRAM 地址" 对应 "LCD 屏幕上哪个显示位置"。
②
| 维度 | 含义解释 |
|---|---|
| 显示位置 | 列标题的 "1、2、3...40" 是 LCD1602 内部 DDRAM 预留的 "虚拟位置"(每行 40 个),但 LCD1602 物理屏幕仅显示前 16 个位置(这也是 "1602" 中 "16" 的含义:每行显示 16 个字符),17~40 的位置是预留地址,字符不会显示(除非通过指令移位)。 |
| DDRAM 地址 - 第一行 | 第一行的 DDRAM 地址从00H(十六进制)开始,依次是 01H、02H...27H(00H 到 27H 共 40 个地址:27H 是十进制 39,00~39 正好 40 个)。 |
| DDRAM 地址 - 第二行 | 第二行的 DDRAM 地址从40H开始,依次是 41H、42H...67H(40H 到 67H 也是 40 个地址:67H 是十进制 103,40H 是 64,64~103 正好 40 个)。 |
③ 如果你想在 LCD1602第一行第 5 个位置显示数字 "8":
- 查图表:第一行显示位置 5 对应的 DDRAM 地址是
04H; - 数字 "8" 的 ASCII 码是
38H(十六进制); - 操作逻辑:
- 先给 LCD 发送 "设置 DDRAM 地址为 04H" 的指令;
- 再发送字符码
38H; - 最终 LCD 第一行第 5 个位置就会显示 "8"。
2.4 常用指令
在使用 LCD1602 时,掌握一些常用指令,对于 LCD1602 初始化是必要的
2.4.1 清屏指令
指令功能:清屏 ------ 清空 LCD1602 屏幕上所有显示的字符,同时将光标复位到屏幕左上角的初始位置;

指令编码(各引脚 / 数据位取值):
RS(寄存器选择位):0(表示发送的是 "指令",而非显示数据);
R/W(读写控制位):0(表示向 LCD "写入" 指令,而非读取状态 / 数据);
DB7~DB0(8 位数据总线):DB7 至 DB1 均为 0,仅 DB0 为 1(完整 8 位指令码为二进制00000001B,对应十六进制01H);
执行时间:1.64ms------ 发送清屏指令后,LCD 需要 1.64 毫秒完成清屏操作,此期间需等待,不宜立即发送其他指令,否则会导致指令执行失败。
2.4.2 模式设置指令
指令功能 :进入模式设置 ------ 设定 LCD1602 写入字符后,光标移动方向 (I/D)和显示是否整体移位(S),是控制 LCD 字符显示逻辑的基础指令;

指令编码(各引脚 / 数据位取值):
RS(寄存器选择位):0(表示发送的是 "指令",而非显示数据);
R/W(读写控制位):0(表示向 LCD "写入" 指令,而非读取状态 / 数据);
DB7~DB2(高 6 位数据总线):均为 0(固定值);
- DB1(I/D 位):光标移动方向控制位(核心可变参数):
- I/D=1:光标从左向右移动(写入字符后光标右移,符合常规阅读习惯);
- I/D=0:光标从右向左移动;
- DB0(S 位):显示移位控制位(核心可变参数):
- S=1:写入字符后整个显示画面移位(光标不动,画面移动);
- S=0:写入字符后仅光标移动,显示画面不动(最常用);
- 指令码基础框架:二进制
000000I/DSB(十六进制00H~03H,取决于 I/D 和 S 的取值);
执行时间:40μs(微秒)------ 指令发送后,LCD 仅需 40 微秒完成设置,等待时间远短于清屏指令,编程时预留该时间即可发送下一条指令。
2.4.3 显示开关控制指令
指令功能:显示开关控制 ------ 可分别控制 LCD1602 的 "整体显示开启 / 关闭""光标显示 / 隐藏""光标闪烁 / 静止";特别注意:关闭显示时,DDRAM(显示数据存储器)中的字符数据不会丢失,仅屏幕暂时空白,重新开启显示后数据会恢复。

指令编码(各引脚 / 数据位取值):
| 控制 / 数据位 | 取值(表格标注) | 含义说明 |
|---|---|---|
| RS | 0 | 表示发送的是 "指令",而非显示数据(RS=1 为发送显示数据) |
| R/W | 0 | 表示向 LCD "写入" 指令,而非读取状态 / 数据(R/W=1 为读取) |
| DB7 | 0 | 固定值,是该指令的高 7 位标识 |
| DB6 | 0 | 固定值 |
| DB5 | 0 | 固定值 |
| DB4 | 0 | 固定值 |
| DB3 | 1 | 固定标识位,区分该指令为 "显示开关控制" |
| DB2 | D | 核心可变参数(行业标准定义:D=1 开启整体显示,D=0 关闭显示,关闭后 DDRAM 数据不丢失) |
| DB1 | C | 核心可变参数(行业标准定义:C=1 显示光标,C=0 隐藏光标) |
| DB0 | B | 核心可变参数(行业标准定义:B=1 光标闪烁,B=0 光标静止) |
执行时间:40μs(微秒)------ 表格明确标注该指令执行耗时 40 微秒,发送指令后需等待至少 40μs 再发送下一条指令,确保指令生效。
实际开发中最常使用D=1、C=0、B=0,即指令码 00 0000 11100B(0CH),对应 "开启显示、隐藏光标、光标不闪烁",符合常规使用习惯。
2.4.4 功能设定指令
指令功能:功能设定 ------ 用于定义 LCD1602 的核心硬件工作参数,包括数据总线宽度、显示行数、字符点阵格式,是 LCD 初始化阶段必须优先执行的指令;

指令编码(严格对应表格标注):
| 位标识 | 取值 / 标注 | 具体含义 |
|---|---|---|
| RS | 0 | 表示发送的是 "指令"(而非显示数据,RS=1 为发送数据) |
| R/W | 0 | 表示向 LCD "写入" 指令(而非读取状态 / 数据,R/W=1 为读取) |
| DB7~DB5 | 0、0、1 | 固定值,是 "功能设定指令" 的核心标识(区别于清屏、显示开关等其他指令) |
| DB4(DL) | DL(可变) | 数据总线宽度控制:DL=1→8 位总线(用 DB0~DB7);DL=0→4 位总线(仅用 DB4~DB7) |
| DB3(N) | N(可变) | 显示行数控制:N=1→显示 2 行(1602 模块必选);N=0→显示 1 行 |
| DB2(F) | F(可变) | 字符点阵控制:F=1→5×10 点阵;F=0→5×7 点阵(1602 模块常用 5×7,故 F=0) |
| DB1、DB0 | X | 无关位(取值 0/1 均可,不影响指令功能) |
执行时间:表格明确标注为 40μs,发送该指令后需等待至少 40 微秒,再发送下一条指令,确保配置生效。
功能设定指令的固定编码为 RS=0、R/W=0、DB7~DB5=001,核心可变参数为 DL(总线宽度)、N(行数)、F(点阵),DB1/DB0 为任意值;
3. LCD1602 使用
3.1 写时序
要使用 LCD1602,首先需对其初始化,即通过写入一些特定的指令实现,然后选择在 LCD1602 的哪个位置显示并将要显示的数据发送到 LCD 的 DDRAM

使用 LCD1602 通常是写数据进去,很少使用读功能,所以只需要看两个写时序:
写指令字、写数据字
| 时序类型 | 核心用途 | 典型应用场景 |
|---|---|---|
| 写指令字 | 向 LCD1602 发送控制指令,配置 LCD 的工作状态(如初始化、清屏、光标定位) | 功能设定(38H)、清屏(01H)、显示开关控制、设置 DDRAM 地址 |
| 写数据字 | 向 LCD1602 发送要显示的字符数据(ASCII 码),最终在屏幕上显示对应字符 | 发送 0x30 显示数字 0、0x41 显示字母 A、0x20 显示空格 |
| 时序类型 | RS 电平 | R/W 电平 | 数据总线(DB0~DB7)内容 |
|---|---|---|---|
| 写指令字 | 0 | 0 | 8 位指令码(如清屏指令 00000001) |
| 写数据字 | 1 | 0 | 8 位字符 ASCII 码(如字母 A=01000001) |
无论是写指令还是写数据,时序流程完全一致(仅 RS 电平不同),可按以下固定步骤执行:
- 拉低使能(E 引脚):先将 E 引脚置低,准备向数据总线送数据;
- 设置 RS、R/W 电平 :
- 写指令:RS=0,R/W=0;
- 写数据:RS=1,R/W=0;
- 输出 8 位数据到 DB0~DB7:将指令码 / ASCII 码放到 8 位数据总线;
- 拉高 E 引脚:产生高电平脉冲,触发 LCD 读取数据总线的内容;
- 拉低 E 引脚:完成一次写入操作;
- 等待执行时间:根据指令 / 数据类型等待对应时间(如写指令 40μs、清屏 1.64ms,写数据无需额外等待)。
3.2 时序图
关键时序参数含义(图中标注的时间参数)
| 参数 | 核心含义 |
|---|---|
| tSP1 | RS/R/W 电平稳定后,到 E 信号上升沿的最小时间(确保 LCD 先识别控制信号状态); |
| tSP2 | DB0~DB7 数据稳定后,到 E 信号上升沿的最小时间(确保数据就绪后 LCD 再读取); |
| tpw | E 信号高电平的持续时间(脉冲宽度,是 LCD 有效读取数据的核心时间); |
| tR | E 信号从低电平到高电平的上升沿过渡时间; |
| tHD1 | E 信号下降沿后,RS/R/W 电平需保持稳定的最小时间; |
| tHD2 | E 信号下降沿后,DB0~DB7 数据需保持有效的最小时间; |
| tC | 单次写操作的总周期时间(从控制信号 / 数据稳定到本次操作结束的完整时间); |


写操作的核心时序逻辑
LCD1602 写操作的底层要求是 "先稳控制 / 数据,再触发读取,最后延迟撤销":
- 先稳定 RS(指令 0 / 数据 1)、R/W(固定 0)电平,同时让 DB0~DB7 输出有效数据
- 等待 tSP1/tSP2 后,拉高 E 信号产生上升沿,LCD 开始准备读取
- 保持 E 高电平 tpw 时间,LCD 完成数据采样
- 拉低 E 信号产生下降沿,之后仍需保持 RS/R/W、DB0~DB7 稳定 tHD1/tHD2 时间
- 单次写操作完成(总耗时 tC)