成都网站建设高端,大连手机网站建设,seo前景,福州网站如何制作忘记过去#xff0c;超越自己 ❤️ 博客主页 单片机菜鸟哥#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-10-18 ❤️❤️ 本篇更新记录 2023-10-18 ❤️#x1f389; 欢迎关注 #x1f50e;点赞 #x1f44d;收藏 ⭐️留言#x1f4dd;#x1f64… 忘记过去超越自己 ❤️ 博客主页 单片机菜鸟哥一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-10-18 ❤️❤️ 本篇更新记录 2023-10-18 ❤️ 欢迎关注 点赞 收藏 ⭐️留言 此博客均由博主单独编写不存在任何商业团队运营如发现错误请留言轰炸哦及时修正感谢支持 Arduino ESP8266教程累计帮助过超过1W同学入门学习硬件网络编程入选过选修课程刊登过无线电杂志 零基础从入门到熟悉Arduino平台下开发ESP8266同时会涉及网络编程知识。专栏文章累计超过60篇分为基础篇、网络篇、应用篇、高级篇涵盖ESP8266大部分开发技巧。 快速导航 单片机菜鸟的博客快速索引(快速找到你要的)
如果觉得有用麻烦点赞收藏您的支持是博主创作的动力。 文章目录 1. 前言2. 优化前ino代码3. 优化后ino代码 1. 前言 在上一篇 【Arduino TFT】 记录ESP32驱动显示二维码 显示gif动图涉及TFT_eSPI、TJpg_Decoder库、使用python脚本一键生成测试代码 one.h文件内容
编码有点多这里不贴出来。2. 优化前ino代码
#include TFT_eSPI.h
#include SPI.h
#include TJpg_Decoder.h
#include Arduino.h
#include one.h //引入gif生成的.h文件typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
// LCD屏幕相关设置是什么屏幕什么驱动
// 引脚需配置tft_espi库中的 User_Setup.h文件
TFT_eSPI tft TFT_eSPI();
//动画更新时间记录
int Amimate_reflash_Time 0;
int Animate_key -1; //初始化图标显示帧数//从动图数组里面获取一帧图像数据
void imgAnim(const uint8_t **Animate_value, uint32_t *Animate_size){Animate_key;*Animate_value one[Animate_key];*Animate_size one_size[Animate_key];if (Animate_key (sizeof(one)/sizeof(one[0])-1)) //gif动图帧数Animate_key -1;
}// TFT屏幕输出函数
bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t *bitmap){if (y tft.height())return 0;tft.pushImage(x, y, w, h, bitmap);return 1;
}void setup(){Serial.begin(115200);tft.begin();tft.invertDisplay(1); //反转所有显示颜色1反转0正常tft.setRotation(0);tft.fillScreen(0x0000);TJpgDec.setJpgScale(1);TJpgDec.setSwapBytes(true);TJpgDec.setCallback(tft_output);tft.fillScreen(TFT_BLACK);
}void loop(){const uint8_t *Animate_value; //指向关键帧的指针uint32_t Animate_size; //指向关键帧大小的指针if (millis() - Amimate_reflash_Time 30){Amimate_reflash_Time millis();imgAnim(Animate_value, Animate_size);TJpgDec.drawJpg(0, 0, Animate_value, Animate_size);}
}3. 优化后ino代码
#include TFT_eSPI.h
#include SPI.h
#include TJpg_Decoder.h
#include Arduino.h
#include one.h //引入gif生成的.h文件typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
// LCD屏幕相关设置是什么屏幕什么驱动
// 引脚需配置tft_espi库中的 User_Setup.h文件
TFT_eSPI tft TFT_eSPI();
//动画更新时间记录
int Amimate_reflash_Time 0;
int Animate_key -1; //初始化图标显示帧数// DMA 双缓冲模式
// DMA 直接内存搬运技术使数据不经过cpu直接从内存搬运到spi的发送的寄存器里面这样做的好处是减少cpu的负担而且能大大提升显示屏的刷新速率
uint16_t dmaBuffer1[32 * 32]{}; // Toggle buffer for 32*32 MCU block, 1024bytes
uint16_t dmaBuffer2[32 * 32]{}; // Toggle buffer for 32*32 MCU block, 1024bytes
uint16_t *dmaBufferPtr dmaBuffer1;
// 当前使用的DMA缓冲
bool dmaBufferSel 0;//从动图数组里面获取一帧图像数据
void imgAnim(const uint8_t **Animate_value, uint32_t *Animate_size){Animate_key;*Animate_value one[Animate_key];*Animate_size one_size[Animate_key];if (Animate_key (sizeof(one)/sizeof(one[0])-1)) //gif动图帧数Animate_key -1;
}// TFT屏幕输出函数
bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t *bitmap){if (y tft.height())return 0;if (dmaBufferSel) {dmaBufferPtr dmaBuffer2;} else {dmaBufferPtr dmaBuffer1;}dmaBufferSel !dmaBufferSel;tft.pushImageDMA(x, y, w, h, bitmap, dmaBufferPtr);return 1;
}void setup(){Serial.begin(115200);tft.begin();tft.invertDisplay(1); //反转所有显示颜色1反转0正常tft.setRotation(0);tft.initDMA();tft.fillScreen(0x0000);TJpgDec.setJpgScale(1);TJpgDec.setSwapBytes(true);TJpgDec.setCallback(tft_output);tft.fillScreen(TFT_BLACK);
}void loop(){const uint8_t *Animate_value; //指向关键帧的指针uint32_t Animate_size; //指向关键帧大小的指针if (millis() - Amimate_reflash_Time 30){Amimate_reflash_Time millis();imgAnim(Animate_value, Animate_size);// 必须先使用startWrite以便TFT芯片选择保持低的DMA和SPI通道设置保持配置tft.startWrite();// 在左上角的0,0处绘制图像——在这个草图中DMA请求在回调tft_output()中处理TJpgDec.drawJpg(0, 0, Animate_value, Animate_size);// 必须使用endWrite来释放TFT芯片选择和释放SPI通道tft.endWrite();}
}