STM32单片机实现触摸按键滑动操作详解:零基础入门第44步
主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
触摸开关 | 电路原理,跳线设置,驱动程序与调用。 | 能读出键值即可。 |
师从洋桃电子,杜洋老师
📑文章目录
▲ 回顾上期🔍单片机按键双击与长按识别技术全解析 | 零基础入门STM32第四十三步
(图1:触摸按键滑动示意图)
(图2:触摸按键滑动实现示意图)
⏬超级终端_hyper_terminal_latest(中文)
一、触摸按键滑动操作原理
1.1 硬件设计要点
触摸按键滑动操作的硬件基础是密集排列的触摸按键阵列。如图1所示,当相邻按键间距足够小时(通常3-5mm),手指滑动可同时触发多个按键:
+---+---+---+---+
| A | B | C | D | < 触摸按键阵列
+---+---+---+---+
│ │ │ │
└─> 滑动方向检测区域
1.2 软件识别原理
软件通过时序判断和状态检测实现滑动识别:
- 按下起始按键时启动计时
- 实时监测相邻按键触发状态
- 判断滑动方向的关键条件:
- 相邻按键触发时间差 < 阈值
- 按键触发顺序形成连续轨迹
二、单片机识别滑动操作的方法
2.1 状态机设计
使用三级状态机进行判断:
按键按下
持续按压
超时
未超时
检测到相邻触发
未检测到
初始状态
按下检测
长按判断
长按处理
相邻按键检测
滑动处理
单击/双击判断
2.2 关键参数定义
#define KEYA_SPEED1 100 // 长按阈值(100×10ms=1s)
#define KEYA_SPEED2 10 // 双击间隔(10×20ms=200ms)
三、程序实现详解
3.1 代码结构解析
3.1.1 主程序流程图
main
初始化
循环检测
检测按键A
去抖动处理
长按判断
执行长按操作
检测相邻按键
执行滑动操作
双击检测
执行双击操作
执行单击操作
3.1.2 核心代码段分析
// 按键A处理逻辑
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){
delay_ms(20); // 去抖动
if(!GPIO_ReadInputDataBit(...)){
// 长按检测
while(... && c<KEYA_SPEED1){
c++; delay_ms(10);
}
if(c>=KEYA_SPEED1){
// 长按处理
} else {
// 滑动检测
if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){
k++; // 右滑处理
printf("A键右滑 %d \r\n",k);
}
// 双击检测
for(b=0;b<KEYA_SPEED2;b++){
delay_ms(20);
if(!GPIO_ReadInputDataBit(...)){
// 双击处理
}
}
}
}
}
▲ 完整工程代码示例⏬触摸按键滑动程序
3.2 滑动方向判断算法
采用相邻触发检测法:
- 右滑判断:当前按键松开前检测到右侧按键触发
- 左滑判断:当前按键按下时检测到左侧已触发
当前按键 | 触发相邻键 | 方向判断 |
---|---|---|
A | B | 右滑 |
B | A | 左滑 |
B | C | 右滑 |
C | B | 左滑 |
四、应用场景优化建议
4.1 参数调整指南
- 灵敏度调节:
- 减小
KEYA_SPEED1
值提高响应速度 - 增大
KEYA_SPEED2
值放宽双击识别 - 添加防误触机制:
// 添加中间状态检测
if(滑动触发 && 持续时间>50ms){
// 确认有效滑动
}
4.2 扩展应用方向
- 多级滑动控制:
// 根据滑动持续时间设置增量步长
if(滑动时间 < 500ms) k += 1;
else if(滑动时间 < 1000ms) k += 5;
else k += 10;
- 环形滑动模式:
// 边界处理
if(k > MAX_VALUE) k = MIN_VALUE;
if(k < MIN_VALUE) k = MAX_VALUE;
(图2:环形滑动触摸按键示意图)
五、开发注意事项
- 硬件布局优化:
- 使用PCB泪滴设计提高触摸灵敏度
- 相邻按键保留0.2mm电气隔离
- 软件抗干扰:
- 增加软件滤波算法
- 采用滑动轨迹预测
- 功耗控制:
- 在空闲时切换低功耗模式
- 使用中断唤醒机制
六、相关资源
[1] 洋桃电子B站课程-STM32入门100步
[2] STM32F103xx官方数据手册
[3] STM32F103X8-B数据手册(中文)
[4] STM32F103固件函数库用户手册(中文)
[5] 触摸按键滑动程序
[6] 超级终端_hyper_terminal_latest(中文)
💬 技术讨论(请在评论区留言~)
📌 下期预告:下一期将探讨数码管原理与驱动程序,欢迎持续关注!
点击查阅🔍往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:v1.0 初始版本(2025-03-04)
作者:触角01010001