摘要:对于模式开发的屏幕开发既便捷又稳定。同时开发的底层驱动接口也是使用库的。库安装以及配置基于讲解。直接在文件中取消驱动芯片的头文件注释即可。默认情况下,精灵使用位颜色,位深度可以设置为位色或位任意种颜色以减少所需的。
TFT_eSPI库是通过SPI方式驱动LCD屏幕的一个Arduino库,并且支持PlatformIOIDE一键下载使用。对于Arduino模式开发的屏幕开发既便捷又稳定。
同时LVGLGUI开发的底层驱动接口也是使用TFT_eSPI库的API。
基于PlatformIO IDE 讲解。
首先在Libraries里面搜索安装TFT_eSPI库到你的工程文件里面。
有两种方法,一种就是通过
User_Setup_.h
进行配置,可以配置驱动型号以及所有需要修改的信息。
另一种就是在User_Setup_Select.h
中先选择驱动芯片型号,然后在TFT_Driver
文件夹中的驱动配置文件中配置各种信息。
首先选择驱动型号 如:#define ST7789_2_DRIVER
,将注释去掉即可。
配置屏幕大小
设置GBR显示的LCD屏幕的显示转换
配置引脚
文件中已经定义好了可以使用的引脚,如果需要修改的话,取消注释后修改相应引脚的值即可
配置SPI速率
设置SPI的通信速率,根据硬件芯片的性能设置(一般保持默认即可)
对于学习,小作品开发不推荐,最好在
User_Setup.h
中进行配置,便于修改和查找。
//屏幕选择函数TFT_eSPI tft = TFT_eSPI();tft.setRotation(4);//1-3是90度到270度旋转/*要实现镜像的话需要在驱动的Rotation.h里面进行设置在switch语句中添加case 4选项代码如下*/ case 4: // Inverter portrait & Mirror Y#ifdef CGRAM_OFFSET if (_init_width == 135) { colstart = 53; rowstart = 40; } else { colstart = 0; rowstart = 0; }#endif writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER); _width = _init_width; _height = _init_height; break;/*然后使用函数tft.setRotation(4);即可。*/
TFT_eSPI::TFT_eSPI(int16_t w, int16_t h)//设定屏幕大小TFT_eSPI tft = TFT_eSPI(240, 240);
参数:宽度和高度
tft.init();
tft.serRotation(3);
参数为:0, 1, 2, 3 分别代表 0°、90°、180°、270°,可设置4为镜像。
uint16_t TFT_eSPI::color565(uint8_t r, uint8_t g, uint8_t b)// 颜色转换uint16_t yellow = tft.color565(255, 255, 0);tft.setTextColor(yellow); //
void TFT_eSPI::fillScreen(uint32_t color)//清理屏幕 默认颜色,可以设置不同的颜色tft.fillScreen(TFT_BLACK);
void TFT_eSPI::setTextSize(uint8_t s)//设置字体大小为2tft.setTextSize(2);void TFT_eSPI::setTextColor(uint16_t c)//字体颜色 绿色tft.setTextColor(TFT_GREEN);void TFT_eSPI::setCursor(int16_t x, int16_t y)//设置文字开始坐标(0,0)tft.setCursor(0, 0);void TFT_eSPI::setTextDatum(uint8_t d)// 引用数据tft.setTextDatum(MC_DATUM);int16_t TFT_eSPI::drawString(const String& string, int32_t poX, int32_t poY)//显示文字 Moonbeam (10,10)位置tft.drawString("Moonbeam ", 10, 10);/*此外还有文字居中,居右,绘制浮点数或者整数等函数都位于 头文件 TFT_eSPI.h 中*/
图片取模的画,好多博客,按照bmp格式取RGB565的数组即可
如果要显示jpg图片的话需要用到图片解码库
/* */void TFT_eSPI::setSwapBytes(bool swap)// 开启显示,一般需要图片显示的时候都加上这个函数即可tft.setSwapBytes(true);void TFT_eSPI::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color)void TFT_eSPI::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor, uint16_t bgcolor)
uint16_t TFT_eSPI::alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc)// 半透明颜色 tft.alphaBlend(a, TFT_RED, TFT_WHITE);void TFT_eSPI::drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color)//绘制线 tft.drawFastHLine(204, a, 12, tft.alphaBlend(a, TFT_RED, TFT_WHITE));void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color)//画点tft.drawPixel(204,10,TFT_RED);//画竖线void TFT_eSPI::drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color)//画圆void TFT_eSPI::drawCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color)tft.drawCircle(100,100,50,TFT_RED);//画实心圆void TFT_eSPI::fillCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color)//画矩形void TFT_eSPI::drawRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color)void TFT_eSPI::fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color)//画三角型void TFT_eSPI::drawTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color)void TFT_eSPI::fillTriangle( int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color)
Sprite 理论上是一个不可见的图形屏幕,它保存在处理器 RAM 中。图形可以绘制到 Sprite 中,就像它们可以直接绘制到屏幕上一样。Sprite 完成后,可以将其绘制到屏幕上的任何位置。如果有足够的 RAM,则 Sprite 可以与屏幕大小相同并用作帧缓冲区。默认情况下,精灵使用 16 位颜色,位深度可以设置为 8 位(256 色)或 1 位(任意 2 种颜色)以减少所需的 RAM。在 ESP8266 上,可以创建的最大 16 位彩色 Sprite 大约为 160x128 像素,这会消耗 40 KB 的 RAM。在 ESP32 上,16 位色深的 Sprite 限制为约 200x200 像素(~ 80KB),8 位色深的 sprite 限制为 320x240 像素(~76KB)。
可以创建一个或多个Sprite ,Sprite 可以是任何像素宽度和高度,仅受可用 RAM 的限制。16 位色深 Sprite 所需的 RAM 为(2 x 宽 x 高)字节,8 位色深 Sprite 所需的 RAM 为(宽 x 高)字节。 Sprite 可以根据需要在程序中动态创建和删除,这意味着可以在 Sprite 绘制在屏幕上后释放 RAM,然后可以运行更多 RAM 密集型基于 WiFi 的代码,并且正常的图形操作仍然可以工作。
将图形绘制到Sprite 中的速度非常快,对于熟悉示例 Adafruit “graphicstest”的人来说,用 160x128 Sprite 可以在 18ms 内完成整个测试。Sprite 使用示例可以在“examples/Sprite”文件夹中找到。Sprite 可以绘制到 TFT 中,其中一种颜色被指定为“透明”,这需要看 Transparent_Sprite_Demo 示例。
如果 ESP32 开发板安装了 SPIRAM(即 PSRAM),那么 Sprite 将使用 PSRAM 内存,并且可以创建大型全屏缓冲区 Sprite。全屏Sprite需要更长的时间来渲染(320 x 240 16 位Sprite大约需要 45 毫秒)!!!
------------------官方解释--------------------------
人话:可以解决刷新闪屏的问题-暂时就这样。
/*实例化*/TFT_eSprite clk = TFT_eSprite(&tft);//创建一个 宽x高像素 的sprite,返回一个指向RAM的指针//如果需要,Sketch 可以将返回值转换为 (uint16_t*) 以获得 16 位深度void* createSprite(int16_t width, int16_t height, uint8_t frames = 1);void* getPointer(void);//如果未创建,则返回一个指向精灵或 nullptr 的指针,用户必须转换为指针类型bool created(void); //如果精灵已经创建,则返回真void deleteSprite(void);//删除精灵以释放 RAM //设置或获取颜色深度为 4、8 或 16 位。可用于更改现有精灵的深度,但会将其清除为黑色,如果重新创建精灵,则返回一个新指针。 void* setColorDepth(int8_t b);int8_t getColorDepth(void);void drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t font);//在 Adafruit GLCD 或 freefont 中绘制单个字符//在屏幕上绘制一个 unicode 字形。任何 UTF-8 解码都必须在调用 drawChar() 之前完成 int16_t drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font);int16_t drawChar(uint16_t uniCode, int32_t x, int32_t y);//设置滚动区域,从左上角定义x,y,宽度和高度。颜色(可选,默认为黑色)用于填充滚动后的间隙void setScrollRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t color = TFT_BLACK);//滚动 定义区域 dx,dy 像素。负值向上、左滚动;正值向右、下滚动。向上、向下滚动是可选的(默认是没有向上/向下滚动)。//Sprite 坐标系不移动,移动的是像素void scroll(int16_t dx, int16_t dy = 0),void setRotation(uint8_t rotation);//设置Sprite 的旋转坐标(仅适用于 1位色深的Sprite ) 显示器内部硬件中的 CGRAM 旋转uint8_t getRotation(void);//将 Sprite 的旋转副本推送到具有可选透明颜色的 TFT bool pushRotated(int16_t angle, uint32_t transp = 0x00FFFFFF); // Using fixed point maths//将 Sprite 的旋转副本推送到另一个具有可选透明颜色的不同 Spritebool pushRotated(TFT_eSprite *spr, int16_t angle, uint32_t transp = 0x00FFFFFF); //获取此 Sprite 旋转副本的 TFT 边界框 bool getRotatedBounds(int16_t angle, int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y);//获取此 Sprite 的旋转副本的目标 Sprite 边界框bool getRotatedBounds(TFT_eSprite *spr, int16_t angle, int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y); //获取旋转的 Sprite wrt 枢轴的 TFT 边界框void getRotatedBounds(int16_t angle, int16_t w, int16_t h, int16_t xp, int16_t yp, int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y); uint16_t readPixel(int32_t x0, int32_t y0);//读取 x,y 处像素的颜色并以 565 格式返回值uint16_t readPixelValue(int32_t x, int32_t y);//返回 x,y 处像素的数值(滚动时使用)
其他的eSPI库的函数都是可以在sprite类中通用的,不在复述。
void TFT_init(){ tft.init(); tft.setRotation(4); //初始化 Serial.println("TFT_INIT_OK"); }/******************************************************************************/void drawAr(){ clk.setColorDepth(8); clk.createSprite(64, 64);//创建窗口 clk.fillSprite(0x0000); //填充率 clk.setTextDatum(CC_DATUM); //设置文本数据 clk.setTextColor(TFT_WHITE, bgColor); clk.setSwapBytes(true); clk.pushImage(0, 0, 64, 64, Astronaut[i]); clk.println("ok"); clk.pushSprite(64,64); //窗口位置 clk.deleteSprite();// (10,55) 显示 64 × 64 像素的图片 if(millis() - imgtime>150){ imgtime = millis(); //延时 i+=1; //下一帧 if(i>8){i=0;} }}/**********************************************************************************************/void setup() { Serial.begin(115200); TFT_init(); Serial.println("OKKKK"); tft.fillScreen(TFT_BLACK); scanNetworks(); //扫描wifi并打印信息 connect(); //连接到指定wifi timeClient.begin(); //连接NTP服务器 timeClient.setTimeOffset(28800); //时区偏移 wea.Get();// Serial.println(land.post(IPdata,land.url_land));// delay(5000);// land.post(IPdata,land.url_unland); //imu.init(); //获取天气}void loop() { clk.loadFont(MY_FONT_Z); clk.setColorDepth(8); clk.createSprite(128, 128);//创建窗口 clk.fillSprite(0x0000); //填充率 clk.setTextDatum(CC_DATUM); //设置文本数据 clk.setTextColor(TFT_WHITE, bgColor); clk.setCursor(20,20,2); clk.setSwapBytes(true); //Serial.println(timeClient.getFormattedTime()); clk.println(timeClient.getFormattedTime()); clk.println(wea.now_address); clk.println(wea.now_weather); clk.println(wea.now_temperature+"℃"); clk.pushImage(60, 55, 64, 64, Astronaut[i]); // (10,55) 显示 64 × 64 像素的图片 clk.pushSprite(0,0); //窗口位置 clk.deleteSprite(); clk.unloadFont(); if(millis() - imgtime>150){ imgtime = millis(); //延时 i+=1; //下一帧 if(i>8){i=0;} }
显示效果
基于ESP32 开发太空人小电视时的eSPI库学习成果
做了镜像翻转。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/121081.html
摘要:是一款适配于框架的开源驱动库,以支持的简便开发。目的是简化乐鑫开发框架的使用难度。相关教程本专栏内容开发环境搭建开发环境搭建,下基于插件的开发环境搭建乐鑫在线帮助文档快速入门编程指南硬件设计参考 ...
摘要:开发方式是乐鑫为开发者提供的物联应开发平台,包括基础平台以及上层应开发示例,如智能灯智能开关等。指令开发方式作为芯片,指令开发也是必不可少的。开发方式即,意为运行在单片机上的。 ...
摘要:基础入门教程无奈的吐槽一转眼大学就快结束了,这是我第一次在上写博客。由一个欧洲开发团队于年冬季开发。其成员包括和等。它构建于开放原始码介面版,并且具有使用类似语言的开发环境。首先是程序部分。 ...
摘要:连接建立成功,就会触发事件事件稍后再解说。当连接建立时当接收到数据时当出现错误时事件监听,主要用来在合适的时间点发送数据,以及处理接收到来自串口的数据信息。数据会经串口发送至与连接的硬件设备,比如板,或者板等等。 Serialport 简介 想象这样一个世界,在那里你能用 JavaScript 代码控制榨汁机,灯,安防系统,甚至机器人。嗯,是机器人!你会不会觉得很新奇以致兴奋? Ser...
阅读 3080·2021-11-10 11:36
阅读 3244·2021-10-13 09:40
阅读 5892·2021-09-26 09:46
阅读 646·2019-08-30 15:55
阅读 1395·2019-08-30 15:53
阅读 1557·2019-08-29 13:55
阅读 2976·2019-08-29 12:46
阅读 3182·2019-08-29 12:34