Skip to content

ST7789V2 如何一步步点亮屏幕并显示颜色?

我们从最简单的"先让屏幕亮起来"开始,一步一步来。

总体学习路线图1


第一步:认识你的 8 个引脚

先把 8 个引脚搞清楚,这是一切的基础。

你的显示屏模块(8个引脚)
┌─────────────────────────────┐
│  引脚名   │  作用             │
├─────────────────────────────┤
│  VCC      │  电源正极 3.3V     │
│  GND      │  电源负极 地       │
│  CS       │  片选(chip select │
│			│   芯片选择,主机选择 │
│			│   与哪块屏幕通信。  │
│  SCK/SCL  │  SPI 时钟信号      │
│  SDA/MOSI │  SPI 数据输入      │
│  DC/RS    │  命令/数据 区分    │  
│  RST      │  复位引脚          │
│  BL       │  背光控制          │
└─────────────────────────────┘

💡 重要认知:BL(背光)和其他引脚是相互独立的。
背光只管"屏幕亮不亮",其他引脚管"屏幕显示什么"。
所以我们第一件事就是先点亮背光

8 个引脚认识


第二步:先点亮 BL 背光引脚

为什么先点背光?

液晶面板本身不发光,就像一块彩色玻璃。没有背光,即使驱动芯片工作正常,你也什么都看不见。所以先点亮背光,确认屏幕硬件没问题。

接线方式

ESP32 开发板          显示屏模块
┌──────────┐          ┌──────────┐
│  3.3V    ├─────────►│  VCC     │
│  GND     ├─────────►│  GND     │
│  GPIO_X  ├─────────►│  BL      │  ← 先接这个!
└──────────┘          └──────────┘

先点亮 BL 背光

⚠️ 注意:不同厂家的屏幕,BL 引脚的点亮电平不同:

  • 有些屏幕 BL 接**高电平(1)**才亮
  • 有些屏幕 BL 接**低电平(0)**才亮
  • 你需要查看你的屏幕说明书,或者两种都试试

[SPI LCD示例]

第三步、你的接线完整对照表(这是我的实际接线图)

完整接线(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);
}

[背光控制代码参考]

此时你应该看到:屏幕发出白色或者均匀的背光,但没有任何图像。 这说明背光正常!

总体学习路线图2

第四步:如何看 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(高电平)  →  你发的是【数据】,比如"像素颜色值"

[SPI LCD详解]

初始化命令与 RGB565 颜色显示


第五步:初始化 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);   // 开启显示(必须!)

[ST7789初始化命令参考]


第六步:让屏幕显示不同颜色

先理解 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步:尝试显示不同颜色、图片、文字……

总体学习路线图3

🎯 建议:先用 ESP-IDF 官方的 spi_lcd_touch 示例工程跑起来,看到屏幕显示内容后,再回头逐行理解代码,这样学习效率最高!

觉醒,然后燎原。 © 2026 门主引擎