打印

若一按键需要连续按下如何消抖动?

[复制链接]
2684|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
昂首向前|  楼主 | 2007-8-28 17:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
maychang| | 2007-8-28 18:02 | 只看该作者

软件去抖动一般是延时若干ms

然后再读键,两次相同则判断健已稳定。
长按键当然就是一定时间内持续按下。
连续按键的意思,是在短时间内(秒数量级)按下若干次。因为手的动作比消抖动慢得多,手再快也不可能每秒按下20次,据此判断即可。

使用特权

评论回复
板凳
昂首向前|  楼主 | 2007-8-28 19:16 | 只看该作者

谢谢maychang,真是个热心人!

可是我是这样判断的啊,但是还是会出现有时候按键无作用,或者重复动作的现象,难道还有其他原因?

使用特权

评论回复
地板
昂首向前|  楼主 | 2007-8-28 19:28 | 只看该作者

譬如这样

        JNB P2.0,NEXT 
         ..............
         ..............
         ..............
         这中间搁了很多条指令
     NEXT:ACALL D10MS
           JNB P2.0,NEXT1
         ..............
         ..............
         ..............
         这中间也搁了很多条指令
    NEXT1:.............
这样写会不会出现上述问题呢?

使用特权

评论回复
5
风...| | 2007-8-29 01:22 | 只看该作者

俺是这么干的:

用数字示波器捕获按键的跳动,对按键按动时的跳动多观察,多测几个键,
然后看跳动时间大概是多长(一般应该都在ms级)
然后根据这个值进行软件延时!

俺一般都是这么干的,不知还有没有更方便的方法,老师多指点啊

使用特权

评论回复
6
computer00| | 2007-8-29 03:00 | 只看该作者

参考:我以前在ARM_00_OS中的按键处理

/**********************************************************************************************
功能:键盘扫描程序。每隔离10ms调用一次。
入口参数:无。
返回:无。
备注:按键相关信息保存在Key中。请参看KEYBoard结构体。
**********************************************************************************************/
void ScanKey(void)                //键盘扫描
{
 if(Key.Value)return;         //如果上次按键还未处理,则直接返回,不扫描新的按键
 
 if(KEY1IN && KEY2IN && KEY3IN && KEY4IN)    //如果输入全部是高,则按键处于释放状态
  {
   if(!(Key.OldValue))                        //如果上次无按键按下
    {
     return;                           //返回
    }
   else                                //如果上次有按键按下
    {
     if(Key.PressedTime>100)          //按键时间超过一秒,长按键码
      {
       Key.Value=Key.OldValue+0x80;   //长按键码等于普通按键码加0x80
      }
     else if(Key.PressedTime>1)
      {
       Key.Value=Key.OldValue;        //按键值
      }
     Key.OldValue=0;
    }
   return;
  }
 else                                  //按键按下
  {
   Key.NewValue=0;
   if(!KEY1IN)Key.NewValue=KEY1;        //KEY1键按下
   if(!KEY2IN)Key.NewValue=KEY2;        //KEY2键按下
   if(!KEY3IN)Key.NewValue=KEY3;        //KEY3键按下
   if(!KEY4IN)Key.NewValue=KEY4;        //KEY4键按下

   if(Key.NewValue==Key.OldValue)         //如果连续两次扫描到一样的键,即按键按下长于10ms
    { 
     if(Key.PressedTime>200)                   //如果按键按下超过2s
      {
       Key.PressedTime-=4;                     //则自动按键。相当于每隔50ms按一次
       Key.Value=Key.NewValue;
       return;
      }
     else
      {                              
       Key.PressedTime++;                     //按键按下计时加一
      }
    }
   else
    {
     Key.PressedTime=0;                       //如果本次按下跟上次按下不一样,则按键按下时间清零
    }
   Key.OldValue=Key.NewValue;                 //保存本次按键值
  }
}
///////////////////////////////////////////////////////////////////////////////////////////////

使用特权

评论回复
7
maychang| | 2007-8-29 08:38 | 只看该作者

回楼主

问题可能的原因,有软件硬件两种。
软件方面,可能是:
“这中间搁了很多条指令”
有多条指令, D10MS  延时10ms,总时间就不是10ms了。再说,执行这些指令时还可能发生中断,那检查两次按键的时间间隔就更长了。
比较好的方法是在定时中断里检查按键。一般总要使用定时中断的,例如2ms调用一次显示,那么可以每四次定时中断检查一次按键。这要求检查按键程序写得短小精悍,占用时间尽可能少。
硬件方面,可能按键接触不好,或时断时续。

使用特权

评论回复
8
gjg191| | 2007-8-29 08:55 | 只看该作者

dd

俺以前做家电控制板的时候一般要求1s按3次有反应就ok,人不可能反映那么快的,你可以把延时作的长点

使用特权

评论回复
9
昂首向前|  楼主 | 2007-8-31 12:07 | 只看该作者

谢谢楼上各位!

问题解决了,在按键放开的时候也需要放一条判断按键是否松开的指令!

使用特权

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

本版积分规则

26

主题

109

帖子

1

粉丝