参考资料
- MicroPython: I2C LCD Display with ESP32/ESP8266 | Random Nerd Tutorials
- Keywords:ESP32 LCD1602 micropython
基本介绍
LCD1602 是一款 16 列 × 2 行 的字符型液晶显示屏,常用于单片机、Arduino、树莓派等开发板的文本显示。它可以显示 英文、数字、符号,但不能直接显示图像。
接口类型
LCD1602 有两种主要的通信方式【这里用的是 I²C 接口】:
- 并行接口(4 位或 8 位模式,标准 HD44780 控制器)
- 需要 多个 GPIO 口 进行连接,数据传输速度快,但占用的引脚较多。
- I²C 接口(常见的是带 PCF8574 I2C 模块)
- 仅需 SDA(数据) 和 SCL(时钟)两个引脚,大大减少了 IO 口的占用,使用更方便。
如果是 并口版本,一般有以下 16 个引脚:
引脚 | 说明 | 备注 |
---|---|---|
VSS | 电源地 | 接 GND |
VDD | 电源正 | 一般接 5V(部分可 3.3V) |
V0 | 对比度调节 | 需接 电位器 调节 |
RS | 寄存器选择 | 0=指令,1=数据 |
RW | 读/写选择 | 0=写入,1=读取(一般接 GND 使能写入) |
E | 使能信号 | 高电平触发 |
D0-D7 | 数据线 | 4 位模式用 D4-D7,8 位模式用 D0-D7 |
A | 背光电源正 | 接 5V |
K | 背光电源地 | 接 GND |
如果是 I²C 版本(带 PCF8574 扩展板),只保留 4 个引脚:
- VCC:接 5V,部分可接 3.3V
- GND:接地
- SDA:数据线
- SCL:时钟线
这里使用的是带 I2C 驱动器的 LCD;驱动器上配置了一个电位器,可用于调整 LCD 上背景和字符之间的对比度【在没有 I2C 支持的“普通”LCD 上,需要在电路中添加电位器来调整对比度】
LCD1602 连接和使用
1、硬件连接
|
|
这里需要注意,需要支持 I2C,需要选择支持 I2C 的引脚, GPIO 引脚不起作用的
2、查找连接的 I2C 设备
|
|
返回结果
|
|
所以地址就是 39,而不是 0x39
3、下载并上传 lcd_api.py
参考教程:MicroPython: I2C LCD Display with ESP32/ESP8266 | Random Nerd Tutorials 下载地址:lcd_api.py
Thonny 打开下载的 py 文件,然后另存到 ESP32 上去
4、下载并上传 machine_i2c_lcd.py
下载地址:machine_i2c_lcd.py
5、显示静态文字
|
|
拓展
驱动起到了什么作用
ESP32 通过 I2C 总线(SDA/SCL) 与 PCF8574 I/O 扩展芯片 进行通信,控制 LCD1602
- LCD1602 本身是 并行接口 的字符液晶模块,它通常需要 8 个数据位 + 控制位(RS、RW、E) 来进行操作。如果直接使用 ESP32 控制,会占用大量的 GPIO 口【如果直接使用 并行接口 控制 LCD1602,理论上是不需要额外的驱动库的,因为可以直接使用 GPIO 发送命令和数据】
- 如果 LCD1602 连接了 I2C 扩展模块(如 PCF8574 芯片),它就可以通过 I2C 总线(SDA/SCL)进行通信,这样就减少了引脚使用
方法 | GPIO 口占用 | 代码复杂度 | 适用场景 |
---|---|---|---|
使用 I2C 驱动(推荐) | 仅 2 根线 | 简单,调用 Python 函数即可 | 适合 ESP32,节省引脚 |
直接用 GPIO(无驱动) | 6~8 根线 | 复杂,手动写 LCD 指令 | 适用于无 I2C 模块的 LCD1602 |
在 ESP32 + LCD1602 I2C 方案中,驱动的作用是:
- 简化代码(不需要手写 LCD 指令)
- 节省 GPIO(只用 SDA & SCL)
- 封装 LCD 控制逻辑(不用自己算指令)
PCF8574 在 LCD1602 I2C 中的作用
PCF8574 是一颗 I2C 转 8 位 GPIO 的 I/O 扩展芯片,在 LCD1602 I2C 版本的模块上,它的作用主要是:
- 扩展 ESP32 的 I/O 端口,从而用 I2C 控制 LCD1602,节省 GPIO 资源。
- 将 ESP32 发送的 I2C 信号转换为 LCD1602 需要的并行信号(数据和命令)。
- 适配不同的电平,确保 ESP32(3.3V)能够控制 LCD1602(5V)。
如果不用 PCF8574,而是直接用 GPIO 并行控制 LCD1602,就不需要 I2C 驱动,但会占用更多的 GPIO,并且需要自己写 LCD1602 驱动代码
那使用这种方式相对于直接并行接口来说有什么缺点呢:
- 速度比直接并行模式慢(因为 I2C 速度受限)
- 需要额外的 I2C 驱动代码
- 如果 I2C 地址不匹配,可能导致 LCD 无法工作