ST7789 是一款常见的 240x240 或 240x320 像素的彩色液晶显示屏驱动芯片,通常用于小型 TFT LCD 屏幕。它支持 RGB 24 位的色深,可以显示丰富的彩色图像和文本。ST7789 采用的是 SPI(串行外设接口)通信协议,通过与微控制器(如 Arduino、ESP32 等)连接进行控制。下面简要介绍其工作原理和驱动函数。
驱动原理
接口通信:
SPI 接口:ST7789 支持 SPI(Serial Peripheral Interface)通信,用于与外部控制器(如 Arduino 或 ESP32)进行数据交换。SPI 通常有 4 根信号线:SCK(时钟信号)、MOSI(数据输出)、DC(数据/命令选择)、CS(片选)。
控制模式:
命令模式:发送控制命令,告诉显示器该执行什么操作(如清屏、设置显示方向等)。
数据模式:发送实际显示数据(如颜色数据、像素点数据等)。
ST7789 使用 命令模式 和 数据模式:
显示数据:
ST7789 支持的每个像素点都由 3 个字节的数据组成(RGB),每个字节 8 位。
显示数据是通过 16-bit 或 24-bit 的数据传输给屏幕。
初始化过程:
当设备启动时,ST7789 需要一些初始化命令来设置屏幕的分辨率、方向和其他参数。
这些初始化命令通过 SPI 发送,并配置屏幕的显示参数。
屏幕刷新与显示:
ST7789 可以通过设置命令来选择显示区域(例如设置窗口),然后通过发送像素数据来填充屏幕的区域。
屏幕的更新通常是通过 内存映射 来实现的。数据从控制器传输到显示屏时,ST7789 会更新其显示区域。
命令和数据传输:
命令:在传送命令时,控制信号 DC(数据/命令)设为低电平。
数据:在传送显示数据时,控制信号 DC 设为高电平。
驱动实现
基本所有的屏幕驱动库都支持st7789再加上我自己研究也不太深就直接用官方的库Adafruit ST7735 and ST7789 Library 或者lovyangfx来实现了.在Arduino环境下选择好board之后一般都会有对应板子的pinmap 所以可以直接使用.
Adafruit ST7735 and ST7789 Library
#include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789 #include <SPI.h> // Use dedicated hardware SPI pins Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); GFXcanvas16 canvas(240, 135);
lovyangfx
#define LCD_MOSI_PIN 35 #define LCD_MISO_PIN 37 #define LCD_SCLK_PIN 36 #define LCD_DC_PIN 40 #define LCD_CS_PIN 42 #define LCD_RST_PIN 41 #define LCD_BUSY_PIN -1 #define LCD_BL_PIN 45class LGFX : public lgfx::LGFX_Device{ lgfx::Panel_ST7789 _panel_instance; lgfx::Bus_SPI _bus_instance; lgfx::Light_PWM _light_instance;public: LGFX(void) { { auto cfg = _bus_instance.config(); cfg.pin_mosi = LCD_MOSI_PIN; cfg.pin_miso = LCD_MISO_PIN; cfg.pin_sclk = LCD_SCLK_PIN; cfg.pin_dc = LCD_DC_PIN; cfg.freq_write = 40000000; _bus_instance.config(cfg); _panel_instance.setBus(&_bus_instance); } { auto cfg = _panel_instance.config(); cfg.invert = true; cfg.pin_cs = LCD_CS_PIN; cfg.pin_rst = LCD_RST_PIN; cfg.pin_busy = LCD_BUSY_PIN; cfg.panel_width = 135; cfg.panel_height = 240; cfg.offset_x = 52; cfg.offset_y = 40; _panel_instance.config(cfg); } { auto cfg = _light_instance.config(); cfg.pin_bl = LCD_BL_PIN; cfg.invert = false; // cfg.freq = 44100; cfg.freq = 200; cfg.pwm_channel = 7; _light_instance.config(cfg); _panel_instance.setLight(&_light_instance); } setPanel(&_panel_instance); } };