2.4寸TFT ILI9341 多平台代码例程

知识库
知识库文档
/firmware/显示屏/2.4寸 TFT ILI9341/2.4寸TFT ILI9341 多平台代码例程.md

文档

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)

// TFT_eSPI User_Setup.h 配置示例:
// #define ILI9341_DRIVER
// #define TFT_CS   15
// #define TFT_DC   2
// #define TFT_RST  4
// #define TFT_MOSI 23
// #define TFT_SCLK 18
// #define TFT_MISO 19
// #define TFT_BL   5
// #define SPI_FREQUENCY 40000000

#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);
  
  // 添加LVGL控件
  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 (裸驱)

// ILI9341 底层写命令/数据
#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 // 320
    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}")

信息

路径
/firmware/显示屏/2.4寸 TFT ILI9341/2.4寸TFT ILI9341 多平台代码例程.md
更新时间
2026/5/26