单片机图像处理芯片与TFT彩屏触摸开关控件技术详解 v1.2

触摸开关控件 v1.2

项目概述

本项目是基于STC8H8K64U单片机和RA8889/RA6809图形处理芯片(Micro GPU)开发的一款触摸开关控件,适用于TFT显示屏(最高1366*xxxx)和电容触摸屏(GT911)。该控件提供了美观、响应灵敏的开关界面,支持多个开关同时工作,可应用于各类嵌入式人机交互界面,模块化设计,易移植,易维护,欢迎下载参考使用!

硬件配置

  • 单片机:STC8H8K64U(RT8H8K001开发板)(也可以采用ARM等各种MCU)
  • 图形处理芯片:RA8889/RA6809(RT6809CNN01开发板)
  • 显示屏:TFT 1024×600分辨率
  • 触摸屏:电容式GT911
  • 单片机-图形处理芯片的通信方式:SPI-4
  • 程序流程

    初始化流程

    1. 硬件初始化
    2. 配置IO口:P0.5为双向口模式(SPI_MISO),其它为推挽输出
    3. 配置GT911的IIC通信引脚
    4. 配置触摸中断引脚(INT2/P3.6)
    5. SPI通信初始化
    6. 初始化SPI4接口
    7. RA8889初始化
    8. 硬件复位RA8889
    9. 初始化RA8889显示配置
    10. 中断初始化
    11. 配置INT2/P3.6为触摸屏中断输入
    12. GT911触摸控制器初始化
    13. 初始化GT911配置
    14. 开关控件初始化
    15. 初始化开关控件数组
    16. 添加并配置所需开关
    17. 绘制所有开关
    18. 显示开关初始状态

    主循环流程

    1. 触摸检测
    2. 通过中断方式检测触摸事件
    3. 当触摸中断发生时,设置触摸标志
    4. 触摸处理
    5. 读取触摸点坐标
    6. 判断触摸位置是否在开关区域内
    7. 返回触发的开关ID
    8. 状态更新
    9. 切换被触发开关的状态
    10. 重绘被触发的开关
    11. 更新状态显示
    12. 等待防抖时间
    13. 触摸释放处理
    14. 当无触摸点时,重置触摸状态
    15. 清除触摸标志

    控件使用说明

    基本参数配置

  • 开关数量:最多开关数量可通过修改MAX_SWITCHES_NUM调整
  • 防抖动时间:默认20ms,可通过修改DEBOUNCE_TIME调整
  • 开关样式:可通过修改default_style结构体调整颜色、尺寸等样式
  • 开关控件API

    初始化函数
    void Switch_Init(void);
    

    初始化开关数组,清空已有开关。应在使用控件前首先调用。

    添加开关
    void Switch_Add(unsigned int x, unsigned int y, unsigned char initial_state);
    

    添加一个新开关:

  • xy:开关左上角坐标
  • initial_state:初始状态(0:关闭,1:打开)
  • 绘制开关
    void Switch_Draw(unsigned char switch_id);
    

    绘制指定ID的开关。ID从1开始编号。

    void Switch_DrawAll(void);
    

    绘制所有已添加的开关。

    触摸处理
    unsigned char Switch_HandleTouch(unsigned int touch_x, unsigned int touch_y);
    

    处理触摸事件,判断是否触发开关:

  • touch_xtouch_y:触摸点坐标
  • 返回值:被触发的开关ID,返回0表示无开关被触发
  • 状态显示(该函数用于检视触摸开关状态值)
    void Switch_PrintStatus(unsigned char switch_id);
    

    打印指定开关的状态信息。

    void Switch_PrintAllStatus(void);
    

    打印所有开关的状态信息。

    使用示例

    // 初始化开关控件
    Switch_Init();
    // 添加三个开关,位置和初始状态
    Switch_Add(280, 200, 0);  // 开关1:位置(280,200),初始状态:关闭
    Switch_Add(280, 300, 1);  // 开关2:位置(280,300),初始状态:打开
    Switch_Add(280, 400, 0);  // 开关3:位置(280,400),初始状态:关闭
    // 绘制所有开关
    Switch_DrawAll();
    // 显示文字说明:所有开关初始状态
    Switch_PrintAllStatus();
    // 在触摸处理中:
    widget_switch_id = Switch_HandleTouch(touch_x, touch_y);
    if(widget_switch_id > 0) {
        // 切换对应开关的状态
        switches[widget_switch_id-1].state = !switches[widget_switch_id-1].state;
        // 重绘被触发的开关
        Switch_Draw(widget_switch_id);
        // 更新状态显示
        Switch_PrintStatus(widget_switch_id);
    }
    

    外观定制

    开关外观可通过修改default_style结构体进行定制,包括:

  • 尺寸:通过SWITCH_HEIGHT调整基准高度,宽度自动按比例计算
  • 倒角:通过SWITCH_CORNER调整按钮圆角
  • 偏移量:通过SWITCH_OFFSET调整边框宽度
  • 颜色:
  • bgColor:背景色(关闭状态)
  • selectBgColor:选中背景色(打开状态)
  • textbgColor:文字颜色(关闭状态)
  • textselectBgColor:选中文字颜色(打开状态)
  • switchColor:滑块颜色
  • borderColor:边框颜色
  • 注意事项

    1. 使用前确保已正确初始化SPI、RA8889和GT911
    2. 开关数量不要超过MAX_SWITCHES_NUM定义的最大值
    3. 放置开关时注意坐标不要超出屏幕范围
    4. 触摸处理应在中断或主循环中周期性调用

    源码下载

    请看到视频末尾

    参考视频

    单片机-RAIO液晶控制芯片-触摸开关控件

    作者:BW.SU

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机图像处理芯片与TFT彩屏触摸开关控件技术详解 v1.2

    发表回复