#include <lvgl.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <XPT2046_Touchscreen.h>
// 引脚定义
#define TFT_CS 5
#define TFT_DC 0
#define TFT_RST 1
#define TFT_BL 4
#define TOUCH_CS2 7
#define TOUCH_IRQ 6
#define SPI_SCK 20
#define SPI_MOSI 21
#define SPI_MISO 10
#define SCREEN_W 240
#define SCREEN_H 320
Adafruit_ILI9341 tft(TFT_CS, TFT_DC, TFT_RST);
XPT2046_Touchscreen ts(TOUCH_CS2); // 校准阶段不使用 IRQ
/* ========= 画十字 ========= */
void drawCross(int x, int y)
{
tft.fillScreen(ILI9341_BLACK);
tft.drawLine(x - 15, y, x + 15, y, ILI9341_WHITE);
tft.drawLine(x, y - 15, x, y + 15, ILI9341_WHITE);
}
TS_Point waitTouch()
{
while (!ts.touched()) delay(10);
delay(300); // 去抖
return ts.getPoint();
}
void setup()
{
Serial.begin(115200);
SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
tft.begin();
tft.setRotation(0);
tft.fillScreen(ILI9341_BLACK);
ts.begin();
ts.setRotation(2);
Serial.println("\n=== XPT2046 Touch Calibration ===");
TS_Point p;
int xmin, xmax, ymin, ymax;
// 左上
drawCross(20, 20);
Serial.println("Touch TOP-LEFT");
p = waitTouch();
xmin = p.x + 20;
ymin = p.y + 20;
// 右上
drawCross(SCREEN_W - 20, 20);
Serial.println("Touch TOP-RIGHT");
p = waitTouch();
xmax = p.x - 20;
ymin = (ymin + p.y + 20) / 2;
// 左下
drawCross(20, SCREEN_H - 20);
Serial.println("Touch BOTTOM-LEFT");
p = waitTouch();
xmin = (xmin + p.x + 20) / 2;
ymax = p.y - 20;
// 右下
drawCross(SCREEN_W - 20, SCREEN_H - 20);
Serial.println("Touch BOTTOM-RIGHT");
p = waitTouch();
xmax = (xmax + p.x - 20) / 2;
ymax = (ymax + p.y - 20 ) / 2;
tft.fillScreen(ILI9341_BLACK);
Serial.println("\n=== Calibration Result ===");
Serial.print("X_MIN = "); Serial.println(xmin);
Serial.print("X_MAX = "); Serial.println(xmax);
Serial.print("Y_MIN = "); Serial.println(ymin);
Serial.print("Y_MAX = "); Serial.println(ymax);
Serial.println("==========================");
}
void loop()
{
}作者:yuanfun 创建时间:2025-12-30 18:17
最后编辑:yuanfun 更新时间:2025-12-30 18:50
最后编辑:yuanfun 更新时间:2025-12-30 18:50