ESP32 入门 (七) 通过 ST7789 协议控制 1.3 寸 LCD 屏幕

在完成 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​

电源负极​

连接时需注意:​

  1. 确保电源连接稳定,避免因电压不稳导致屏幕闪烁或无法正常显示。​
  1. 仔细核对引脚连接,错误的连接可能损坏设备,或导致屏幕无法正常工作。​

三、开发环境准备​

(一)Arduino IDE 配置​

若使用 Arduino IDE 进行开发,需确保已正确配置 ESP32 开发环境,具体操作可参考前文《ESP32 入门 (六) 使用 SPI 读取 SD 卡》中 “Arduino IDE 配置” 部分。​

(二)TFT_eSPI 库安装​

控制 ST7789 LCD 屏幕需要借助 TFT_eSPI 库,该库功能强大,支持多种 TFT - LCD 屏幕驱动芯片。安装步骤如下:​

  1. 打开 Arduino IDE,进入 “工具”>“管理库”。​
  1. 在搜索框中输入 “TFT_eSPI”,找到 “TFT_eSPI by Bodmer” 库。​
  1. 点击 “安装”,等待安装完成。​

安装完成后,还需对 TFT_eSPI 库进行配置:​

  1. 在 Arduino IDE 的库文件目录中找到 “TFT_eSPI” 库文件夹(一般在Arduino\libraries\TFT_eSPI路径下)。​
  1. 打开User_Setup_Select.h文件,将#include "User_Setups/Setup21_ST7789_240x240.h"前的注释符号//去掉,该配置文件对应 1.3 寸 ST7789 240×240 分辨率的屏幕 。​
  1. 根据实际硬件连接情况,在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);
}

代码解析​

  1. 头文件引入与对象初始化:
    #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 秒后,清空屏幕,再以类似方式显示蓝色文字和绘制绿色圆形,不断循环展示不同的显示效果。​

五、常见问题及解决方法​

  1. 屏幕无显示:​
  • 检查硬件连接是否正确,确保所有引脚连接牢固,电源正常供电。​
  • 确认 TFT_eSPI 库的配置是否正确,引脚定义是否与硬件连接一致。​
  • 尝试重新复位 ESP32 开发板和 LCD 屏幕,看是否能恢复正常显示。​
  1. 显示内容错乱:​
  • 检查屏幕分辨率设置是否与实际屏幕一致,在 TFT_eSPI 库的配置文件中进行核对和修改。​
  • 确认色彩模式设置是否正确,若设置不当可能导致颜色显示异常。​
  • 检查代码中绘图和文字显示的坐标设置,错误的坐标可能使内容显示在错误位置或重叠。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值