基于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 # 校准工具脚本

七、应用场景

  1. 工业控制面板

    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);
    }
    
  2. 人机交互界面

    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 集成开发环境
posted @ 2025-11-12 09:58  alloutlove  阅读(43)  评论(0)    收藏  举报