打印
[STM32F1]

按键去检测

[复制链接]
3070|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
铜牌之路|  楼主 | 2015-8-13 16:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 铜牌之路 于 2015-8-13 19:56 编辑

u8 KEY_AnJian(void)
  {
               u8  key_up = 1;  
    static   u16 key_count=0;  //定时器扫描次数
         if(key_up&&(KEY_Y==0||KEY_X==0||KEY_Z==0||KEY_S==1||KEY_QueR==0||KEY_FanH==0||KEY_LiuSY==1))
     {
    if(key_count<=3)
     {
         key_count=key_count+1;
         }
   }
else
     {
      key_count = 0;
     }
                if(key_count >= 3)
                {
                         if(KEY_Y==0)          return 5;  
                        else if(KEY_X==0)      return 6;
                        else if(KEY_Z==0)        return 7;
                        else if(KEY_S==1)      return 8;  
                        else if(KEY_QueR==0)   return 9;  
                        else if(KEY_FanH==0)   return 10;
                        else if(KEY_LiuSY==1)  return 11;
                }  
                 else if((KEY_Y==1||KEY_X==1||KEY_Z==1||KEY_S==0||KEY_QueR==1||KEY_FanH==1||KEY_LiuSY==0))        key_count = 0;
            return 0;        
}


我定时器设置的300ms扫描一次,但是非常快,一按按键,就执行了几次按键,怎么回事呢???谢谢帮忙解答,这是我自己写的按键程序,肯定有问题,但自己找不出来
沙发
JY-DX-JY| | 2015-8-13 16:30 | 只看该作者
定时准确吗?

使用特权

评论回复
板凳
铜牌之路|  楼主 | 2015-8-13 16:33 | 只看该作者

用的LED显示定时,看了一下,大概差不多,还是比较准确

使用特权

评论回复
地板
popeye021| | 2015-8-13 17:11 | 只看该作者
百度搜索一下,网上很多使用状态机的现成的按键扫描程序,学习移植到自己的应用上就行了。

使用特权

评论回复
5
铜牌之路|  楼主 | 2015-8-13 17:29 | 只看该作者
popeye021 发表于 2015-8-13 17:11
百度搜索一下,网上很多使用状态机的现成的按键扫描程序,学习移植到自己的应用上就行了。

...

谢谢了,但是能不能帮忙看一下这个错在哪里呢?

使用特权

评论回复
6
popeye021| | 2015-8-13 17:37 | 只看该作者
铜牌之路 发表于 2015-8-13 17:29
谢谢了,但是能不能帮忙看一下这个错在哪里呢?

先学习别人的成熟程序,再修改移植。不要闭门造车。
看懂别人的程序后,你自己的程序有没有问题也就能分析出来了。

使用特权

评论回复
7
songchenping| | 2015-8-13 17:39 | 只看该作者
你想实现什么功能,可以简单描述一下。

使用特权

评论回复
8
19910414twzh| | 2015-8-13 18:48 | 只看该作者
u8 KEY_AnJian(void)
  {
             static  u8  key_up = 1;  
    static   u16 key_count=0;  //é¨?è′?êy3?ê?éè?a1?aá?????ó?
         if(key_up&&(KEY_Y==0||KEY_X==0||KEY_Z==0||KEY_S==1||KEY_QueR==0||KEY_FanH==0||KEY_LiuSY==1))
     {
    if(key_count<=3)
     {
         key_count=key_count+1;
         }
   }
else
     {
      key_count = 0;
     }
                if(key_count >= 3&&key_up)
                {
                                             key_up = 0;
                         if(KEY_Y==0)          return 5;  
                        else if(KEY_X==0)      return 6;
                        else if(KEY_Z==0)        return 7;
                        else if(KEY_S==1)      return 8;  
                        else if(KEY_QueR==0)   return 9;  
                        else if(KEY_FanH==0)   return 10;
                        else if(KEY_LiuSY==1)  return 11;
                }  
                 else if((KEY_Y==1||KEY_X==1||KEY_Z==1||KEY_S==0||KEY_QueR==1||KEY_FanH==1||KEY_LiuSY==0))        {key_count = 0;key_up=1;}
            return 0;        
}
/////////////////////////////////
没测试过,吧key_up用上了,看看能不能用

使用特权

评论回复
9
铜牌之路|  楼主 | 2015-8-13 19:40 | 只看该作者
19910414twzh 发表于 2015-8-13 18:48
u8 KEY_AnJian(void)
  {
             static  u8  key_up = 1;  

不懂这个意思呢?我先试试

使用特权

评论回复
10
铜牌之路|  楼主 | 2015-8-13 19:41 | 只看该作者
songchenping 发表于 2015-8-13 17:39
你想实现什么功能,可以简单描述一下。

定时器扫描按键,实现去抖动

使用特权

评论回复
11
铜牌之路|  楼主 | 2015-8-13 19:55 | 只看该作者
19910414twzh 发表于 2015-8-13 18:48
u8 KEY_AnJian(void)
  {
             static  u8  key_up = 1;  

试了一下。好一点,但是没有实质改变。我是想定时器扫描两次再确定是按键按下的

使用特权

评论回复
12
songchenping| | 2015-8-13 19:55 | 只看该作者
为什么要用定时器去抖动啊。可以用其他方法啊

使用特权

评论回复
13
铜牌之路|  楼主 | 2015-8-13 19:57 | 只看该作者
songchenping 发表于 2015-8-13 19:55
为什么要用定时器去抖动啊。可以用其他方法啊

还有什么方法?

使用特权

评论回复
14
songchenping| | 2015-8-13 19:59 | 只看该作者
最简单的延时去抖啊

使用特权

评论回复
15
铜牌之路|  楼主 | 2015-8-13 20:02 | 只看该作者
songchenping 发表于 2015-8-13 19:59
最简单的延时去抖啊

占用程序时间多,并且也不好用,还是有抖

使用特权

评论回复
16
mmuuss586| | 2015-8-13 22:22 | 只看该作者

简单看没啥问题;

不过还不如改成,连续读3次,假如读的值一样,则作处理;

使用特权

评论回复
17
铜牌之路|  楼主 | 2015-8-13 22:47 | 只看该作者
最后一句if错了  该是与,不是或

使用特权

评论回复
18
铜牌之路|  楼主 | 2015-8-13 22:47 | 只看该作者
mmuuss586 发表于 2015-8-13 22:22
简单看没啥问题;

不过还不如改成,连续读3次,假如读的值一样,则作处理; ...

这个想法不错

使用特权

评论回复
19
ningling_21| | 2015-8-14 08:52 | 只看该作者
不想按键重复执行:
增加一个标志,按键执行一次后标志位为1,此后如果按键未释放也不再执行按键功能,直到按键释放标志清零

使用特权

评论回复
20
铜牌之路|  楼主 | 2015-8-14 09:55 | 只看该作者
ningling_21 发表于 2015-8-14 08:52
不想按键重复执行:
增加一个标志,按键执行一次后标志位为1,此后如果按键未释放也不再执行按键功能,直到 ...

        u8 KEY_AnJian(void)
  {
   static u8 key_count = 0;  //ɨÃè´ÎÊý³õʼÉèΪ0ΪÁËÏÂÃæÓÃ
                      u8  key_up = 1, flag=0;
                if(key_up&&(KEY_Y==0||KEY_X==0||KEY_Z==0||KEY_S==1||KEY_QueR==0||KEY_FanH==0||KEY_LiuSY==1))
     {
                         flag=1;
                        if(key_count<3)
                           { key_count++; }
                 }
                else
         { key_count = 0; }
                if((key_count ==3)&&flag)
                {
                        LED0=!LED0;
                        key_count = 0;
                        if(KEY_Y==0)       return 5;
                        else if(KEY_X==0)  return 6;
                        else if(KEY_Z==0)  return 7;
                        else if(KEY_S==1)  return 8;
                        else if(KEY_QueR==0)  return 9;
                        else if(KEY_FanH==0)  return 10;
                        else if(KEY_LiuSY==1) return 11;
                }
        else if(key_up&&(KEY_Y==0||KEY_X==0||KEY_Z==0||KEY_S==1||KEY_QueR==0||KEY_FanH==0||KEY_LiuSY==1))
          {flag=0;
          key_count=key_count;}                       
  else if((KEY_Y==1&&KEY_X==1&&KEY_Z==1&&KEY_S==0&&KEY_QueR==1&&KEY_FanH==1&&KEY_LiuSY==0))
                            {flag=0;
          key_count = 0;}
            return 0;       
                       
  }

使用特权

评论回复
评论
ningling_21 2015-8-14 10:29 回复TA
改过之后行不行呢 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

85

帖子

0

粉丝