基于MSP430F169微控制器驱动ILI9341液晶屏和XPT2046触摸屏实现方案
一、硬件
1. 电路设计要点
MSP430F169 ILI9341 XPT2046
------------------------------------------
P3.0(SCK) <------> SCK
P3.1(MOSI)<------> DIN
P3.2(CS_ILI)<------> CS_ILI
P3.3(DC_ILI)<------> DC
P3.4(RST_ILI)<------> RST
P3.5(CS_XPT)<------> CS_XPT
P3.6(INT_XPT)<------> PENIRQ
3.3V ------> VCC_ILI/VCC_XPT
GND ------> GND_ILI/GND_XPT
2. 关键参数配置
- SPI模式:CPOL=0, CPHA=0(模式0)
- 时钟频率:SPI主频8MHz(需≤ILI9341最大支持频率)
- 触摸中断:INT_XPT连接P3.6(下降沿触发)
二、驱动开发核心代码
1. SPI底层驱动(spi.h)
#define SPI_CLK_H() P3OUT |= BIT0 // SCK高电平
#define SPI_CLK_L() P3OUT &= ~BIT0 // SCK低电平
#define SPI_MOSI_H() P3OUT |= BIT1 // MOSI高电平
#define SPI_MOSI_L() P3OUT &= ~BIT1 // MOSI低电平
void SPI_Init() {
P3SEL &= ~0x3F; // 选择GPIO功能
P3DIR |= 0x3F; // 设置输出引脚
// 配置SPI时钟分频
UCA0BR0 = 104; // 8MHz时钟(MCLK=16MHz)
UCA0BR1 = 0;
UCA0MCTL = 0;
UCA0CTL1 |= UCSWRST; // 复位USCI_A0
UCA0CTL1 |= UCSSEL_2; // SMCLK时钟源
UCA0CTL1 &= ~UCSWRST; // 退出复位
}
uint8_t SPI_Write(uint8_t data) {
while (!(UCA0IFG & UCTXIFG)); // 等待发送缓冲区空
UCA0TXBUF = data;
while (!(UCA0IFG & UCRCIFG)); // 等待接收完成
return UCA0RXBUF;
}
2. ILI9341驱动(ili9341.c)
#define ILI9341_WIDTH 320
#define ILI9341_HEIGHT 480
void ILI9341_Init() {
CS_ILI_L(); // 选中设备
SPI_Write(0xEF); // 软复位
DelayMs(100);
// 发送初始化序列(关键命令)
Write_Cmd(0x01); // 软复位
DelayMs(100);
Write_Cmd(0x11); // 退出睡眠模式
DelayMs(120);
Write_Cmd(0x3A); // 设置颜色格式
SPI_Write(0x55); // 16位色深
// ...其他初始化命令
}
void ILI9341_DrawPixel(uint16_t x, uint16_t y, uint16_t color) {
Set_Address_Window(x, y, x, y);
CS_ILI_L();
SPI_Write(0x2C); // 写入像素数据
SPI_Write(color >> 8);
SPI_Write(color & 0xFF);
CS_ILI_H();
}
// 坐标映射函数(触摸坐标转屏幕坐标)
void Touch_Calibration(uint16_t *x, uint16_t *y) {
// 校准参数(需实际测量)
*x = (Touch_X_Raw - CAL_X_MIN) * (ILI9341_WIDTH - 1) / (CAL_X_MAX - CAL_X_MIN) + 0;
*y = (Touch_Y_Raw - CAL_Y_MIN) * (ILI9341_HEIGHT - 1) * (CAL_Y_MAX - CAL_Y_MIN) + 0;
}
3. XPT2046驱动(xpt2046.c)
#define XPT2046_CTRL 0x80 // 控制位
uint16_t XPT2046_ReadADC(uint8_t channel) {
CS_XPT_L();
SPI_Write(0x08 | channel); // 选择通道
DelayUs(100);
SPI_Write(0x90); // 启动转换
while (!(P3IN & BIT6)); // 等待DRDY低电平
uint16_t data = SPI_Write(0x00) << 4;
data |= SPI_Write(0x00) >> 4;
CS_XPT_H();
return data;
}
void Touch_GetXY(uint16_t *x, uint16_t *y) {
*x = XPT2046_ReadADC(0x90); // X轴差分测量
*y = XPT2046_ReadADC(0xD0); // Y轴差分测量
}
三、中断服务程序
1. 触摸中断处理
#pragma vector=PORT3_VECTOR
__interrupt void Port_3_ISR(void) {
if(P3IFG & BIT6) { // PENIRQ下降沿触发
P3IFG &= ~BIT6; // 清除中断标志
Touch_GetXY(&touch_x, &touch_y);
// 触发GUI事件处理
}
}
四、图形界面实现
1. 基础图形函数
void Draw_Rectangle(uint16_t x1, uint16_t y1,
uint16_t x2, uint16_t y2,
uint16_t color) {
for(uint16_t y = y1; y <= y2; y++) {
for(uint16_t x = x1; x <= x2; x++) {
ILI9341_DrawPixel(x, y, color);
}
}
}
void Display_Text(uint16_t x, uint16_t y,
const char *str, uint16_t color) {
while(*str) {
Draw_Char(x++, y, *str++, color);
}
}
2. 触摸事件处理
typedef enum {
TOUCH_NONE,
TOUCH_PRESSED,
TOUCH_RELEASED
} TouchState;
TouchState current_state = TOUCH_NONE;
void Handle_Touch_Event() {
static uint16_t last_x = 0, last_y = 0;
if(current_state == TOUCH_PRESSED) {
// 处理点击事件
if(last_x > 100 && last_x < 220 &&
last_y > 150 && last_y < 250) {
// 按钮点击逻辑
}
}
current_state = TOUCH_NONE;
}
五、校准与调试
1. 校准参数获取
// 校准流程
void Calibrate_Touch() {
// 显示校准十字线
Draw_Crosshair(160, 240, RED);
// 记录四个角点坐标
CAL_X_MIN = Read_X_Raw();
CAL_X_MAX = Read_X_Raw();
CAL_Y_MIN = Read_Y_Raw();
CAL_Y_MAX = Read_Y_Raw();
// 计算转换系数
float x_scale = (ILI9341_WIDTH - 1) / (CAL_X_MAX - CAL_X_MIN);
float y_scale = (ILI9341_HEIGHT - 1) / (CAL_Y_MAX - CAL_Y_MIN);
}
2. 调试工具
// 串口调试输出
void Debug_Print(const char *fmt, ...) {
char buffer[128];
va_list args;
va_start(args, fmt);
vsnprintf(buffer, sizeof(buffer), fmt, args);
va_end(args);
UART_Transmit(buffer);
}
参考代码 MSP430F169驱动ILI9341液晶与XPT2046触摸程序 www.youwenfan.com/contentcnl/73041.html
六、文件结构
├── driver/
│ ├── spi.h # SPI总线驱动
│ ├── ili9341.h # ILI9341图形库
│ └── xpt2046.h # XPT2046触摸驱动
├── app/
│ ├── main.c # 主程序
│ └── gui.c # 图形界面逻辑
├── include/
│ ├── fonts.h # 字库数据
│ └── colors.h # 颜色定义
└── scripts/
└── calibration.py # 校准工具脚本
七、应用场景
-
工业控制面板
void Show_StatusScreen() { Clear_Screen(BLACK); Draw_Text(20, 20, "System Status:", WHITE); Draw_Rectangle(20, 50, 200, 100, BLUE); Display_Text(30, 60, "Running...", GREEN); } -
人机交互界面
void Menu_Handler() { static uint8_t selected = 0; Draw_MenuItem(selected, "Set Parameter", RED); Draw_MenuItem(!selected, "View Data", BLUE); }
八、调试工具链
| 工具名称 | 功能描述 |
|---|---|
| MSP430-GCC | 交叉编译环境 |
| Logic Analyzer | SPI时序捕获 |
| Touch Panel Tester | 触摸坐标校准工具 |
| IAR Embedded Workbench | 集成开发环境 |
浙公网安备 33010602011771号