介绍
2.4英寸TFT彩色LCD,驱动IC ILI9341,240×320分辨率,SPI接口,262K色,带触摸屏(可选)和SD卡槽,是嵌入式开发中最常用的中尺寸彩屏之一,适合GUI界面、仪表盘、手持设备
2.4英寸TFT彩色LCD,驱动IC ILI9341,240×320分辨率,SPI接口,262K色,带触摸屏(可选)和SD卡槽,是嵌入式开发中最常用的中尺寸彩屏之一,适合GUI界面、仪表盘、手持设备
| 参数 | 值 |
|---|---|
| 供电 | 3.3V(逻辑) + 3.3V-5V(背光) |
| 尺寸 | 2.4英寸 |
| 帧率 | ~7fps @16MHz SPI |
| 接口 | SPI 4线(可选8位并口) |
| 背光 | 4×白光LED串联 |
| 触摸 | 可选XPT2046电阻触摸 |
| 颜色 | 262K色 (RGB666) |
| 驱动IC | ILI9341 |
| SPI速率 | 最高32MHz |
| 分辨率 | 240×320 (QVGA) |
| 可视角度 | ~140° |
| 外形尺寸 | 71mm×52mm |
| 显示区域 | 36.72mm×48.96mm |
# 2.4寸TFT ILI9341 多平台代码例程
---
## Arduino (Adafruit ILI9341)
```cpp
#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)
```cpp
// 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 (裸驱)
```c
// 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)
```python
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}")
```
暂无参考文献