使用ESP32驱动LCD-ST7789屏幕[ESP--2]

1.54TFT-SPI-ST7789

名称解读

  • 1.54是尺寸,长宽为240*240像素
  • TFT是Thin-Film Transisiter 是屏幕技术的名称:薄膜晶体管,不是很重要
  • SPI 表明该屏幕使用SPI通信协议(这款器件)
  • ST7789 指该屏幕使用驱动芯片ST7789 这款驱动是双协议(IIC和SPI)这款器件很有迷惑性,我一开始不知道它是双协议,所以走了不少弯路
    • 不过正常人类应该不会用100KB/s的IIC去驱动这块屏幕,除非对帧率要求不高

为什么我们不使用IIC去驱动这块屏幕?

我们来估算一下刷新一帧的速度数量级 总像素点:240* 240 每个像素点3个字节(RGB),一个字节8位

总共是240* 240 * 3 * 8=1,380,400 即为138万位
(24/12/17勘误)
值得指出的是,此屏幕的像素点格式是RGB565 ,5位 R 6位 G 5位B 。所以一个像素是2个字节
总共应该是138万的2/3 不过也不小就是了

IIC标准的波特率是100KB/s 相当于13秒才能刷新一帧屏幕,这用鸡毛啊。相比之下SPI的波特率是20~80MHZ/s不要太快

接口解读和驱动方法

接口解读

这块板子可以说是被魔改的SPI通信协议(它确实经常被魔改╰(‵□′)╯)

在这里插入图片描述

重点内容

  • GND 接地,无需多言
  • VCC 供电,3.3V/5V
  • SCL 既是IIC的SCL 接口,又是SPI的MOSI(master out slave in)接口
  • SDA 既是IIC的SDA接口,又是SPI的SCLK(serial clock)接口
  • DC data/comamand指示接口
  • RST 复位接口 低电平器件停止工作
  • CS chip slect SPI的选择接口

不要问SPI标准4线 MOSI,MISO,SCLK ,CS 中的MISO哪里去了,问就是不需要

驱动方法

  • SPI的驱动有两种,一种硬件SPI,一种软件SPI。硬件SPI是IO口本身有支持SPI的硬件,这种速率高稳定性好,一种是软件SPI,就是你可以任意的把几个IO口作为指定的接口(保证你的连线正确)软件驱动IO口模拟SPI发信,这种泛用性广,但是速度不高,稳定性差
  • 下面我们使用软件SPI来做例子
  • 理论情况下,这种的速度不会超过1帧每秒,但是这是做演示的程序
  • 注意你的开发环境
  • 我的是VSCODE+PLATFORMIO+ESP 32
  • 装载了Adafruit_GFX.h库
  • Arduino_ST7789.h是我直接搬移到根目录的文件,资源在网上一搜一堆

在这里插入图片描述

#include <Adafruit_GFX.h>    // Core graphics library by Adafruit
#include <SPI.h>             // SPI communication library
#include "Arduino_ST7789.h"	
#include <chrono>

//帧率计算需要的类
class Timer {
public:
    Timer() : start_timepoint(std::chrono::high_resolution_clock::now()) {}
    
    void reset() {
        start_timepoint = std::chrono::high_resolution_clock::now();
    }
    
    double elapsed() const {
        auto end_timepoint = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double> elapsed_time = end_timepoint - start_timepoint;
        return elapsed_time.count();
    }

private:
    std::chrono::time_point<std::chrono::high_resolution_clock> start_timepoint;
};

Timer timer;

//这个你可以随便变,保证它的连线正确就行
#define TFT_CS     5   // Chip select control pin (VSPI CS)
#define TFT_RST    17  // TFT Reset pin
#define TFT_DC     15  // TFT Data/Command control pin
#define TFT_MOSI   23  // VSPI MOSI pin
#define TFT_SCLK   18  // VSPI SCLK pin

// Initialize the display with hardware SPI
//Arduino_ST7789 tft = Arduino_ST7789(TFT_CS, TFT_DC, TFT_RST);
Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST, TFT_MOSI, TFT_SCLK, TFT_CS); 
//for display with CS pin


void setup() {
  // Initialize Serial for debugging
  Serial.begin(9600);

  // Initialize the VSPI bus
  SPI.begin(TFT_SCLK, -1, TFT_MOSI, TFT_CS);

  // Initialize the display
  tft.init(240, 240); // Initialize ST7789 240x240
  //tft.setRotation(1); // Set orientation


}

void loop() {
   // Clear the screen
  tft.fillScreen(BLACK);

  // Display some text
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.setCursor(20, 20);
  tft.println("Hello, ST7789!");

  // Draw a rectangle
  tft.drawRect(50, 50, 100, 100, WHITE);

  tft.setCursor(0, 0); // 设置文本的起始位置,指的是右上角
  float FPS = 1/(timer.elapsed());
  tft.printf("FPS:%f",FPS);

  timer.reset();

}

效果就是你会看到一帧一帧的画面♪(´▽`)

24/11/26补充,
Arduino_ST7789.h这个库只能实现基本的显示的功能,对于对帧率要求较高的场合其实不太能胜任,楼主最近又研究了一下,TFT_eSPI的功能其实是Arduino_ST7789的10倍甚至20倍,(只是配置有一丁点复杂),如果对这个库感兴趣,可以看看楼主的另一篇文章 :加速你的LCD-ST7789屏幕![ESP–3]
好,就写到这里吧🙂

### ST7789驱动芯片及相关显示屏模块参数 #### 驱动芯片概述 ST7789是一种广泛应用于小型彩色液晶屏的驱动芯片,能够支持多种分辨率的TFT LCD屏幕。其典型应用包括240x240和135x240分辨率的小型高清IPS LCD屏幕[^2]。 #### 主要特性 - **显示技术**:采用IPS(In-Plane Switching)技术,相较于传统TN面板具有更广的视角和更好的色彩表现力[^1]。 - **接口类型**:支持SPI通信协议,便于与各类微控制器连接并传输数据。 - **分辨率支持**: - 常见规格为1.54英寸,分辨率为240x240像素。 - 另有其他尺寸和支持不同分辨率的产品版本,例如Luckfox Pico使用st7789v2屏幕,分辨率为240x280[^5]。 #### 开发环境与工具链 对于不同的硬件平台,已有多个开源项目实现了对ST7789的支持: - **MicroPython开发**:`ST7789_mpy`是一个专为MicroPython设计的C语言驱动库,可高效处理ST7789芯片的功能需求,如屏幕初始化、绘图操作以及颜色管理等[^3]。 - **STM32开发**:通过STM32CubeIDE可以快速构建基于STM32F103C8T6微控制器的ST7789驱动方案。该方法利用了STM32系列的强大性能及其丰富的外设接口来优化显示效果[^4]。 #### 功能特点 以下是部分核心功能描述: - 支持全屏或局部区域填充特定颜色。 - 提供基本图形绘制能力,比如画点、直线及矩形框等功能。 - 实现字节级的数据映射至屏幕缓冲区中以便动态刷新画面内容。 - 定义了一系列标准颜色常量同时也允许用户自定义任意RGB组合的颜色值用于渲染输出图像。 ```c // 示例代码片段展示如何使用 STM32 初始化 ST7789 并设置背景色 void lcd_init(void){ // 设置 SPI 参数... // 发送命令给 ST7789 进行初始化序列配置 send_command(ST7789_SWRESET); // 软重启指令 delay_ms(120); send_command(ST7789_SLPOUT); // 解锁休眠模式 delay_ms(120); set_window(0, 0, WIDTH-1, HEIGHT-1); // 设定窗口大小覆盖整个屏幕范围 clear_screen(BLACK); // 将整块屏幕清空成黑色底色 } ``` 上述函数展示了典型的初始化流程,其中包含了发送必要的控制信号以激活显示屏,并将其调整到最佳工作状态的过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值