打印
[STM32F1]

按键去检测

[复制链接]
楼主: 铜牌之路
手机看帖
扫描二维码
随时随地手机跟帖
21
铜牌之路|  楼主 | 2015-8-14 09:58 | 只看该作者 回帖奖励 |倒序浏览
ningling_21 发表于 2015-8-14 08:52
不想按键重复执行:
增加一个标志,按键执行一次后标志位为1,此后如果按键未释放也不再执行按键功能,直到 ...

问题是现在,按键不是按照定时器扫描的时间执行的,我设置的50ms扫描一次,但是没到次数按键就执行了,我用LED等指示,LED能到50ms才亮,再按50ms又灭了,就是按键不对

使用特权

评论回复
22
ys46501| | 2015-8-14 10:23 | 只看该作者
我给你修改一下吧,这个只是单次执行,长按也只执行一次。
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))
   {
      key_count++;  
      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   return 0;
     }
     else if(key_count>3) key_count=3;
   }
   else  key_count=0;        
}

使用特权

评论回复
23
ningling_21| | 2015-8-14 10:51 | 只看该作者
铜牌之路 发表于 2015-8-14 09:58
问题是现在,按键不是按照定时器扫描的时间执行的,我设置的50ms扫描一次,但是没到次数按键就执行了,我 ...

逻辑有点混乱

key_up 总为1,这里起什么作用?

使用特权

评论回复
24
铜牌之路|  楼主 | 2015-8-14 10:55 | 只看该作者
ningling_21 发表于 2015-8-14 10:51
逻辑有点混乱

key_up 总为1,这里起什么作用?

就是一个标志,上面要用到与

使用特权

评论回复
25
铜牌之路|  楼主 | 2015-8-14 10:57 | 只看该作者
ys46501 发表于 2015-8-14 10:23
我给你修改一下吧,这个只是单次执行,长按也只执行一次。
u8 KEY_AnJian(void)
{

好呢,我试试

使用特权

评论回复
26
ningling_21| | 2015-8-14 10:57 | 只看该作者
铜牌之路 发表于 2015-8-14 10:55
就是一个标志,上面要用到与

完全多余的东西,去掉也完全一样的效果

使用特权

评论回复
27
铜牌之路|  楼主 | 2015-8-14 11:02 | 只看该作者
ys46501 发表于 2015-8-14 10:23
我给你修改一下吧,这个只是单次执行,长按也只执行一次。
u8 KEY_AnJian(void)
{

还是不好用,按键时间就是不在扫描时间内判断

使用特权

评论回复
28
铜牌之路|  楼主 | 2015-8-14 11:03 | 只看该作者
ningling_21 发表于 2015-8-14 10:57
完全多余的东西,去掉也完全一样的效果

好像是多余的

使用特权

评论回复
29
ningling_21| | 2015-8-14 11:16 | 只看该作者
铜牌之路 发表于 2015-8-14 11:02
还是不好用,按键时间就是不在扫描时间内判断

你再试试

uchar  KEY_AnJian(void)
{
   static   uchar  flag = 0;  
//   static   uint key_count=0;  //定时器扫描次数
   if((flag == 0))
   {
             flag = 1;
             if((KEY_Y==0||KEY_X==0||KEY_Z==0||KEY_S==1||KEY_QueR==0||KEY_FanH==0||KEY_LiuSY==1))
      {
             
             
               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   return 0;
             
          }
   }
   else  
   {
             flag=0;        
   }
   return 0;
}

使用特权

评论回复
30
铜牌之路|  楼主 | 2015-8-14 11:23 | 只看该作者

谢谢了,但是这都没用定时器扫描,怎么去抖了,按下了,肯定会执行的

使用特权

评论回复
31
铜牌之路|  楼主 | 2015-8-14 11:29 | 只看该作者

试了一下,好像比以前的好用。但不知道什么原因呢

使用特权

评论回复
32
加油吧小鱼儿| | 2015-8-14 11:29 | 只看该作者
用一个boolen标志试试看呢。按下去置标志位,直到按键松开再清标志位~

使用特权

评论回复
33
铜牌之路|  楼主 | 2015-8-14 11:40 | 只看该作者
加油吧小鱼儿 发表于 2015-8-14 11:29
用一个boolen标志试试看呢。按下去置标志位,直到按键松开再清标志位~

        u8 KEY_AnJian(void)
  {
   static u8 key_count = 0;  //ɨÃè´ÎÊý³õʼÉèΪ0ΪÁËÏÂÃæÓÃ
                      u8  key_up = 1;
                if(key_up&&(KEY_Y==0||KEY_X==0||KEY_Z==0||KEY_S==1||KEY_QueR==0||KEY_FanH==0||KEY_LiuSY==1))
     {
                           key_up=0;
                        if(key_count<3)
                           { key_count++; }
                 }
                else
         { key_count = 0; }
                if(key_count==3)
                {
                        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))
          {
          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))
                            {key_up = 1;
          key_count = 0;}
            return 0;       
                       
  }

使用特权

评论回复
34
加油吧小鱼儿| | 2015-8-14 13:11 | 只看该作者
铜牌之路 发表于 2015-8-14 11:40
u8 KEY_AnJian(void)
  {
   static u8 key_count = 0;  //ɨÃè´ÎÊý³õʼÉèΪ0ΪÁË ...

代码风格很不好啊。。。只要实现了功能就可以了~

使用特权

评论回复
35
铜牌之路|  楼主 | 2015-8-14 21:02 | 只看该作者
和大家分享一下,可以用了。
        u8 KEY_AnJian(void)
  {
   static u8 key_count = 0;  
  u8  key_up = 1;
if(key_up&&(KEY_Y==0||KEY_X==0||KEY_Z==0||KEY_S==1||KEY_QueR==0||KEY_FanH==0||KEY_LiuSY==1))
       {
                key_up=0;
if(key_count<2)
  { key_count++; }
           }
else
    { key_count = 0; }
        if(key_count==2)
              {
                        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  key_up = 1;
                return 0;                             
   }

使用特权

评论回复
36
598330983| | 2015-8-14 22:13 | 只看该作者
最好用中断,松手检测。

使用特权

评论回复
37
598330983| | 2015-8-14 22:14 | 只看该作者
在中断里写这个,最方便了。

使用特权

评论回复
38
铜牌之路|  楼主 | 2015-9-5 21:07 | 只看该作者
598330983 发表于 2015-8-14 22:13
最好用中断,松手检测。

注意不错,希望用松手检测

使用特权

评论回复
39
铜牌之路|  楼主 | 2015-9-5 21:07 | 只看该作者
598330983 发表于 2015-8-14 22:14
在中断里写这个,最方便了。

嗯嗯,谢谢指点

使用特权

评论回复
40
liu1004010308| | 2015-9-6 21:28 | 只看该作者
看来简单问题,大家回复的就多啊

使用特权

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

本版积分规则