发新帖我要提问
12
返回列表
打印

键盘扫描的消抖一般要延时多少时间

[复制链接]
楼主: yufe
手机看帖
扫描二维码
随时随地手机跟帖
21
yirongfu| | 2011-4-7 18:00 | 只看该作者 回帖奖励 |倒序浏览
16楼 机械抖动你可以根据实践的值推算5-10ms,延时防抖只是避免5-10ms内多触发按键事件,而没有防止误按、干扰等操作的功能,你只要检测到下降沿(或上升沿)就会触发按键事件,所以这样的程序并不可靠。一般正常手动 ...
joyme 发表于 2011-4-7 15:46


呵呵,你说的是误操作,不好意思我理解成抖动了,误操作不是楼主关心的问题,也不见楼主来关心他的问题,就不讨论了。

使用特权

评论回复
22
背泳的鱼| | 2011-4-7 18:25 | 只看该作者
如果有兴趣,研究一下用中断扫描,网上基于状态机的例程,只有三行代码

使用特权

评论回复
23
yufe|  楼主 | 2011-4-7 18:43 | 只看该作者
扫描时间过快时会导致你一次按键多次响应的 ,不过可以通过加入一个标志位,在你长按的时候,如果标志位为1则说明之前已经执行过一次,下次就不要执行了,直接返回主程序,这样可以做到一次按键一次响应,同时运用好 ...
wangpe 发表于 2011-4-6 23:12
你说到我心里了,我就是这样想的。。。

使用特权

评论回复
24
guoyt| | 2011-4-7 18:48 | 只看该作者
这样做有一个小小的特点,就是你长按之前他都处理了一下,有时候你不希望他发生,就必须采用抬起的那一个上升沿进行响应了 HOHO

使用特权

评论回复
25
yufe|  楼主 | 2011-4-7 18:57 | 只看该作者
上升沿我一般少用得到,要用也行,不过还要加多抬起的消抖。

使用特权

评论回复
26
wangjun403| | 2011-4-7 19:06 | 只看该作者
为什么不用硬件消抖

使用特权

评论回复
27
jiangfuquan999| | 2011-4-7 19:07 | 只看该作者
我一般5ms-10ms

使用特权

评论回复
28
hanwe| | 2011-4-7 19:13 | 只看该作者
void main()
{
  P3=0xff;
  wela=1;
  P2=0x00;
  wela=0;
  while(1)
  {
  if(d2==0)    //检测是否有键按下
  {
  delay(5);
  if(d2==0)   //确认是否有键按下
  {
  P1=0x00;
  num++;
  if(num==16)
  num=0;
  }
  while(!d2);   //键盘松手检测
  delay(5);
  while(!d2);
  }
  else
  P1=0xff;
  dula=1;
  P0=table[num];
  dula=0;
  }
  }
  void delay(uint z)
{
  uint x,y;
  for(x=100;x>0;x--)
     for(y=z;y>0;y--);
}
我用的是5MS,还行。。。用键盘加数减数枚问题。。带松手检测按下松开后相应。。。这是我学习键盘时写的一个小程序希望对你有用。。。

使用特权

评论回复
29
yufe|  楼主 | 2011-4-7 19:20 | 只看该作者
void main()
{
  P3=0xff;
  wela=1;
  P2=0x00;
  wela=0;
  while(1)
  {
  if(d2==0)    //检测是否有键按下
  {
  delay(5);
  if(d2==0)   //确认是否有键按下
  {
  P1=0x00;
  num++;
  if(num==16)
  num=0; ...
hanwe 发表于 2011-4-7 19:13

谢谢,不过,消抖还是要中断的好

使用特权

评论回复
30
yufe|  楼主 | 2011-4-7 19:35 | 只看该作者
结贴了,多谢各位大侠

使用特权

评论回复
31
ALEX1916| | 2011-4-7 21:37 | 只看该作者
呵呵

使用特权

评论回复
32
ALEX1916| | 2011-4-7 21:37 | 只看该作者
键盘 我的做法是例如定时1ms扫描一次键盘,若连续10次扫描到按键按下,则查询按键已经按下标志:
此标志为0则证明这是新的按下行为,置标志,处理按键程序;
此标志为1则证明按键已经按下,处理程序已经执行,不再重复执行。
扫描时发现按键释放,则清标志。

使用特权

评论回复
33
sysdriver| | 2011-4-8 13:41 | 只看该作者
靠!!!!!

绝对是灵异事件,谁能解释解释?
https://bbs.21ic.com/viewthread.p ... ight=%2Bzhaogongzuo

使用特权

评论回复
34
ayb_ice| | 2011-4-9 10:25 | 只看该作者
消抖只是一个概念,一般在几个MS~100MS之间
延时也是消抖,定时调用也是消抖,只是实方法不同

使用特权

评论回复
35
ming117284| | 2011-4-12 22:47 | 只看该作者
楼主这个程序稍作修改就能得到你想要的结果

bit   fg_shake;               =0
bit   fg_scan;                 =0

//中断中,每10ms就fg_scan=1;
void    main(void)
{
         -----;
         if(fg_scan==1)
         {
                    fg_scan = 0;
                    keyscan();
         }
}

void   keyscan(void)
{
         if(key_on ==1) //有键按下
         {
                   if(fg_shake==0)  
                   {
                               fg_shake=1;
                   }
                   else  if(fg_shake_1==0)  
                   {
                               fg_shake_1=1;
                              //按键处理

                   }
         }
         else   fg_shake =0;
}

使用特权

评论回复
36
hnsw| | 2011-7-26 00:08 | 只看该作者
MARK~~~

使用特权

评论回复
37
renyaq| | 2011-7-27 13:53 | 只看该作者
MARK~~~
hnsw 发表于 2011-7-26 00:08
mark什么?

使用特权

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

本版积分规则