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]
好,就写到这里吧🙂