在完成 ESP32 使用 SPI 读取 SD 卡的学习后,我们进一步探索其在显示领域的应用。1.3 寸 LCD 屏幕凭借小巧便携、显示清晰的特点,常被用于各类嵌入式设备中。通过 ST7789 协议与 ESP32 结合,能够实现丰富的图形、文字显示效果,为项目增添直观的交互界面。本文将详细介绍如何使用 ESP32 通过 ST7789 协议控制 1.3 寸 LCD 屏幕,助你解锁 ESP32 开发的新技能。
一、ST7789 协议与 1.3 寸 LCD 屏幕简介
(一)ST7789 协议
ST7789 是一款用于控制 TFT - LCD(薄膜晶体管液晶显示器)的驱动芯片协议。它支持 SPI 通信方式,通过 SPI 接口可以向 LCD 屏幕发送各种指令和显示数据。该协议具备高速数据传输能力,能够实现流畅的画面显示,并且支持多种显示模式和色彩深度,常见的色彩深度有 16 位 RGB(65K 色),可以满足大多数场景下的显示需求 。
(二)1.3 寸 LCD 屏幕
1.3 寸 LCD 屏幕是基于 ST7789 驱动芯片的 TFT 显示屏,其分辨率通常为 240×240 像素,能够清晰地显示图形、文字和图像。它具有低功耗、高对比度、宽视角等优点,在智能手表、小型仪表、便携式设备等领域应用广泛。
二、硬件连接
在进行硬件连接前,确保准备好以下硬件:
- ESP32 开发板
- 1.3 寸 ST7789 LCD 屏幕模块
- 杜邦线若干
不同的 1.3 寸 LCD 屏幕模块引脚定义可能存在差异,以下是一种常见的 ESP32 与 1.3 寸 ST7789 LCD 屏幕模块的硬件连接方式:
ESP32 引脚 | LCD 屏幕模块引脚 | 说明 |
GPIO18 | SCK | 时钟信号,用于同步数据传输 |
GPIO23 | MOSI | 主设备输出,从设备输入,发送数据到 LCD |
GPIO19 | MISO | 主设备输入,从设备输出(在控制 LCD 时一般不常用) |
GPIO26 | DC | 数据 / 命令选择引脚,高电平表示发送数据,低电平表示发送命令 |
GPIO27 | RST | 复位引脚,低电平复位 LCD 屏幕 |
GPIO5 | CS | 片选信号,低电平选中 LCD 屏幕 |
3.3V | VCC | 电源正极 |
GND | GND | 电源负极 |
连接时需注意:
- 确保电源连接稳定,避免因电压不稳导致屏幕闪烁或无法正常显示。
- 仔细核对引脚连接,错误的连接可能损坏设备,或导致屏幕无法正常工作。
三、开发环境准备
(一)Arduino IDE 配置
若使用 Arduino IDE 进行开发,需确保已正确配置 ESP32 开发环境,具体操作可参考前文《ESP32 入门 (六) 使用 SPI 读取 SD 卡》中 “Arduino IDE 配置” 部分。
(二)TFT_eSPI 库安装
控制 ST7789 LCD 屏幕需要借助 TFT_eSPI 库,该库功能强大,支持多种 TFT - LCD 屏幕驱动芯片。安装步骤如下:
- 打开 Arduino IDE,进入 “工具”>“管理库”。
- 在搜索框中输入 “TFT_eSPI”,找到 “TFT_eSPI by Bodmer” 库。
- 点击 “安装”,等待安装完成。
安装完成后,还需对 TFT_eSPI 库进行配置:
- 在 Arduino IDE 的库文件目录中找到 “TFT_eSPI” 库文件夹(一般在Arduino\libraries\TFT_eSPI路径下)。
- 打开User_Setup_Select.h文件,将#include "User_Setups/Setup21_ST7789_240x240.h"前的注释符号//去掉,该配置文件对应 1.3 寸 ST7789 240×240 分辨率的屏幕 。
- 根据实际硬件连接情况,在Setup21_ST7789_240x240.h文件中修改引脚定义,确保与硬件连接一致。
四、代码实现
以下是使用 ESP32 通过 ST7789 协议控制 1.3 寸 LCD 屏幕显示文字和图形的示例代码:
#include <TFT_eSPI.h>
// 初始化TFT_eSPI对象
TFT_eSPI tft = TFT_eSPI();
void setup() {
Serial.begin(115200);
// 初始化LCD屏幕
tft.init();
// 设置屏幕旋转方向(0度)
tft.setRotation(0);
// 填充屏幕背景色为黑色
tft.fillScreen(TFT_BLACK);
}
void loop() {
// 显示白色文字
tft.setTextColor(TFT_WHITE);
tft.setTextSize(2);
tft.setCursor(50, 50);
tft.println("Hello, ESP32!");
// 绘制红色矩形
tft.drawRect(100, 100, 50, 50, TFT_RED);
// 延时2秒
delay(2000);
// 清空屏幕
tft.fillScreen(TFT_BLACK);
// 显示蓝色文字
tft.setTextColor(TFT_BLUE);
tft.setTextSize(2);
tft.setCursor(30, 30);
tft.println("Welcome to LCD World!");
// 绘制绿色圆形
tft.drawCircle(120, 120, 30, TFT_GREEN);
// 延时2秒
delay(2000);
}
代码解析
- 头文件引入与对象初始化:
#include <TFT_eSPI.h> TFT_eSPI tft = TFT_eSPI();
引入TFT_eSPI.h头文件,并创建TFT_eSPI对象tft,用于后续对 LCD 屏幕的操作。
2. setup函数:
void setup() {
Serial.begin(115200);
// 初始化LCD屏幕
tft.init();
// 设置屏幕旋转方向(0度)
tft.setRotation(0);
// 填充屏幕背景色为黑色
tft.fillScreen(TFT_BLACK);
}
在setup函数中,首先初始化串口用于调试输出。接着调用tft.init()初始化 LCD 屏幕;通过tft.setRotation(0)设置屏幕旋转角度为 0 度;最后使用tft.fillScreen(TFT_BLACK)将屏幕背景填充为黑色,为后续显示做准备。
3. loop函数:
void loop() {
// 显示白色文字
tft.setTextColor(TFT_WHITE);
tft.setTextSize(2);
tft.setCursor(50, 50);
tft.println("Hello, ESP32!");
// 绘制红色矩形
tft.drawRect(100, 100, 50, 50, TFT_RED);
// 延时2秒
delay(2000);
// 清空屏幕
tft.fillScreen(TFT_BLACK);
// 显示蓝色文字
tft.setTextColor(TFT_BLUE);
tft.setTextSize(2);
tft.setCursor(30, 30);
tft.println("Welcome to LCD World!");
// 绘制绿色圆形
tft.drawCircle(120, 120, 30, TFT_GREEN);
// 延时2秒
delay(2000);
}
在loop函数中,先设置文字颜色为白色、文字大小为 2,并指定显示位置,通过tft.println("Hello, ESP32!")显示文字;然后使用tft.drawRect(100, 100, 50, 50, TFT_RED)绘制一个红色矩形。延时 2 秒后,清空屏幕,再以类似方式显示蓝色文字和绘制绿色圆形,不断循环展示不同的显示效果。
五、常见问题及解决方法
- 屏幕无显示:
- 检查硬件连接是否正确,确保所有引脚连接牢固,电源正常供电。
- 确认 TFT_eSPI 库的配置是否正确,引脚定义是否与硬件连接一致。
- 尝试重新复位 ESP32 开发板和 LCD 屏幕,看是否能恢复正常显示。
- 显示内容错乱:
- 检查屏幕分辨率设置是否与实际屏幕一致,在 TFT_eSPI 库的配置文件中进行核对和修改。
- 确认色彩模式设置是否正确,若设置不当可能导致颜色显示异常。
- 检查代码中绘图和文字显示的坐标设置,错误的坐标可能使内容显示在错误位置或重叠。