LCD1602液晶显示器

参考资料

基本介绍

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 上,需要在电路中添加电位器来调整对比度】

image.png

LCD1602 连接和使用

1、硬件连接

1
2
3
4
5
6
LCD1602 (I2C)  Arduino / ESP32
---------------------------------
VCC            5V 3.3V
GND            GND
SDA            A4ESP32: GPIO21
SCL            A5ESP32: GPIO22

这里需要注意,需要支持 I2C,需要选择支持 I2C 的引脚, GPIO 引脚不起作用的


2、查找连接的 I2C 设备

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from machine import Pin, I2C
import time

# 设置I2C引脚
i2c = I2C(0, scl=Pin(22), sda=Pin(21))  # 根据你的硬件连接调整SCL和SDA引脚

# 扫描I2C设备
devices = i2c.scan()
if devices:
    print("I2C devices found:", devices)
else:
    print("No I2C devices found")

返回结果

1
I2C devices found: [39]

所以地址就是 39,而不是 0x39

3、下载并上传 lcd_api.py

参考教程:MicroPython: I2C LCD Display with ESP32/ESP8266 | Random Nerd Tutorials 下载地址:lcd_api.py

Thonny 打开下载的 py 文件,然后另存到 ESP32 上去

image.png

4、下载并上传 machine_i2c_lcd.py

下载地址:machine_i2c_lcd.py

5、显示静态文字

 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
# Rui Santos & Sara Santos - Random Nerd Tutorials
# Complete project details at https://RandomNerdTutorials.com/micropython-i2c-lcd-esp32-esp8266/

from machine import Pin, SoftI2C
from machine_i2c_lcd import I2cLcd
from time import sleep

# Define the LCD I2C address and dimensions
I2C_ADDR = 39
I2C_NUM_ROWS = 2
I2C_NUM_COLS = 16

# Initialize I2C and LCD objects
i2c = SoftI2C(sda=Pin(21), scl=Pin(22), freq=400000)

# for ESP8266, uncomment the following line
#i2c = SoftI2C(sda=Pin(4), scl=Pin(5), freq=400000)

lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS)

lcd.putstr("It's working :)")
sleep(4)

try:
    while True:
        # Clear the LCD
        lcd.clear()
        # Display two different messages on different lines
        # By default, it will start at (0,0) if the display is empty
        lcd.putstr("Hello World!")
        sleep(2)
        lcd.clear()
        # Starting at the second line (0, 1)
        lcd.move_to(0, 1)
        lcd.putstr("Hello World!")
        sleep(2)

except KeyboardInterrupt:
    # Turn off the display
    print("Keyboard interrupt")
    lcd.backlight_off()
    lcd.display_off()

image.png

拓展

驱动起到了什么作用

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 无法工作
Licensed under CC BY-NC-SA 4.0