这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » [Let'sDo第3期]4.讲解ST7789彩屏的驱动原理,介绍驱动函数

共1条 1/1 1 跳转至

[Let'sDo第3期]4.讲解ST7789彩屏的驱动原理,介绍驱动函数

菜鸟
2024-12-05 14:37:30     打赏

ST7789 是一款常见的 240x240 或 240x320 像素的彩色液晶显示屏驱动芯片,通常用于小型 TFT LCD 屏幕。它支持 RGB 24 位的色深,可以显示丰富的彩色图像和文本。ST7789 采用的是 SPI(串行外设接口)通信协议,通过与微控制器(如 Arduino、ESP32 等)连接进行控制。下面简要介绍其工作原理和驱动函数。

驱动原理

  1. 接口通信

    1. SPI 接口:ST7789 支持 SPI(Serial Peripheral Interface)通信,用于与外部控制器(如 Arduino 或 ESP32)进行数据交换。SPI 通常有 4 根信号线:SCK(时钟信号)、MOSI(数据输出)、DC(数据/命令选择)、CS(片选)。

  2. 控制模式

    • 命令模式:发送控制命令,告诉显示器该执行什么操作(如清屏、设置显示方向等)。

    • 数据模式:发送实际显示数据(如颜色数据、像素点数据等)。

    1. ST7789 使用 命令模式数据模式

  3. 显示数据

    1. ST7789 支持的每个像素点都由 3 个字节的数据组成(RGB),每个字节 8 位。

    2. 显示数据是通过 16-bit 或 24-bit 的数据传输给屏幕。

  4. 初始化过程

    1. 当设备启动时,ST7789 需要一些初始化命令来设置屏幕的分辨率、方向和其他参数。

    2. 这些初始化命令通过 SPI 发送,并配置屏幕的显示参数。

  5. 屏幕刷新与显示

    1. ST7789 可以通过设置命令来选择显示区域(例如设置窗口),然后通过发送像素数据来填充屏幕的区域。

    2. 屏幕的更新通常是通过 内存映射 来实现的。数据从控制器传输到显示屏时,ST7789 会更新其显示区域。

  6. 命令和数据传输

    1. 命令:在传送命令时,控制信号 DC(数据/命令)设为低电平。

    2. 数据:在传送显示数据时,控制信号 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);
    }
};



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]