ST7789V2 如何一步步点亮屏幕并显示颜色?
我们从最简单的"先让屏幕亮起来"开始,一步一步来。

第一步:认识你的 8 个引脚
先把 8 个引脚搞清楚,这是一切的基础。
你的显示屏模块(8个引脚)
┌─────────────────────────────┐
│ 引脚名 │ 作用 │
├─────────────────────────────┤
│ VCC │ 电源正极 3.3V │
│ GND │ 电源负极 地 │
│ CS │ 片选(chip select │
│ │ 芯片选择,主机选择 │
│ │ 与哪块屏幕通信。 │
│ SCK/SCL │ SPI 时钟信号 │
│ SDA/MOSI │ SPI 数据输入 │
│ DC/RS │ 命令/数据 区分 │
│ RST │ 复位引脚 │
│ BL │ 背光控制 │
└─────────────────────────────┘💡 重要认知:BL(背光)和其他引脚是相互独立的。
背光只管"屏幕亮不亮",其他引脚管"屏幕显示什么"。
所以我们第一件事就是先点亮背光!

第二步:先点亮 BL 背光引脚
为什么先点背光?
液晶面板本身不发光,就像一块彩色玻璃。没有背光,即使驱动芯片工作正常,你也什么都看不见。所以先点亮背光,确认屏幕硬件没问题。
接线方式
ESP32 开发板 显示屏模块
┌──────────┐ ┌──────────┐
│ 3.3V ├─────────►│ VCC │
│ GND ├─────────►│ GND │
│ GPIO_X ├─────────►│ BL │ ← 先接这个!
└──────────┘ └──────────┘
⚠️ 注意:不同厂家的屏幕,BL 引脚的点亮电平不同:
- 有些屏幕 BL 接**高电平(1)**才亮
- 有些屏幕 BL 接**低电平(0)**才亮
- 你需要查看你的屏幕说明书,或者两种都试试
第三步、你的接线完整对照表(这是我的实际接线图)
完整接线(8 根线全部接上)
ESP32 开发板 显示屏模块(ST7789V2)
┌──────────────┐ ┌──────────┐
│ 3.3V ├─────────►│ VCC │ 电源
│ GND ├─────────►│ GND │ 地
│ GPIO(BL) ├─────────►│ BL │ 背光(Background Light)
│ GPIO(CS) ├─────────►│ CS │ 片选(Chip Select)
│ GPIO(DC) ├─────────►│ DC │ 命令/数据(Data/Command)
│ GPIO(RST) ├─────────►│ RST │ 硬件复位(Reset)
│ GPIO(SDA) ├─────────►│ SDA │ SPI 数据(MOSI——Master Output Slave Input)
│ GPIO(SCL) ├─────────►│ SCL │ SPI 时钟 (SCLK/SLC)
└──────────────┘ └──────────┘[接线参考]
💡 小白提示:GPIO 编号你可以自由选择(避开特殊功能引脚),然后在代码里对应写上就行。
ESP32-S3 开发板 显示屏模块(ST7789V2)
┌─────────────────┐ ┌──────────┐
│ 3.3V ├─────────►│ VCC │ 电源 3.3V
│ GND ├─────────►│ GND │ 地
│ GPIO 12 ├─────────►│ SCLK │ SPI 时钟
│ GPIO 11 ├─────────►│ MOSI │ SPI 数据(SDA)
│ GPIO 13 ├─────────►│ RST │ 复位
│ GPIO 14 ├─────────►│ DC │ 命令/数据选择
│ GPIO 10 ├─────────►│ CS │ 片选信号
│ GPIO 9 ├─────────►│ BL │ 背光控制
└─────────────────┘ └──────────┘⚠️ 注意:VCC 必须接 3.3V,不能接 5V,否则会烧坏屏幕模块!
点亮背光的代码
c
#include "driver/gpio.h"
#define PIN_BL GPIO_NUM_9 // 你接 BL 的 GPIO 编号,根据实际修改
void app_main(void)
{
// 配置 BL 引脚为输出模式
gpio_config_t bk_gpio_config = {
.mode = GPIO_MODE_OUTPUT,
.pin_bit_mask = 1ULL << PIN_BL
};
gpio_config(&bk_gpio_config);
// 输出高电平点亮背光(如果不亮就改成 0 试试)
gpio_set_level(PIN_BL, 1);
}[背光控制代码参考]
此时你应该看到:屏幕发出白色或者均匀的背光,但没有任何图像。 这说明背光正常!

第四步:如何看 ST7789 数据手册?
数据手册很厚,小白不需要全看,只需要关注以下几个关键部分:
你需要找的内容
数据手册目录中重点关注:
┌────────────────────────────────────────┐
│ 1. Pin Description(引脚描述) │ ← 确认每个引脚功能
│ 2. Interface Selection(接口选择) │ ← 确认 SPI 模式怎么选
│ 3. Command Table(命令表) │ ← 最重要!所有命令在这里
│ - 0x11 SLPOUT 退出睡眠 │
│ - 0x29 DISPON 开启显示 │
│ - 0x2A CASET 设置列地址 │
│ - 0x2B RASET 设置行地址 │
│ - 0x2C RAMWR 写入像素数据 │
│ - 0x3A COLMOD 设置色彩格式 │
│ 4. Timing Diagram(时序图) │ ← 了解 SPI 通信时序
└────────────────────────────────────────┘DC 引脚的关键理解
这是 SPI LCD 最容易让小白困惑的地方:
DC = 0(低电平) → 你发的是【命令】,比如"设置显示区域"
DC = 1(高电平) → 你发的是【数据】,比如"像素颜色值"
第五步:初始化 ST7789 让屏幕工作
初始化就是按顺序给 ST7789 发一串命令,告诉它"你好,准备工作吧"。
初始化的关键命令序列
c
// ST7789 初始化命令序列(核心部分)
LCD_WRITE_CMD(0x3A); // 设置色彩格式
LCD_WRITE_DATA(0x05); // 0x05 = RGB565(每像素16位)
LCD_WRITE_CMD(0xB2); // Porch 设置
LCD_WRITE_DATA(0x0C);
LCD_WRITE_DATA(0x0C);
LCD_WRITE_DATA(0x00);
LCD_WRITE_DATA(0x33);
LCD_WRITE_DATA(0x33);
LCD_WRITE_CMD(0x11); // 退出睡眠模式(必须!)
// 等待 100ms
LCD_WRITE_CMD(0x29); // 开启显示(必须!)第六步:让屏幕显示不同颜色
先理解 RGB565 色彩格式
你的屏幕用 RGB565 格式,每个像素用 16位(2字节) 表示颜色:
16位 = 5位红色 + 6位绿色 + 5位蓝色
常用颜色对照:
┌──────────┬────────────┐
│ 颜色 │ RGB565值 │
├──────────┼────────────┤
│ 红色 │ 0xF800 │
│ 绿色 │ 0x07E0 │
│ 蓝色 │ 0x001F │
│ 白色 │ 0xFFFF │
│ 黑色 │ 0x0000 │
│ 黄色 │ 0xFFE0 │
└──────────┴────────────┘c
// 修改上面代码中的颜色值,就能显示不同颜色
#define COLOR_RED 0xF800 // 红色
#define COLOR_GREEN 0x07E0 // 绿色
#define COLOR_BLUE 0x001F // 蓝色
#define COLOR_WHITE 0xFFFF // 白色
#define COLOR_BLACK 0x0000 // 黑色
#define COLOR_YELLOW 0xFFE0 // 黄色
#define COLOR_CYAN 0x07FF // 青色
#define COLOR_PURPLE 0xF81F // 紫色显示纯色的完整流程
c
#include "driver/gpio.h"
#include "driver/spi_master.h"
#include "esp_lcd_panel_io.h"
#include "esp_lcd_panel_vendor.h"
#include "esp_lcd_panel_ops.h"
// ===== 你的引脚定义 =====
#define PIN_BL GPIO_NUM_9
#define PIN_CS GPIO_NUM_10
#define PIN_MOSI GPIO_NUM_11
#define PIN_SCLK GPIO_NUM_12
#define PIN_RST GPIO_NUM_13
#define PIN_DC GPIO_NUM_14
// ===== 屏幕参数 =====
#define LCD_H_RES 240
#define LCD_V_RES 320
#define LCD_HOST SPI2_HOST
void app_main(void)
{
// ── 第1步:配置并点亮背光 ──────────────────────────
gpio_config_t bk_gpio_config = {
.mode = GPIO_MODE_OUTPUT,
.pin_bit_mask = 1ULL << PIN_BL
};
ESP_ERROR_CHECK(gpio_config(&bk_gpio_config));
gpio_set_level(PIN_BL, 0); // 初始化期间先关闭背光,避免花屏
// ── 第2步:初始化 SPI 总线 ─────────────────────────
spi_bus_config_t buscfg = {
.sclk_io_num = PIN_SCLK,
.mosi_io_num = PIN_MOSI,
.miso_io_num = -1, // 不需要读取数据,设为 -1
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = LCD_H_RES * 80 * sizeof(uint16_t),
};
ESP_ERROR_CHECK(spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO));
// ── 第3步:挂载 LCD IO 设备 ────────────────────────
esp_lcd_panel_io_handle_t io_handle = NULL;
esp_lcd_panel_io_spi_config_t io_config = {
.dc_gpio_num = PIN_DC,
.cs_gpio_num = PIN_CS,
.pclk_hz = 40 * 1000 * 1000, // SPI 时钟 40MHz
.lcd_cmd_bits = 8,
.lcd_param_bits = 8,
.spi_mode = 0,
.trans_queue_depth = 10,
};
ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(
(esp_lcd_spi_bus_handle_t)LCD_HOST, &io_config, &io_handle));
// ── 第4步:安装 ST7789 驱动 ────────────────────────
esp_lcd_panel_handle_t panel_handle = NULL;
esp_lcd_panel_dev_config_t panel_config = {
.reset_gpio_num = PIN_RST,
.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_BGR, // ST7789V2 通常用 BGR
.bits_per_pixel = 16, // RGB565 格式
};
ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(
io_handle, &panel_config, &panel_handle));
// ── 第5步:复位并初始化屏幕 ───────────────────────
ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle));
ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle));
ESP_ERROR_CHECK(esp_lcd_panel_invert_color(panel_handle, true)); // ST7789V2 通常需要反色
ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_handle, true)); // 开启显示
// ── 第6步:点亮背光 ───────────────────────────────
gpio_set_level(PIN_BL, 1); // 屏幕初始化完成后再开背光
// ── 第7步:填充纯色(显示红色) ──────────────────
uint16_t *color_buf = heap_caps_malloc(
LCD_H_RES * 80 * sizeof(uint16_t), MALLOC_CAP_DMA);
// 填充红色 RGB565 = 0xF800
for (int i = 0; i < LCD_H_RES * 80; i++) {
color_buf[i] = 0xF800;
}
// 分批写入(每次写80行,节省内存)
for (int y = 0; y < LCD_V_RES; y += 80) {
esp_lcd_panel_draw_bitmap(
panel_handle,
0, y, // 起始坐标 (x, y)
LCD_H_RES, y + 80, // 结束坐标
color_buf);
}
free(color_buf);
}[像素写入参考]
使用 ESP-IDF 高层 API 更简单
c
// 初始化 SPI 总线
spi_bus_config_t buscfg = {
.sclk_io_num = PIN_SCK,
.mosi_io_num = PIN_MOSI,
.miso_io_num = -1,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = 240 * 320 * 2,
};
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO);
// 挂载 ST7789 驱动
esp_lcd_panel_dev_config_t panel_config = {
.reset_gpio_num = PIN_RST,
.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB,
.bits_per_pixel = 16,
};
esp_lcd_new_panel_st7789(io_handle, &panel_config, &panel_handle);
// 初始化并点亮
esp_lcd_panel_reset(panel_handle);
esp_lcd_panel_init(panel_handle);
esp_lcd_panel_disp_on_off(panel_handle, true);
// 显示红色!
uint16_t *color_data = malloc(240 * 320 * sizeof(uint16_t));
for (int i = 0; i < 240 * 320; i++) {
color_data[i] = 0xF800; // 红色
}
esp_lcd_panel_draw_bitmap(panel_handle, 0, 0, 240, 320, color_data);[完整示例参考]
总结:你的学习路线图
第1步:接好 VCC 和 GND,确认供电正常
↓
第2步:接 BL 引脚,写代码点亮背光,看到屏幕发光
↓
第3步:接完剩余 5 根 SPI 引脚(RST/DC/CS/SCK/MOSI)
↓
第4步:初始化 SPI 总线 + 加载 ST7789 驱动
↓
第5步:发送初始化命令序列,让 ST7789 退出睡眠、开启显示
↓
第6步:设置显示区域,写入像素颜色数据,看到纯色画面!
↓
第7步:尝试显示不同颜色、图片、文字……
🎯 建议:先用 ESP-IDF 官方的
spi_lcd_touch示例工程跑起来,看到屏幕显示内容后,再回头逐行理解代码,这样学习效率最高!
