/*无敌呆呆猫 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&k3&k4)&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&k3&k4){ //(1)
x++;
if(x>100){x=100; //只是个大概取值
y=1;
}
}
if(!y&!(k1&k2&k3&k4)){x--; //(3)
if(x<1){x=1;}
}
if(k==0x07){...} //按键k1功能 只是个例子
if(k==0x0b){...} //按键k2功能 可以用switch
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的初始值呢还是需要慢慢精调到合适的范围的
|