news 2026/6/17 21:49:09

按键检测与消抖

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
按键检测与消抖

按键检测是做项目时经常遇到的问题,很多时候缺乏经验容易顾此失彼。个人梳理了一下技术点,水平有限,不足之处希望指出,希望能和大家共同进步。

1.按键检测

我们这里以默认低电平,按键按下读取到高电平来叙述,按键按下检测比较稳妥的是边沿读取,即读取电平之间的切换,单纯的读取电平容易受肌肉抖动影响,故现在按下读取应该读取低电平变成高电平这一过程

uint8_t key_last = 0;//上次电平 uint8_t key_now = 0; if(key_last == 0 && key_now == 1) { }

2.按键消抖

手指按下的时候会有抖动,所以应该消抖,消抖延时时间一般在20ms左右。注意这里最好采用非阻塞延时,否则会影响外设上的其他功能,tick放在中断中执行,我这里中断是1ms执行1次,根据需要调整就可以。另外MS_TO_TICK(ms)可以根据需要灵活调整

#define MS_TO_TICK(ms) ((ms) * 1) uint32_t data tick = 0; /* 系统时间戳,单位1ms */ uint32_t xdata data_return = 0; uint16_t xdata now; /* 判断是否过了指定毫秒数 */ uint8_t elapsed_ms(uint32_t start, uint32_t ms) { now = tick; if(now > start) { data_return = now - start; } if(now < start) { data_return = 0xFFFF - start + now + 1; } return (data_return >= MS_TO_TICK(ms)) ? 1 : 0; }

3.单击和长按的功能逻辑

大家最想看的还是整体代码

这里采用switch-case的结构,有些地方应该没有定义,在上面定义一下即可

typedef enum { KEY_IDLE, KEY_DEBOUNCE, KEY_PRESS, KEY_HOLD } State; uint8_t Key_Scan(void) { uint8_t key_now = KEY_PIN; switch(State) { case KEY_IDLE: { // 上升沿:检测按下 if(key_last == 0 && key_now == 1) { debounce_tick = tick; state = KEY_DEBOUNCE; } } break; case KEY_DEBOUNCE: { // 必须保持稳定高电平 if(key_now == 1) { if(elapsed_ms(debounce_tick, 20)) { press_tick = tick; state = KEY_PRESS; } } else { state = KEY_IDLE; } } break; case KEY_PRESS: { // 下降沿:松开 if(key_last == 1 && key_now == 0) { state = KEY_IDLE; if(!long_flag) { key_last = key_now; return KEY_SHORT; } } // 长按判断(持续状态,不依赖边沿) if(elapsed_ms(press_tick, LONG_PRESS_MS)) { long_flag = 1; return KEY_LONG; } } break; } key_last = key_now; return KEY_NONE; }

4.功能拓展

其实还可以在这个架构上增加例如双击之类的功能,如果有需要可以自己尝试增加功能,代码仅供参考,如有问题欢迎提出

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 21:46:18

终极免费开源字体指南:5分钟掌握Montserrat专业级几何无衬线字体

终极免费开源字体指南&#xff1a;5分钟掌握Montserrat专业级几何无衬线字体 【免费下载链接】Montserrat 项目地址: https://gitcode.com/gh_mirrors/mo/Montserrat 还在为设计项目寻找既专业又免费的字体吗&#xff1f;厌倦了复杂的技术术语和繁琐的安装步骤&#xf…

作者头像 李华
网站建设 2026/6/17 21:30:45

学术写作 24: 那些足以“一票否决”的格式陷阱

1. 那些让你论文"秒拒"的格式陷阱 我刚当审稿人的时候&#xff0c;曾经收到过一篇内容相当扎实的论文。作者在机器学习领域提出了新算法&#xff0c;实验数据也很漂亮。但当我翻到第三页&#xff0c;发现连续三个数学公式的变量符号格式不统一时&#xff0c;直接给了…

作者头像 李华
网站建设 2026/6/17 21:17:04

计算机毕业设计之基于数据分析的华北小麦产量可视化

由于移动应用技术的持续性的快速发展&#xff0c;现实生活中人们大多数都是通过移动手机、电脑等智能设备来完成生活中的事务。因此&#xff0c;许多的人工传统行业也开始与互联网结合&#xff0c;不再一味的依靠人工劳动&#xff0c;努力打造半自动数字化甚至是全自动数字化模…

作者头像 李华
网站建设 2026/6/17 21:12:04

支付宝悄悄做了个AI版,我看了下内测截图,界面确实不太一样了

最近支付宝搞了个大动作——AI版支付宝开始内测了。说是内测&#xff0c;但其实网上已经有不少截图流出来。我翻了一圈&#xff0c;最大的感受是&#xff1a;这次改版和之前加个AI助手入口完全不是一回事。在现在AI图片猖獗的时代&#xff0c;流出的内测图片属实真假难辨&#…

作者头像 李华