一、硬件
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_A0UCA0CTL1 |= 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 480void 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 | 集成开发环境 |