找回密码
 立即注册
搜索
热搜: RA8889 RA8876 RA8875
查看: 58|回复: 0

触摸开关控件

[复制链接]

63

主题

26

回帖

890

积分

管理员

积分
890
QQ
发表于 2025-4-12 12:04:24 | 显示全部楼层 |阅读模式
触摸开关控件 v1.2


一、项目概述
本项目是基于STC8H8K64U单片机和RA8889/RA6809图形处理芯片(Micro GPU)开发的一款触摸开关控件,适用于TFT显示屏(最高1366*xxxx)和电容触摸屏(GT911)。该控件提供了美观、响应灵敏的开关界面,支持多个开关同时工作,可应用于各类嵌入式人机交互界面。


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


三、程序流程


初始化流程
  • 硬件初始化
       - 配置IO口:P0.5为双向口模式(SPI_MISO),其它为推挽输出
       - 配置GT911的IIC通信引脚
       - 配置触摸中断引脚(INT2/P3.6)
  • SPI通信初始化
       - 初始化SPI4接口
  • RA8889初始化
       - 硬件复位RA8889
       - 初始化RA8889显示配置
  • 中断初始化
       - 配置INT2/P3.6为触摸屏中断输入
  • GT911触摸控制器初始化
       - 初始化GT911配置
  • 开关控件初始化
       - 初始化开关控件数组
       - 添加并配置所需开关
       - 绘制所有开关
       - 显示开关初始状态


主循环流程
  • 触摸检测
       - 通过中断方式检测触摸事件
       - 当触摸中断发生时,设置触摸标志
  • 触摸处理
       - 读取触摸点坐标
       - 判断触摸位置是否在开关区域内
       - 返回触发的开关ID
  • 状态更新
       - 切换被触发开关的状态
       - 重绘被触发的开关
       - 更新状态显示
       - 等待防抖时间
  • 触摸释放处理
       - 当无触摸点时,重置触摸状态
       - 清除触摸标志


四、控件使用说明


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


五、开关控件API

初始化函数
  1. void Switch_Init(void);
复制代码
初始化开关数组,清空已有开关。应在使用控件前首先调用。

添加开关
  1. void Switch_Add(unsigned int x, unsigned int y, unsigned char initial_state);
复制代码
添加一个新开关:
  • x、y:开关左上角坐标
  • initial_state:初始状态(0:关闭,1:打开)


绘制开关
  1. void Switch_Draw(unsigned char switch_id);
复制代码
绘制指定ID的开关。ID从1开始编号。
void Switch_DrawAll(void);绘制所有已添加的开关。

触摸处理
  1. unsigned char Switch_HandleTouch(unsigned int touch_x, unsigned int touch_y);
复制代码
处理触摸事件,判断是否触发开关:
  • touch_x、touch_y:触摸点坐标
  • 返回值:被触发的开关ID,返回0表示无开关被触发


状态显示(该函数用于检视触摸开关状态值)
  1. void Switch_PrintStatus(unsigned char switch_id);
复制代码
打印指定开关的状态信息。
void Switch_PrintAllStatus(void);打印所有开关的状态信息。

使用示例
  1. // 初始化开关控件
  2. Switch_Init();
  3. // 添加三个开关,位置和初始状态
  4. Switch_Add(280, 200, 0);  // 开关1:位置(280,200),初始状态:关闭
  5. Switch_Add(280, 300, 1);  // 开关2:位置(280,300),初始状态:打开
  6. Switch_Add(280, 400, 0);  // 开关3:位置(280,400),初始状态:关闭// 绘制所有开关
  7. Switch_DrawAll();
  8. // 显示文字说明:所有开关初始状态
  9. Switch_PrintAllStatus();
  10. // 在触摸处理中:
  11. widget_switch_id = Switch_HandleTouch(touch_x, touch_y);
  12. if(widget_switch_id > 0) {
  13.     // 切换对应开关的状态
  14.     switches[widget_switch_id-1].state = !switches[widget_switch_id-1].state;
  15.     // 重绘被触发的开关
  16.     Switch_Draw(widget_switch_id);
  17.     // 更新状态显示
  18.     Switch_PrintStatus(widget_switch_id);
  19. }
复制代码

外观定制
开关外观可通过修改default_style结构体进行定制,包括:
  • 尺寸:通过SWITCH_HEIGHT调整基准高度,宽度自动按比例计算
  • 倒角:通过SWITCH_CORNER调整按钮圆角
  • 偏移量:通过SWITCH_OFFSET调整边框宽度
  • 颜色:
      - bgColor:背景色(关闭状态)
      - selectBgColor:选中背景色(打开状态)
      - textbgColor:文字颜色(关闭状态)
      - textselectBgColor:选中文字颜色(打开状态)
      - switchColor:滑块颜色
      - borderColor:边框颜色


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


六、控件源码下载
请至菜单栏:组件与控件中心

七、视频演示


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|Lcdvision Technology ( 苏ICP备10203891号 )

GMT+8, 2025-4-20 06:00 , Processed in 0.080610 second(s), 32 queries .

快速回复 返回顶部 返回列表