关注分享主机优惠活动
国内外VPS云服务器

Arduino开发【​​k4】TFT_eSPI库学习(arduino驱动TFT)

总结:花样开发的屏幕开发方便、稳定。 同时开发的底层驱动接口也使用了该库。 库的安装和配置基于教程。 只需要取消文件中驱动芯片头文件的注释即可。 默认情况下,精灵使用位颜色。 位深度可以设置为位颜色或任何颜色以减少所需的位数。

学习TFT_eSPI 库

文章目录 学习TFT_eSPI 库 安装和配置TFT_eSPI 库 TFT_eSPI 库文件目录 配置文件 1.User_Setup_.h2。 User_Setup_Select.h3。 Rotation.h- 镜像设置 TFT_eSPI 库 常用 API 初始化函数 1. eSPI 类 文本/图片/绘制图形 2. Sprite 类 Sprite 类 API 示例代码

TFT_eSPI 库为 Displays LCD通过SPI屏幕并支持PlatformIOIDE按键下载和使用。 Arduino模式开发屏开发方便、稳定。 同时,LVGLGUI开发的底层驱动接口也使用了TFT_eSPI库的API。

安装和配置TFT_eSPI 库

基于PlatformIO IDE 的描述。

首先,在Libraries中搜索TFT_eSPI库并将其安装到您的项目文件中。

TFT_eSPI Library 文件目录 文件目录 最重要的文件(文件夹): TFT_Drivers User_SetupsUser_Setup_Select.hUser_Setup_.h

这几个文件是最基本的配置文件(文件夹)。 这是因为不同的液晶屏采用的驱动芯片型号和RGB调色模式不同。 因此,安装库后第一步就是根据液晶屏的具体参数对配置文件进行相应的修改。

TFT_eSPI是基于SPI通信的图形驱动库,因此芯片必须支持SPI。 使用它。 对于通信,请确保将 Arduino SPI 通信库文件(例如 SPI.h)引入到您的项目中。

配置文件

有两种方法。 一种方法是通过 User_Setup_.h,您可以在其中配置驱动程序模型和任何需要更改的信息。 另一种方法是在User_Setup_Select.h中选择驱动芯片型号,并在TFT_Driver文件夹下的驱动配置文件中设置各种信息。

1.User_Setup_.h

首先选择驱动型号,如#define ST7789_2_DRIVER,去掉注释。

屏幕尺寸设置

设置GBR显示的LCD屏幕的显示转换。

可用的引脚在配置引脚文件中定义,如果您想根据需要更改它,只需取消注释并更改相应引脚的值即可。

Set SPI Rate 根据硬件芯片的性能设置来设置 SPI 通信速率(一般为

2. User_Setup_Select .h

学习小作品 最好只取消 LCD 驱动的注释User_Setup.h 文件中的芯片头文件,方便修改和检索。管脚定义要么保留为默认,要么在文件中修改(未使用) 3. Rotation.h- 镜像设置 //屏幕选择函数 TFT_eSPI tft = TFT_eSPI ();tft.setRotation(4);//1-3从90度旋转到270度 //*需要实现在镜像驱动的Rotation.h的switch语句中设置。添加案例 4 的选项代码如下*/ 案例 4: // Inverter Portrait & Mirror Y#ifdef CGRAM_OFFSETif (_init_width == 135){colstart = 53;rowstart = 40;}else{colstart = 0 ;rowstart = 0;} # endifwritedata (TFT_MAD_MX | TFT_MAD_COLOR_ORDER);_width = _init_width;_height = _init_height;break;/*接下来,使用函数 tft.setRotation(4); */ TFT_eSPI 库通用 API 初始化屏幕对象实例化 TFT_eSPI::TFT_eSPI(int16_t w, int16_th)// 设置屏幕尺寸 TFT_eSPI tft = TFT_eSPI(240, 240);

参数:宽度和高度

初始化 tft.初始化()。 设置屏幕方向 tft.serRotation(3);

参数为:0、1、2、3分别代表0°、90°、180°、270°,4为镜像,可设置为

从RGB颜色GBR565 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); 常用函数 1. eSPI text 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*/ Picture

Picture Modulus Paint 中。 很多博客只是按照bmp格式来得到RGB565数组。 如果要显示jpg图像,则需要使用图像解码库。

/ * */void TFT_eSPI::setSwapBytes(bool swap)//打开显示器。 通常,当您需要显示图像时添加此函数。 tft.setSwapBytes(true);void TFT_eSPI::drawBitmap(int16_t x, int16_ty, const uint8_t *bitmap, int16_t w, int16_th, 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); SPI ::drawFastHLine(int32_t x, int32_ty, 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_ty , uint32_t color)// 绘制一个点 tft.drawPixel(204,10,TFT_RED);// 绘制一条垂直线 void TFT_eSPI::drawFastVLine(int32_t x, int32_ty , int32_th, 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_th, uint32_t颜色)void tft_espi :: fillRect(int32_t x,int32_t y,int32_t w,int32_t w,int32_th,uint32_t color)//绘制三角形tft_espi ::: :: drawtriangle 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) 2. Sprite类

Sprite理论上是不可见的图形屏幕并被保存。 在处理器 RAM 中。 您可以在精灵上绘制形状,就像直接在屏幕上绘制形状一样。 精灵完成后,您可以将其绘制在屏幕上的任何位置。 如果您有足够的 RAM,您可以使精灵与屏幕大小相同,并将其用作帧缓冲区。 默认情况下,精灵使用 16 位颜色,但您可以将位深度设置为 8 位(256 种颜色)或 1 位(任意两种颜色)以减少 RAM 要求。 在 ESP8266 上,您可以创建的最大 16 位彩色精灵约为 160x128 像素,并消耗 40 KB RAM。 在 ESP32 中,对于 16 位颜色深度,精灵的大小限制为约 200x200 像素(约 80KB);对于 8 位颜色深度,精灵的大小限制为 320x240 像素(约 76KB)。 您可以创建一个或多个精灵。 精灵可以具有任意像素宽度和高度,仅受可用 RAM 的限制。 16 位色深精灵所需的 RAM 为(2 x 宽 x 高)字节,8 位色深精灵所需的 RAM 为(2 x 宽 x 高)字节所需的 RAM 为(宽 x 高)字节。 可以根据需要以编程方式动态创建和删除精灵。 这意味着在屏幕上绘制精灵后,RAM 被释放,执行更多消耗 RAM 的基于 WiFi 的代码,并且正常的图形操作继续工作。 将图形绘制到 sprite 的速度非常快,对于熟悉 Adafruit 的“graphicstest”示例的人来说,使用 160x128 sprite 可以在 18 毫秒内完成整个测试。 有关如何使用精灵的示例可以在“examples/Sprite”文件夹中找到。 可以在 TFT 上绘制精灵,颜色指定为“透明”。 请参阅透明_Sprite_Demo 示例。 如果您的 ESP32 开发板安装了 SPIRAM(或 PSRAM),则精灵可以使用 PSRAM 内存并创建具有大全屏缓冲区的精灵。 全屏精灵需要很长时间才能渲染(320 x 240 16 位精灵大约需要 45 毫秒)。 ! ! ----------------[k4 ] ]- 官方解释 --------------[ k4 ]-----------

Sprite 类 API

人类语言:刷新它闪屏 - 问题目前已解决。

/*实例化*/TFT_eSprite clk = TFT_eSprite(&tft);//创建一个宽x高像素的精灵,并返回一个指向RAM的指针//如果需要,Sketch可以将返回值转换为(uint16_t* ) 。获取16位深度 void* createSprite(int16_t width, int16_t height, uint8_t Frames = 1);void* getPointer(void);//返回指向精灵的指针,如果没有创建则返回 nullptr。 用户必须转换为指针类型 bool 创建 (void); // 如果已创建 sprite,则返回 true void deleteSprite(void); // 删除 sprite 以释放 RAM 我会的。 //设置或获取颜色深度为4、8或16位。 它可用于更改现有精灵的深度,将精灵清除为黑色,或者在重新创建精灵时返回新指针。 void* setColorDepth(int8_t b);int8_t getColorDepth(void);voiddrawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t font);//在 Adafruit GLCD 或 freefont 中绘制单个字符 // 在 Draws 中屏幕上的 Unicode 字形。 UTF-8 解码必须在调用drawChar()之前完成。 int16_tdrawChar(uint16_t uniCode, int32_t x, int32_ty, uint8_t font);int16_tdrawChar(uint16_t uniCode, int32_t x, int32_t y);//设置滚动区域,定义从左上角Masu开始的x、y、宽度、高度。 滚动后用于填充间隙的颜色(可选,默认为黑色) void setScrollRect(int32_t x, int32_t y, int32_t w, int32_th, uint16_t color = TFT_BLACK);//滚动定义区域dx,dy像素。 负值向上并向左滚动。 正值向右和向下滚动。 向上和向下滚动是可选的(默认情况下不向上和向下滚动)。 //精灵坐标系不移动,但像素移动。 void scroll(int16_t dx, int16_t dy = 0), void setRotation(uint8_trotation); //设置精灵的旋转坐标(仅适用于1位颜色深度的精灵) 在内部硬件中设置CGRAM旋转 Display uint8_t getRotation (void); // 使用可选的透明颜色将精灵的旋转副本推送到 TFT bool PushRotated(int16_t angle, uint32_t transp = 0x00FFFFFF); // 使用定点运算 // 推送精灵以推送旋转副本将此精灵转移到另一个具有可选透明颜色的单独精灵 bool PushRotated(TFT_eSprite *spr, int16_t angle, uint32_t transp = 0x00FFFFFF); //此精灵的 获取旋转副本的 TFT 边界框 bool getRotatedBounds(int16_t angle, int16_t * min_x , int16_t *min_y, int16_t *max_x, int16_t *max_y);//获取此精灵旋转副本的目标精灵边界框 bool getRotatedBounds(TFT_eSprite *spr, int16_t angle, int16_t *min_x, int16_t *min_y,int16_t *max_x,int16_t *max_y); 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库函数可在精灵类中通用,不再重复。

示例代码 void TFT_init(){ tft.init(); // 初始化 Serial.println("TFT_INIT_OK"). }/**************************************************** * ************** ****************/voiddrawAr(){ clk.setColorDepth(8); clk.createSprite(64, 6);4);//创建窗口 clk.fillSprite(0x0000); //填充率 clk.setTextDatum(CC_DATUM); //设置文本数据 clk.setTextColor(TFT_WHITE, bgColor); 0, 0, 64, 64, astronaut[i]); clk.pushSprite(64,64); //窗口位置 clk.deleteSprite();// (10 ,55) 显示64×64像素的图像 if(millis() - imgtime>150){ imgtime = millis();//延迟 i+=1;//下一帧 if(i>8){i =0;} }} /******************************************** *** *** ****************************** ************** */无效设置() { Serial.begin(115200); Serial.println("OKKKK"); tft.fillScreen(TFT_BLACK);//扫描Wi-Fi并打印信息 connect();//到指定的Wi-Fi时间Client.begin(); //连接到NTP服务器。 timeClient.setTimeOffset(28800); //时区偏移 wea.Get();// Serial.println(land.post(IPdata,land.url_land));// 延迟(5000);// land.post(IPdata,land.url_unland); //imu.init(); //获取天气 } void Loop() { clk.loadFont(MY_FONT_Z); 8); clk.createSprite(128, 128); //创建窗口 clk.fillSprite(0x0000); //填充率 clk.setTextDatum(CC_DATUM); //设置文本数据 clk.setTextColor(TFT_WHITE, bgColor) ; setCursor (20,20,2); //Serial.println(timeClient.getFormattedTime()); clk.println(timeClient.getFormattedTime()); 。 println(wea.now_weather); clk.println(wea.now_tempel+"℃"); // (10,55) 显示一个 64 × 64像素图像 clk.pushSprite(0,0); //窗口位置 clk.unloadFont(); if(millis() - imgtime>150){ imgtime = millis(); =1;//下一帧 if(i>8){i=0;}}

显示效果

基于ESP32开发航天员小电视时,根据eSPI库的学习结果进行镜像反转。

未经允许不得转载:主机频道 » Arduino开发【​​k4】TFT_eSPI库学习(arduino驱动TFT)

评论 抢沙发

评论前必须登录!