2.4寸TFT ILI9341 多平台代码例程
Arduino (Adafruit ILI9341)
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#define TFT_CS 10
#define TFT_DC 9
#define TFT_RST 8
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
void setup() {
tft.begin();
tft.setRotation(1);
tft.fillScreen(ILI9341_BLACK);
tft.fillRect(0, 0, 240, 30, ILI9341_BLUE);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.setCursor(10, 5);
tft.println("ILI9341 TFT");
tft.drawCircle(120, 200, 60, ILI9341_GREEN);
tft.drawCircle(120, 200, 50, ILI9341_CYAN);
tft.setTextSize(3);
tft.setCursor(100, 185);
tft.print("OK");
}
void loop() { }
ESP32 (TFT_eSPI + LVGL)
#include <lvgl.h>
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();
static lv_disp_drv_t disp_drv;
static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[240 * 20];
void my_disp_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_p) {
uint32_t w = area->x2 - area->x1 + 1;
uint32_t h = area->y2 - area->y1 + 1;
tft.startWrite();
tft.setAddrWindow(area->x1, area->y1, w, h);
tft.pushColors((uint16_t*)color_p, w * h, true);
tft.endWrite();
lv_disp_flush_ready(drv);
}
void setup() {
tft.begin();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
lv_init();
lv_disp_draw_buf_init(&draw_buf, buf, NULL, 240 * 20);
lv_disp_drv_init(&disp_drv);
disp_drv.hor_res = 240;
disp_drv.ver_res = 320;
disp_drv.flush_cb = my_disp_flush;
disp_drv.draw_buf = &draw_buf;
lv_disp_drv_register(&disp_drv);
lv_obj_t *label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "ESP32 + LVGL");
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
}
void loop() {
lv_timer_handler();
delay(5);
}
STM32 HAL (裸驱)
#define ILI9341_DC_H() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET)
#define ILI9341_DC_L() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET)
#define ILI9341_CS_H() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET)
#define ILI9341_CS_L() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET)
void ili9341_write_cmd(uint8_t cmd) {
ILI9341_DC_L(); ILI9341_CS_L();
HAL_SPI_Transmit(&hspi1, &cmd, 1, 100);
ILI9341_CS_H();
}
void ili9341_write_data(uint8_t data) {
ILI9341_DC_H(); ILI9341_CS_L();
HAL_SPI_Transmit(&hspi1, &data, 1, 100);
ILI9341_CS_H();
}
void ili9341_set_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
ili9341_write_cmd(0x2A);
ili9341_write_data(x1 >> 8); ili9341_write_data(x1 & 0xFF);
ili9341_write_data(x2 >> 8); ili9341_write_data(x2 & 0xFF);
ili9341_write_cmd(0x2B);
ili9341_write_data(y1 >> 8); ili9341_write_data(y1 & 0xFF);
ili9341_write_data(y2 >> 8); ili9341_write_data(y2 & 0xFF);
ili9341_write_cmd(0x2C);
}
void ili9341_fill(uint16_t color) {
ili9341_set_window(0, 0, 239, 319);
ILI9341_DC_H(); ILI9341_CS_L();
for(uint32_t i=0; i<240*320; i++) {
uint8_t buf[2] = {color>>8, color&0xFF};
HAL_SPI_Transmit(&hspi1, buf, 2, 100);
}
ILI9341_CS_H();
}
MicroPython (ESP32)
from ili9341 import ILI9341
from machine import Pin, SPI
spi = SPI(1, baudrate=40000000, sck=Pin(18), mosi=Pin(23), miso=Pin(19))
tft = ILI9341(spi, cs=Pin(15), dc=Pin(2), rst=Pin(4), w=240, h=320, r=1)
tft.erase() # 清屏黑色
tft.set_pos(10, 10)
tft.set_color(0x07E0, 0x0000) # 绿色前景, 黑色背景
tft.print("MicroPython ILI9341")
# 绘制渐变矩形
for y in range(320):
r = y * 255
g = 255 - r
color = (r << 11) | (g << 5) | 0x1F
tft.fill_rectangle(100, y, 140, 1, color)
# 带触摸读取 (XPT2046)
from xpt2046 import XPT2046
touch = XPT2046(spi, cs=Pin(13))
if touch.is_pressed():
x, y = touch.get_position()
print(f"Touch: {x}, {y}")