使用買來的 st7789LCD 顯示器背面就帶著一個 tf 卡槽,可以直接連接 tf 卡。使用 Sdfat 庫就可以實現對 sd 卡的讀寫操作。這里嘗試測試 sd 卡的讀寫功能。
LCD 顯示器的初始化
//定義LCD的對象
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);tft.init(240, 320); // 初始化ST7789 240x320
tft.fillScreen(ST77XX_BLACK); // 用黑色填充屏幕
tft.setTextColor(ST77XX_WHITE); // 設置文本顏色為白色
tft.setTextSize(2); // 設置文本大小
tft.setCursor(0, 0); // 設置文本起始位置
tft.println("SD read and write test");
SD 卡初始化
//定義SD卡對象
SdFat sd;if (!sd.begin(SD_CS, SD_SCK_MHZ(10))) {Serial.println("SD卡初始化失敗!");tft.setTextColor(ST77XX_RED);tft.println("SDcard init failed");tft.println("Please check the connection and card");while (1); // 失敗時停止
}
SD 卡寫
SdFile writeFile;if (!writeFile.open(FILENAME, O_WRITE | O_CREAT | O_TRUNC)) {Serial.println("無法創建文件");tft.println("Cannot create file");while (1);
}writeFile.println(message);
writeFile.close();
SD 卡讀
這里預留的 buffer
已經假設讀取的數據不會超過 99 個字符!
SdFile readFile;if (!readFile.open(FILENAME, O_READ)) {Serial.println("無法打開文件進行讀取");tft.println("Cannot open file for reading");while (1);
}char buffer[100]; // 足夠大的緩沖區,以容納消息
int bytesRead = readFile.read(buffer, sizeof(buffer) - 1);if (bytesRead > 0) {buffer[bytesRead] = 0; // 添加字符串結束符Serial.println(buffer);// 在LCD上顯示讀取的消息tft.setTextColor(ST77XX_GREEN);tft.println(buffer);
} else {Serial.println("讀取失敗!");tft.println("Read failed!");
}readFile.close();
完整程序
嘗試向 sd 卡寫入文件,讀取文件,并在 lcd 卡上打印。示例程序如下:
#include <SdFat.h>
#include <Adafruit_GFX.h> // 核心圖形庫
#include <Adafruit_ST7789.h> // ST7789硬件特定庫// 定義引腳
#define SD_CS 7 // SD卡片選引腳
#define TFT_CS 10 // TFT片選引腳
#define TFT_DC 9 // TFT數據/命令引腳
#define TFT_RST 8 // TFT復位引腳// 創建SD卡和LCD對象
SdFat sd;
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);// 文件名定義
#define FILENAME "message.txt"// 要寫入的消息
const char* message = "Hello from SD card! hello world!";void setup() {// 初始化串口Serial.begin(115200);delay(1000);Serial.println("初始化SD卡和LCD...");// 初始化LCDtft.init(240, 320); // 初始化ST7789 240x320tft.fillScreen(ST77XX_BLACK); // 用黑色填充屏幕tft.setTextColor(ST77XX_WHITE); // 設置文本顏色為白色tft.setTextSize(2); // 設置文本大小tft.setCursor(0, 0); // 設置文本起始位置tft.println("SD read and write test");delay(1000);// 初始化SD卡if (!sd.begin(SD_CS, SD_SCK_MHZ(10))) {Serial.println("SD卡初始化失敗!");tft.setTextColor(ST77XX_RED);tft.println("SDcard init failed");tft.println("Please check the connection and card");while (1); // 失敗時停止}Serial.println("SDcard init success!");tft.println("SDcard init success!");delay(1000);// 打開文件進行寫入SdFile writeFile;if (!writeFile.open(FILENAME, O_WRITE | O_CREAT | O_TRUNC)) {Serial.println("無法創建文件");tft.println("Cannot create file");while (1);}// 寫入消息Serial.print("寫入消息: ");Serial.println(message);tft.println("Writing message...");delay(1000);writeFile.println(message);writeFile.close();Serial.println("消息寫入成功!");tft.println("Message written successfully!");// 打開文件進行讀取SdFile readFile;if (!readFile.open(FILENAME, O_READ)) {Serial.println("無法打開文件進行讀取");tft.println("Cannot open file for reading");while (1);}// 讀取消息Serial.println("讀取消息:");tft.println("Reading message...");delay(1000);char buffer[100]; // 足夠大的緩沖區,以容納消息int bytesRead = readFile.read(buffer, sizeof(buffer) - 1);if (bytesRead > 0) {buffer[bytesRead] = 0; // 添加字符串結束符Serial.println(buffer);// 在LCD上顯示讀取的消息tft.setTextColor(ST77XX_GREEN);tft.println(buffer);} else {Serial.println("讀取失敗!");tft.println("Read failed!");}readFile.close();Serial.println("操作完成!");tft.println("Operation completed!");
}void loop() {// 主循環為空
}
當前顯示字號為 2,對于Adafruit GFX 默認字體使用的是5x7像素的字體,但行和字符間又會有 1 個像素的間距,因此可以認為默認情況下一個字符占據 6×8 像素的空間。因此對于一個 240×320 的 LCD 來說,字號為 2 的顯示方式(12 ×16),一個屏幕最多顯示 400 個字符。
并且 adafruit 庫對于中文字符支持不友好,當前只能顯示英文。
adafruit 的 GFX 庫中提供獲取光標 XY 坐標的 API:
**getCursorX**
**:**獲取光標X坐標**getCursorY**
**:**獲取光標Y坐標
參考鏈接:
Adafruit GFX Library: Adafruit_GFX Class Reference
參考討論:
Just a moment…
例如,可以在上面的程序中加入以下代碼:
tft.print("Operation completed");int cursorX = tft.getCursorX();int cursorY = tft.getCursorY();tft.println("(X: " + String(cursorX) + ", Y: " + String(cursorY) + ")");
就可以打印出Operation completed
結束時的光標位置。
注意,這里使用 print
打印,而不是 println
,因為 prtinln
會默認另起一行。