按键抖动的软件滤波程序
![](../imgqa/ele/mcu/mcu-3721rd.com-27205gfv2y5axo5s.png)
/*无敌呆呆猫 2016年10月10日 凌晨3:50 编写完成 特此留念*/
#include<reg51.h>
unsigned char x,y,k,k1,k2,k3,k4;
x=1;
y=1;
k=0;
k1=1;
k2=1;
k3=1;
k4=1
void main(){
if(!(k1&k2)&y){ //(2)
x--;
if(x<1){x=1;
y=0;
k=k<<1|k1; //按键赋值 只是个例子
k=k<<1|k2;
k=k<<1|k3;
k=k<<1|k4; }
}
if(k1&k2){ //(1)
x++;
if(x>100){x=100;
y=1;
}
}
if(!y&!(k1&k2)){x--; //(3)
if(x<1){x=1;}
}
if(k==0x07){...} //按键k1功能
if(k==0x0b){...} //按键k2功能
if(k==0x0d){...} //按键k3功能
if(k==0x0e){...} //按键k4功能
.
.
.
.
.
}
刚上电的时候没有任何键被按下 (1)很快就会x>100 y=1 当k1或k2任意一键被按下
(2)就会持续的x-1 如果按下的动作产生抖动 产生出上下交替的高低尖峰扰动电平
(1)和(2)的x就会交替的+1—1 发生相互抵消的作用从而保持x的值基本不变 当按键
按下的动作由抖动过度到稳定的低电平之后 (2)的x值会在稳定阶段持续的—1 当累
积减到100之后说明按键是被正确稳定的按下了 开始执行(2)里面的if语句 执行按
键的相应功能操作并把y置0 锁死(2)语句的全部功能 防止用户未及时松开按键
从而导致(2)语句里的按键功能被反复执行 如果用户在松开按键的时候发生了电平
抖动 产生出上下交替的高低尖峰扰动电平 由于前面y已经被置0 打开了(3)语句
的入口 那么语句(1)和(3)的x也会交替的发生+1—1的动作 从而抵消掉抖动的高
低尖峰扰动电平 当用户松开按键的动作过度到稳定阶段 不再发生电平抖动 那
么(1)语句里的x就会持续稳定的+1 当x稳定的+到100时 说明用户已经完全松开按
键 (1)语句里的if语句会从新把y置1 从而从新打开语句(2) 开始新一轮的按
键检测。
此按键抖动软件滤波程序 消除按键抖动不需要延时占用系统资源 也不需要占用定时
器。每次程序从头执行到末尾 只占用系统的3条if语句(2)(1)(3)资源
当然 x的初始值呢还是需要慢慢精调到合适的范围的
没耐心仔细看下去了,不过小编的这股子热血激情我还是非常喜欢的,凌晨写代码我以前也经常干啊,哈哈
有一个问题,按键抖动产生的高低尖峰持续时间(或者说单片机检测到高低电平的个数)并不一定一样,所以这样并不能保证x的值保持不变,不过这个软件滤波的思路不错
不需要高低尖峰持续 的时间一致的啊 这就像一个物理的电子滤波器 有尖峰干扰才会动作的 呵呵 还以为没人能看懂我的意思咧
你哈 耐心看一下 我觉得这个蛮牛叉的哦
对于软件不懂 只是原来搞过数字电路式的按键防抖线路
肯定比我懂啦 我只是搞电器维修的 单片机只是业余爱好
不知坛友搞什么电器维修呀 我也是搞维修的
家用电器维修 跟摆弄破烂差不多吧
高人呀 会修变频 电焊机 等其他的设备吗
不会 但是应该也差不多吧 主要是家用电器
电磁炉 液晶电视 电脑显示器 冰箱空调你都在行吧 现在这块应该还可以
那老兄你是做什么的咧
电子设备维修 什么都干的 就是不精
设备维修 只做单一的设备品种维修的话 应该很吃香 只要精一种设备就行
行啊,今天太晚了,我会仔细学习下你的这个代码的
抓紧时间研究哦 慢了的话俺就申请专利啦 哇哈哈
在开发板上试一下按键操作好不好用就知道代码好不好了。
小编的大作我仔细看过了,想法真心不错,点个赞!没有借助delay延时,没有借助定时器资源,依靠指令++累积的时间来消抖,很不错啊。
但是也有一些问题啊 1、代码定义规范要改改啊,太随意了。 2、移植起来不方便,消抖的时间会随着主函数while里任务的增加或者减少变化,这里仅仅是假设一下,一个任务运行时间特别久,花费了500ms时间,然后按键消抖也需要一段时间,然后在这个时候有人按下了按键,速度很快,只有200ms,那这一次的单击事件就会错过了。