微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 状态机定时器法按键消抖,在定时器中断里面调用按键扫描子程序好还是在主函数里调用好

状态机定时器法按键消抖,在定时器中断里面调用按键扫描子程序好还是在主函数里调用好

时间:10-02 整理:3721RD 点击:
我的主函数用while循环ad转换和更新1602显示,每循环一次409ms左右,扫描程序放在哪好

40ms也是有问题的,delay不能写在主干道,否则严重限制程序的性能。
如果使用的是矩阵键盘,那么通常使用一个定时器来扫描,一般做在定时器中断内,前提是这个定时器不是频繁中断的类型,否则影响主循环。我最近一个项目使矩阵键盘用的10ms一次的扫描,就是做在中断内。执行的语句就是按键按下,去抖计时,时间到产生按下键值,时间超过一定的值,产生按住值,如果放开,产生释放动作,这些动作要进入队列,中断内只做加入队列操作,主循环负责去除按键值进行处理。
如果是简单IO输入按键,我通常是做成外部中断,一旦产生外部中断,说明有按键操作,然后开始去抖扫描,还是使用定时器中断。
还有一种,如果是简单应用程序,可以不使用任何中断,就在主循环内查询IO口的状态,产生按键之后,置好标志,开始去抖,去抖可以使用一个计时器作为时间参考,会很准。但是如果循环一次40ms,貌似没执行两次按键信号就消失了。去抖时间一般是10~30ms。这时候给人的感觉就是按键不是很灵敏。

循环一次409ms?这个程序得多大啊?
假设使用16M主频,单周期指令是 1/16M = 62.5ns
一次循环执行的单周期指令 409ms/62.5ns = 6544000条
假设编译器效率为80%,转换为C语言就是 6544000 * 0.8 = 5235200
显然,这是不可能的,那么你的程序设计上一定有问题!
所以,不要把delay这样的函数放在程序的主干道上....延时的方法很多,这是最差的一种

是40ms,打错了,就是用状态机和定时器这种方法检测按键,一般读取按键值的子程序放在哪

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top