TFT_eSPI庫學習
文章目錄
- TFT_eSPI庫學習
- TFT_eSPI庫安裝以及配置
- TFT_eSPI庫檔案目錄
- 組態檔
- 1.User_Setup_.h
- 2. User_Setup_Select.h
- 3. Rotation.h- 鏡像設定
- TFT_eSPI庫常用API
- 初始化
- 常用函式
- 1. eSPI類
- 文字
- 圖片
- 繪制圖形
- 2. Sprite 類
- sprite類API
- 示例代碼
TFT_eSPI庫是通過SPI方式驅動LCD螢屏的一個Arduino庫,并且支持PlatformIOIDE一鍵下載使用,對于Arduino模式開發的螢屏開發既便捷又穩定,
同時LVGLGUI開發的底層驅動介面也是使用TFT_eSPI庫的API,
TFT_eSPI庫安裝以及配置
基于PlatformIO IDE 講解,

首先在Libraries里面搜索安裝TFT_eSPI庫到你的工程檔案里面,

TFT_eSPI庫檔案目錄
- TFT_Drivers
- User_Setups
- User_Setup_Select.h
- User_Setup_.h
這幾個檔案是最基本的組態檔(夾),因為不同的LCD螢屏所用的驅動芯片型號和RGB調色模式是不同的,所以在安裝完庫后,我們第一步就需要根據自己LCD螢屏的具體引數在組態檔里面進行相應的修改

組態檔
有兩種方法,一種就是通過
User_Setup_.h進行配置,可以配置驅動型號以及所有需要修改的資訊,
另一種就是在User_Setup_Select.h中先選擇驅動芯片型號,然后在TFT_Driver檔案夾中的驅動組態檔中配置各種資訊,
1.User_Setup_.h
-
首先選擇驅動型號 如:
#define ST7789_2_DRIVER,將注釋去掉即可,
-
配置螢屏大小

-
設定GBR顯示的LCD螢屏的顯示轉換

-
配置引腳
檔案中已經定義好了可以使用的引腳,如果需要修改的話,取消注釋后修改相應引腳的值即可
-
配置SPI速率
設定SPI的通信速率,根據硬體芯片的性能設定(一般保持默認即可)

2. User_Setup_Select.h
對于學習,小作品開發不推薦,最好在
User_Setup.h中進行配置,便于修改和查找,
- 直接在檔案中取消LCD驅動芯片的頭檔案注釋即可,引腳定義按照默認,或者在檔案中進行修改(沒有使用過),
3. Rotation.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庫常用API
初始化
- 螢屏物件實體化
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為鏡像,
- 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類
文字
void TFT_eSPI::setTextSize(uint8_t s)
//設定字體大小為2
tft.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)
2. Sprite 類
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 毫秒)!!!
?? ------------------官方解釋--------------------------
sprite類API
人話:可以解決重繪閃屏的問題-暫時就這樣,
/*實體化*/
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 的旋轉副本推送到另一個具有可選透明顏色的不同 Sprite
bool 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.uj5u.com/qita/302861.html
標籤:其他
上一篇:USB轉串口芯片CH340G的使用,3.3V或5V供電電路
下一篇:S3C2440驅動開發(八)
