HD44780 字符 LCD:一个并口控制器的经典握手
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」入门层(beginner)数字逻辑基础第八十三篇。1602、2004 这些能显示 ASCII 字符的小屏,内部都是一颗兼容 HD44780 的控制器。它是练习「GPIO 模拟并行总线时序 + 状态机」最经典的外设,时序比 UART/SPI 更能体现控制信号与数据的配合。
本文要回答的问题
- RS、R/W、E 和 D0–D7 各管什么?一次「写」的信号顺序是什么?
- 4 位模式为什么能省一半引脚?一个字节怎么拆两次送?
- 不读忙标志、纯靠延时可不可行?BF 怎么读?
- 上电初始化的几条命令(0x38/0x28、0x0C、0x01、0x06)在设什么?
- 想在第二行显示、想自定义一个箭头符号,地址怎么算?
一、接口信号:控制 + 8 位数据
| 信号 | 作用 |
|---|---|
| D0–D7 | 8 位双向数据/命令总线 |
| RS | 0=指令寄存器(命令/地址),1=数据寄存器(显示字符) |
| R/W | 0=写控制器,1=读(读忙标志或数据) |
| E | 使能:给出一个正脉冲,下降沿把数据线内容锁进控制器 |
很多省线接法直接把 R/W 接地(只写不读),用固定延时代替忙检测。一次写周期:先设好 RS/R/W → 把字节放上 D0–D7 → E 拉高、维持 ≥ 0.23µs(实际留几 µs)→ E 拉低,控制器在下降沿锁存,随后等待命令执行时间。这正是「控制信号先建立、数据在使能窗内稳定、时钟沿采样」的通用总线范式(对照寄存器映射接口、SDR 沿采样)。
二、4 位模式:一个字节分两次送
GPIO 紧张时用 4 位模式:只接 D4–D7。每个字节要送两次——先送高 4 位 nibble、再送低 4 位,每次都要给一个完整的 E 脉冲;命令和数据都一样拆。注意初始化早期控制器默认按 8 位等待,所以上电的第一条功能设置命令要用 8 位方式发 0x33、0x32 完成切到 4 位的握手,之后才用 4 位通信(数据手册的固定魔术序列)。
三、怎么知道命令执行完:忙标志 vs 死等
清屏(0x01)要约 1.6ms、其他命令约 37µs。两种等待法:
- 读忙标志 BF:RS=0、R/W=1 读,若 D7=1 表示控制器仍在内部操作、不能接收下一条;D7=0 才可发下一条。最省时间,但要求 R/W 可读、要切换 GPIO 方向;
- 固定延时:R/W 直接接地、永远只写,发完每条命令按数据手册死等(清屏等 2ms、其余等 ≥40µs)。接法最简单,绝大多数 GPIO 点灯式项目用这种。
这是「轮询忙信号」和「盲等」的经典取舍(与 valid-ready 的握手思想对照)。
四、初始化序列与显示地址
上电后必须按固定顺序初始化(电源稳定后先等 ≥15ms):
| 命令 | 含义 |
|---|---|
| 0x38 / 0x28 | 功能设置:8 位/4 位总线、2 行显示、5×8 点阵 |
| 0x0C / 0x08 | 显示开/关:0x0C=开显示、关光标;0x0F 带闪烁光标 |
| 0x01 | 清屏并光标回原点(慢,~1.6ms) |
| 0x06 | 输入方式:写一个字符后地址自增、画面不移动 |
显示数据存在 DDRAM:第一行起始地址 0x00、第二行 0x40。发「设置 DDRAM 地址」命令时最高位置 1,故光标定位第一行开头是 0x80、第二行开头是 0x80+0x40 = 0xC0,再写 RS=1 的 ASCII 数据即可显示。CGRAM 则允许自定义 8 个 5×8 字符(写地址 0x40 起、每字符 8 字节点阵),用来画箭头、电量、汉字偏旁等符号。
五、硬件接法与 RTL 化
直连用 6(4 位+RS+E)~11(8 位+RS+RW+E)根 GPIO;更省线的是在模块上加一颗 PCF8574 I2C 转接板,把 4 位总线和 RS/RW/E/背光映射进一个 I2C 字节,主控只要 2 根线——此时协议变成「I2C 传字节 + 字节内 E 位翻转」两层。在 FPGA/RTL 里通常把它做成一个命令/数据 FIFO + 发送状态机:空闲取一条(RS,data),按建立-E 高-E 低-保持的节拍驱动引脚,并内置忙/延时计时,对上层只暴露「写字符」「定位」两个简单操作。
与现有篇目的衔接
总结
一句话总结:HD44780 兼容字符 LCD 用 8 位数据总线 D0–D7 加 RS(0 命令 1 数据)、R/W(0 写 1 读)、E(使能、下降沿锁存)控制,一次写操作要先建立 RS/R/W、再把字节放上数据线、然后给 E 一个正脉冲由控制器在下降沿锁入并等待执行;GPIO 紧张时用 4 位模式只接 D4–D7,把每个字节按高 nibble、低 nibble 分两次送(且上电要按 0x33、0x32 的固定握手切到 4 位);命令执行完的判断既可在 RS=0、R/W=1 时读忙标志(D7=1 忙)以省时间,也可把 R/W 接地永远只写、按数据手册固定死等(清屏约 1.6ms、其余约 37µs),是轮询与盲等的经典取舍;上电须在等电源稳定 15ms 后依次发功能设置(0x38 或 0x28)、显示开关(0x0C)、清屏(0x01)、输入方式(0x06),显示内容存于 DDRAM,用最高位置 1 的地址命令定位(首行 0x80、次行 0xC0),CGRAM 可自定义 8 个 5×8 字符;省线时用 PCF8574 经 I2C 映射 4 位总线和控制位,在 RTL 里通常实现成命令 FIFO 加按建立—使能—保持节拍驱动引脚并内置忙/延时计时的发送状态机,对上只暴露写字符和定位接口。