黄金会员
主题
帖子
积分7030
阅读权限40
注册时间2013-11-22
最后登录1970-1-1
在线时间 小时
|
侦测按键常用的是: 中断法、轮询法、定时器中断查询法,按键软件消抖方法常见的是延时查询法和连续查询法,依据使用定时器还是延时函数再细分多种方法。
大部分的51教程和书籍教的都是延时法,看别人项目成熟的代码用的比较多的是 定时器中断查询法,本文只讨论外部中断触发。
在网上搜一下,可以发现,大部分的帖子对按键触发中断的做法都是很不看好的,各种原因都有。但是中断法有一些优势是别的方法无法比拟的。
例如:
中断唤醒MCU,在低功耗设备上,只有外部中断触发,才能唤醒MCU。
主程序需要连续采样输出的死循环程序。定时器查询、或者延时、或者轮询都会打断采样的过程导致数据出错。特别是定时器查询,通常定时器设置的都是ms级查询时间,会导致采样过程不连续,,而实际的程序可能并不需要经常使用按键,这样定时器的频繁中断其实并没有节省CPU的资源,反而极大的浪费了CPU的宝贵资源。
大部分中断法用延时函数去消抖,带来的问题也不少,常见的是消抖效果不好,延时并不能改变外部中断是否触发。有的人用低电平外部中断处罚,其实也不是好主意,这个要从单片机的输入口的寄存器说起,通常:- 下降沿触发是锁存中断信号——D触发器记忆的,意即:即使当时CPU来不及响应中断,外部中断信号撤消后,由于D触发器的记忆作用,消失的中断信号仍然有效,直到被响应并进入中断ISR,记忆的中断信号才会由硬件清除;
- 而低电平触发是即时的,当外部中断信号撤消时,中断申请信号随之消失。也就是:如果在外部中断信号作用申请期间,CPU来不及响应此中断,那么有可能,这次中断申请就漏掉了。
- ——显然下降沿触发不会漏掉短暂的中断申请信号。
- ——低电平触发信号低电平宽度显然不能大于ISR响应执行时间,否则,当ISR完成,RETI退出中断时,将再次被低电平触发,如此反复响应中断。
复制代码 于是,我们可以利用外部中断、定时器中断、和连续查询法来设计一个按键程序,流程图如下:
大图:
按键中断触发.pdf
(84.82 KB, 下载次数: 25, 售价: 1 人民币)
程序的原理是:
将按键的状态分解成 按下-->保持-->松开 三种状态分别检测。
利用定时器轮询实现连续查询法,从而实现消抖、短按键、长按键、快进(退)按键的实现。在外部中断中开启定时器中断,在定时器中断中开启外部中断,实现保持中断灵敏性的同时最少占用系统资源。
|
|