打印
[51单片机]

按键去抖 无需延时 无需中断

[复制链接]
814|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
39度5|  楼主 | 2016-10-14 22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*无敌呆呆猫 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的初始值呢还是需要慢慢精调到合适的范围的

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝