首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

按键去抖动程序设计

按键去抖动程序设计

我们首先要清楚为什么要按键去抖。先看先按键按下的波形图      


通过这个图形就很清楚为什么要按键去抖了,要是不去抖的话,当按下按键的时候就会在0~5ms内出现抖动,相当于在不停地按下按键而就不是只按了一次了。稳定闭合时间大约是10ms,松手抖动的时间和按下抖动的时间差不多。
        去抖的方法有硬件去抖和软件去抖
        我们常用牺牲CPU的时间来软件去抖,就是按下按键后延时5~10ms时间后再来检查是否有按键按下,松手检测也一样。
硬件去抖的方法如图所示


独立按键的去抖方法很简单,就是在按下和松手后分别加一小段延时再来判断。
例:
sbit key=P1^1;
........................
.......................
if(!key)     //如果有按键按下
{
     delay(10);  //延时一小段时间
    if(!key)    //真有按键按下
    {
      。。。。。。。。/ /   执行按键按下后的操作
    }
  while(!key); //   松手检测,要是没有松手的话就一直执行while循环
}
原理就是这样,去抖的方法很多。

按键的松手检测主要根据键盘扫描的方式来决定,今天写了一个矩阵键盘扫描的程序,然后加了松手检测。结果没达到预想的要求。后来才发现是检测方式错了。
程序是这样的
uchar keyscan()
{
      static uchar H,L,temp;
      P1=0Xf0;
      L=P1&0xf0;
      if(L!=0xf0)
     {
           delay(18);
           if(L!=0xf0)
           {
                L=P1&0xf0;
                P1=L|0x0f;    //P1口重新赋值了   
                H=P1&0X0F;  
           }
     }
/*
P1=0XF0;
L=P1&0XF0;
while(L1!=0XF0)   //松手检测   
{
L=P1&0XF0;
}
*/
   temp=H+L;   

  switch(temp)
   {
    case 0xee:key=1;get1=!get1;break;
    case 0xed:key=2;get1=!get1;break;
    case 0xeb:key=3;get1=!get1;break;
    case 0xe7:key=4;get1=!get1;break;
    case 0xde:key=5;get1=!get1;break;
    case 0xdd:key=6;get1=!get1;break;
    case 0xdb:key=7;get1=!get1;break;
    case 0xd7:key=8;get1=!get1;break;
    case 0xbe:key=9;get1=!get1;break;
    case 0xbd:key=0;get1=!get1;break;
    case 0xbb:key=0xee;get1=!get1;break;
   }      
    return key;
   
}
              








评论这张



继承事业,薪火相传
返回列表