打印

用中断处理或者是定时扫描按键的方法,如何确保不丢键?

[复制链接]
16098|62
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nelsonfung|  楼主 | 2013-10-16 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
按键的处理方法可能莫过于主程序扫描,中断扫描法和定时扫描法。使用中断扫描和定时扫描的方法只有有按键触发中断或是定时时间到了在进行处理按键程序相比于主程序循环扫描的方法可能占用系统资源会更少。但在使用中断扫描或是定时扫描的时候如何才能保证按键能及时的响应而又不丢键呢?比如说定时扫描,扫描到了新的按键 但这个时候主函数来不及处理,要等一会才能响应。但就在这个期间又有了新的按键  这就会导致上一次按键丢键。我能想到的办法就是开辟按键缓存,把没有响应的键都储存起来,然后等到系统逐一响应。不知道各位对这个有什么别的看法?还是说我多虑了~二姨家的朋友们多多赐教啊~:loveliness:
沙发
feilusia| | 2013-10-16 14:11 | 只看该作者
大概可以这么写
void EXIT()
{
  key_read();//读键值
   function = 0x01;//判断键值
}
void key_judge()
{
    switch(键值)
   {
     case 键值1:
      {function=0x10;break;}
     case 键值2:
      {function=0x11;break;}
      .
      .
      .
   }
}
void key_handing1();//按键1处理
{
  处理……
function = 0;
}
void man()
{
INIT();
  while(1)
{
   if(function == 0x01)
     key_judge();//键值判断
   if(function == 0x10)
     key_handing1();//按键1处理
   if(function == 0x11)
     key_handing2();//按键2处理
   。
   。
   。
}
}

使用特权

评论回复
板凳
nelsonfung|  楼主 | 2013-10-16 14:18 | 只看该作者
feilusia 发表于 2013-10-16 14:11
大概可以这么写
void EXIT()
{

但还是没有解决按键丢键的问题啊,还是会丢键吧?

使用特权

评论回复
地板
feilusia| | 2013-10-16 14:25 | 只看该作者
nelsonfung 发表于 2013-10-16 14:18
但还是没有解决按键丢键的问题啊,还是会丢键吧?

这中间时间本来就很短,除非你同时按键,那也应该算你操作不当吧。你玩手机的时候用两根手指同时点中两个软件,两个软件也只会开一个吧。

使用特权

评论回复
5
feilusia| | 2013-10-16 14:28 | 只看该作者
nelsonfung 发表于 2013-10-16 14:18
但还是没有解决按键丢键的问题啊,还是会丢键吧?

要解决丢键问题,也可以进中断函数时关中断,处理好以后再开中断。

使用特权

评论回复
6
nelsonfung|  楼主 | 2013-10-16 14:30 | 只看该作者
feilusia 发表于 2013-10-16 14:25
这中间时间本来就很短,除非你同时按键,那也应该算你操作不当吧。你玩手机的时候用两根手指同时点中两个 ...

也不是啊,我的按键扫描一次也就几十个微秒,主程序是很有可能处理不及时的 比如说在按键处理的时候有大量高优先级的数据急需处理  等把数据处理完,按键中断又扫描到了新的按键。用你的这种方法岂不是丢弃了上一次扫描到的按键值?

使用特权

评论回复
7
nelsonfung|  楼主 | 2013-10-16 14:32 | 只看该作者
feilusia 发表于 2013-10-16 14:28
要解决丢键问题,也可以进中断函数时关中断,处理好以后再开中断。

这按键记录可以是高级别的中断,但按键响应不一定是高级别的响应吧  我的做法是把按键记录下来,然后在逐一响应,只是感觉这样做的话又要开辟暂存空间 程序也相对要麻烦点 不知道有没有更好的解决办法

使用特权

评论回复
8
efen| | 2013-10-16 14:36 | 只看该作者
使用缓存是可以的,把键值存起来。我按键一直都是这样处理的

使用特权

评论回复
9
nelsonfung|  楼主 | 2013-10-16 14:39 | 只看该作者
efen 发表于 2013-10-16 14:36
使用缓存是可以的,把键值存起来。我按键一直都是这样处理的

请问你知不知道一些其他比较优秀的处理方式,分享一下:lol

使用特权

评论回复
10
huzi2099| | 2013-10-16 15:12 | 只看该作者
只要主程序处理得当,不会丢失按键.所以不用特殊的处理.
若是程序中有太多的while(delay)这样的东西就不好说了.
按键总是要消抖的,小于100ms左右的延时,从程序角度看抖动就是一连串的按键.

使用特权

评论回复
11
airwill| | 2013-10-16 15:23 | 只看该作者
开辟 FIFO 数据缓冲区, 是常用的不能同步数据交换的解决办法. 我们的 PC 就是用的这个办法.

使用特权

评论回复
12
feilusia| | 2013-10-16 15:27 | 只看该作者
huzi2099 发表于 2013-10-16 15:12
只要主程序处理得当,不会丢失按键.所以不用特殊的处理.
若是程序中有太多的while(delay)这样的东西就不好说 ...

用上升沿或者下降沿就不需要消抖了吧

使用特权

评论回复
13
feilusia| | 2013-10-16 15:28 | 只看该作者
airwill 发表于 2013-10-16 15:23
开辟 FIFO 数据缓冲区, 是常用的不能同步数据交换的解决办法. 我们的 PC 就是用的这个办法. ...

开辟多大的缓冲区比较合理?

使用特权

评论回复
14
huzi2099| | 2013-10-16 15:30 | 只看该作者
feilusia 发表于 2013-10-16 15:27
用上升沿或者下降沿就不需要消抖了吧

一样需要消抖的.
丢失按键是你的主程序不合理,按键的实时性不要求很高.

使用特权

评论回复
15
nelsonfung|  楼主 | 2013-10-16 15:30 | 只看该作者
huzi2099 发表于 2013-10-16 15:12
只要主程序处理得当,不会丢失按键.所以不用特殊的处理.
若是程序中有太多的while(delay)这样的东西就不好说 ...

防抖可以不用空占系统资源,把防抖的这段时间用来处理其他的任务就好了。主程序处理的再好都会出现丢键的,当然你任务少就另当别论了

使用特权

评论回复
16
nelsonfung|  楼主 | 2013-10-16 15:33 | 只看该作者
feilusia 发表于 2013-10-16 15:28
开辟多大的缓冲区比较合理?

同问!FIFO空间如果太小,可能会溢出吧

使用特权

评论回复
17
airwill| | 2013-10-16 15:36 | 只看该作者
feilusia 发表于 2013-10-16 15:28
开辟多大的缓冲区比较合理?

理论上讲, 选择正常情况下, 最多来不及处理的按键数.  不过这个值不太好求.
也可以从系统角度看, 命令序列的最多按键数.
在缓冲处理上, 也可以做点**. 比如屏蔽 重发键.

使用特权

评论回复
18
nelsonfung|  楼主 | 2013-10-16 15:39 | 只看该作者
huzi2099 发表于 2013-10-16 15:30
一样需要消抖的.
丢失按键是你的主程序不合理,按键的实时性不要求很高.

大量高优先级的任务(优先级低于按键扫描中断或定时扫描的中断)打断主程序,当回过来的时候扫描到新按键,这不就一样的丢键了吗?你这个说法我觉得不合理

使用特权

评论回复
19
nelsonfung|  楼主 | 2013-10-16 15:41 | 只看该作者
airwill 发表于 2013-10-16 15:36
理论上讲, 选择正常情况下, 最多来不及处理的按键数.  不过这个值不太好求.
也可以从系统角度看, 命令序 ...

屏蔽重发键是什么意思呢?

使用特权

评论回复
20
feilusia| | 2013-10-16 15:43 | 只看该作者
airwill 发表于 2013-10-16 15:36
理论上讲, 选择正常情况下, 最多来不及处理的按键数.  不过这个值不太好求.
也可以从系统角度看, 命令序 ...

是不是可以用链表的形式去存放,那就有多少个按键就存多少个。没用过链表,也不知可不可行。

使用特权

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

本版积分规则

5

主题

85

帖子

1

粉丝