作为主站的uno开发板向作为从站LILYGO t-diapaly s3开发板,使用IIC通信协议来通信,来发送一个Hello,要求使用TFT_eSPI库来写,为了避免使用 TFT_eSPI 库时屏幕闪烁,怎么写程序
时间: 2024-03-27 14:37:39 浏览: 13
使用TFT_eSPI库可以方便地控制TFT屏幕的显示,但是在使用TFT_eSPI库时,由于每次绘制都会将屏幕上的内容清除并重新绘制,因此会导致屏幕闪烁的问题。为了避免这个问题,我们可以使用双缓冲技术。
下面是使用TFT_eSPI库和双缓冲技术的示例程序:
```c++
#include <Wire.h>
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI(); // 初始化TFT对象
// 定义双缓冲区
uint16_t* frameBuf1;
uint16_t* frameBuf2;
uint16_t* frameBuf;
void setup() {
Wire.begin(); // 初始化I2C总线
tft.init(); // 初始化TFT屏幕
tft.setRotation(1); // 设置屏幕旋转角度
tft.fillScreen(TFT_BLACK); // 填充屏幕颜色为黑色
// 分配内存并初始化缓冲区
frameBuf1 = new uint16_t[tft.width() * tft.height()];
frameBuf2 = new uint16_t[tft.width() * tft.height()];
memset(frameBuf1, 0, tft.width() * tft.height() * 2);
memset(frameBuf2, 0, tft.width() * tft.height() * 2);
frameBuf = frameBuf1;
Wire.beginTransmission(0x3C); // 开始向从站发送数据
Wire.write(0x00); // 设置显示的起始列
Wire.write(0x00);
Wire.write(0x00); // 设置显示的起始行
Wire.write(0x00);
Wire.endTransmission();
}
void loop() {
// 将绘制操作放在另一个缓冲区中
draw(frameBuf == frameBuf1 ? frameBuf2 : frameBuf1);
// 切换缓冲区,显示绘制后的图像
frameBuf = frameBuf == frameBuf1 ? frameBuf2 : frameBuf1;
Wire.beginTransmission(0x3C); // 开始向从站发送数据
Wire.write(0x40); // 设置数据传输模式
for (int i = 0; i < tft.width() * tft.height(); i++) {
Wire.write((frameBuf[i] >> 8) & 0xFF); // 发送高8位数据
Wire.write(frameBuf[i] & 0xFF); // 发送低8位数据
}
Wire.endTransmission();
}
void draw(uint16_t* buf) {
// 在缓冲区中进行绘制操作
tft.fillScreen(TFT_BLACK); // 清除屏幕内容
tft.setCursor(0, 0);
tft.setTextColor(TFT_WHITE);
tft.setTextFont(2);
tft.setTextSize(2);
tft.print("Hello"); // 在TFT屏幕上显示"Hello"
// 将TFT屏幕上的图像复制到缓冲区中
memcpy(buf, tft.frameBuffer(0), tft.width() * tft.height() * 2);
}
```
在上面的示例程序中,我们使用I2C通信协议将主站的Uno开发板和从站的LILYGO t-diapaly s3开发板连接起来。在`loop()`函数中,我们将绘制操作放在另一个缓冲区中,然后将绘制好的图像存储到当前的缓冲区中。接着,我们使用I2C通信协议将缓冲区中的图像发送到从站的开发板上显示。这样,我们就可以避免使用TFT_eSPI库时屏幕闪烁的问题了。