打印

键盘扫描问题

[复制链接]
2827|13
手机看帖
扫描二维码
随时随地手机跟帖
沙发
我是土匪| | 2010-8-2 10:06 | 只看该作者
找 《匠人手记》之《按键漫谈》。

使用特权

评论回复
板凳
HWM| | 2010-8-2 10:13 | 只看该作者
1)通常为数毫秒级别。
2)简单系统可以串入主循环,则便是“无时无刻”扫描之。否则建议采用定时中断扫描,当然也可以采用按钮触发中断扫描。
3)无论是那种扫描都必须考虑消抖。

使用特权

评论回复
地板
zhaogongzuo|  楼主 | 2010-8-2 11:05 | 只看该作者
1)通常为数毫秒级别。
2)简单系统可以串入主循环,则便是“无时无刻”扫描之。否则建议采用定时中断扫描,当然也可以采用按钮触发中断扫描。
3)无论是那种扫描都必须考虑消抖。 ...
HWM 发表于 2010-8-2 10:13

恩,书上说抖动时间大约6ms,消抖10ms应该可以了。怎么才算复杂系统呢?
如果我每隔10ms扫描一次键盘,也可以用这个间隔做消抖,感觉上好像“没消抖”

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==1)  //说明过了10ms
                   {
                               //按键处理
                   }
                   else   fg_shake=1;
         }
         else   fg_shake =0;
}

使用特权

评论回复
5
程序匠人| | 2010-8-2 11:09 | 只看该作者
4# zhaogongzuo


你的程序虽然消抖了,但是没有防止单次击键下重复响应。一般情况下这是不允许的,即使是做连击功能,也该有个计时,以防响应过快。

使用特权

评论回复
6
zhaogongzuo|  楼主 | 2010-8-3 08:59 | 只看该作者
4# zhaogongzuo  


你的程序虽然消抖了,但是没有防止单次击键下重复响应。一般情况下这是不允许的,即使是做连击功能,也该有个计时,以防响应过快。 ...
程序匠人 发表于 2010-8-2 11:09

重复响应是说,按键抬起时没有清除按键标志就又按下键是吗?
好像问题不大吧,因为处理的时候,这样快速的按键可以认为一次按键。我一般单击按键是按照下降沿来处理的,如果是连击,10ms应该够反应了吧,也可以在处理时加个时间计数。。。

使用特权

评论回复
7
zhoukok| | 2010-8-3 09:54 | 只看该作者
扫描时间过快时会导致你一次按键多次响应的 ,不过可以通过加入一个标志位,在你长按的时候,如果标志位为1则说明之前已经执行过一次,下次就不要执行了,直接返回主程序,这样可以做到一次按键一次响应,同时运用好的话,可以用来做长键处理,只需加入一个长按时间计数则可

使用特权

评论回复
8
zhaogongzuo|  楼主 | 2010-8-3 12:29 | 只看该作者
扫描时间过快时会导致你一次按键多次响应的 ,不过可以通过加入一个标志位,在你长按的时候,如果标志位为1则说明之前已经执行过一次,下次就不要执行了,直接返回主程序,这样可以做到一次按键一次响应,同时运用好 ...
zhoukok 发表于 2010-8-3 09:54

你说到我心里了,我就是这样想的。。。

使用特权

评论回复
9
zhoukok| | 2010-8-3 15:15 | 只看该作者
8# zhaogongzuo
呵呵  这样做有一个小小的特点,就是你长按之前他都处理了一下,有时候你不希望他发生,就必须采用抬起的那一个上升沿进行响应了 HOHO

使用特权

评论回复
10
OUCHANGHUA| | 2010-8-3 16:11 | 只看该作者
学习了,,21IC真好,,

使用特权

评论回复
11
zhaogongzuo|  楼主 | 2010-8-3 17:25 | 只看该作者
上升沿我一般少用得到,要用也行,不过还要加多抬起的消抖。

使用特权

评论回复
12
852600992| | 2010-8-3 18:49 | 只看该作者
矩阵扫描

使用特权

评论回复
13
mage心寒| | 2010-8-5 19:07 | 只看该作者
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,还行。。。用键盘加数减数枚问题。。带松手检测按下松开后相应。。。这是我学习键盘时写的一个小程序希望对你有用。。。

使用特权

评论回复
14
zhaogongzuo|  楼主 | 2010-8-6 15:37 | 只看该作者
13# mage心寒
谢谢,不过,消抖还是要中断的好

使用特权

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

本版积分规则

3

主题

28

帖子

1

粉丝