[STM32F1] 按键去检测

[复制链接]
4483|43
 楼主| 铜牌之路 发表于 2015-8-14 09:58 | 显示全部楼层
ningling_21 发表于 2015-8-14 08:52
不想按键重复执行:
增加一个标志,按键执行一次后标志位为1,此后如果按键未释放也不再执行按键功能,直到 ...

问题是现在,按键不是按照定时器扫描的时间执行的,我设置的50ms扫描一次,但是没到次数按键就执行了,我用LED等指示,LED能到50ms才亮,再按50ms又灭了,就是按键不对
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;        
}
ningling_21 发表于 2015-8-14 10:51 | 显示全部楼层
铜牌之路 发表于 2015-8-14 09:58
问题是现在,按键不是按照定时器扫描的时间执行的,我设置的50ms扫描一次,但是没到次数按键就执行了,我 ...

逻辑有点混乱

key_up 总为1,这里起什么作用?
 楼主| 铜牌之路 发表于 2015-8-14 10:55 | 显示全部楼层
ningling_21 发表于 2015-8-14 10:51
逻辑有点混乱

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

就是一个标志,上面要用到与
 楼主| 铜牌之路 发表于 2015-8-14 10:57 | 显示全部楼层
ys46501 发表于 2015-8-14 10:23
我给你修改一下吧,这个只是单次执行,长按也只执行一次。
u8 KEY_AnJian(void)
{

好呢,我试试
ningling_21 发表于 2015-8-14 10:57 | 显示全部楼层
铜牌之路 发表于 2015-8-14 10:55
就是一个标志,上面要用到与

完全多余的东西,去掉也完全一样的效果
 楼主| 铜牌之路 发表于 2015-8-14 11:02 | 显示全部楼层
ys46501 发表于 2015-8-14 10:23
我给你修改一下吧,这个只是单次执行,长按也只执行一次。
u8 KEY_AnJian(void)
{

还是不好用,按键时间就是不在扫描时间内判断
 楼主| 铜牌之路 发表于 2015-8-14 11:03 | 显示全部楼层
ningling_21 发表于 2015-8-14 10:57
完全多余的东西,去掉也完全一样的效果

好像是多余的
ningling_21 发表于 2015-8-14 11:16 | 显示全部楼层
铜牌之路 发表于 2015-8-14 11:02
还是不好用,按键时间就是不在扫描时间内判断

你再试试

  1. uchar  KEY_AnJian(void)
  2. {
  3.    static   uchar  flag = 0;  
  4. //   static   uint key_count=0;  //定时器扫描次数
  5.    if((flag == 0))
  6.    {
  7.              flag = 1;
  8.              if((KEY_Y==0||KEY_X==0||KEY_Z==0||KEY_S==1||KEY_QueR==0||KEY_FanH==0||KEY_LiuSY==1))
  9.       {
  10.              
  11.              
  12.                if(KEY_Y==0)           return 5;  
  13.                else if(KEY_X==0)      return 6;
  14.                else if(KEY_Z==0)      return 7;
  15.                else if(KEY_S==1)      return 8;  
  16.                else if(KEY_QueR==0)   return 9;  
  17.                else if(KEY_FanH==0)   return 10;
  18.                else if(KEY_LiuSY==1)  return 11;
  19.                else   return 0;
  20.              
  21.           }
  22.    }
  23.    else  
  24.    {
  25.              flag=0;        
  26.    }
  27.    return 0;
  28. }
 楼主| 铜牌之路 发表于 2015-8-14 11:23 | 显示全部楼层

谢谢了,但是这都没用定时器扫描,怎么去抖了,按下了,肯定会执行的
 楼主| 铜牌之路 发表于 2015-8-14 11:29 | 显示全部楼层

试了一下,好像比以前的好用。但不知道什么原因呢
加油吧小鱼儿 发表于 2015-8-14 11:29 | 显示全部楼层
用一个boolen标志试试看呢。按下去置标志位,直到按键松开再清标志位~
 楼主| 铜牌之路 发表于 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;       
                       
  }
加油吧小鱼儿 发表于 2015-8-14 13:11 | 显示全部楼层
铜牌之路 发表于 2015-8-14 11:40
u8 KEY_AnJian(void)
  {
   static u8 key_count = 0;  //ɨÃè´ÎÊý³õʼÉèΪ0ΪÁË ...

代码风格很不好啊。。。只要实现了功能就可以了~
 楼主| 铜牌之路 发表于 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;                             
   }
598330983 发表于 2015-8-14 22:13 | 显示全部楼层
最好用中断,松手检测。
598330983 发表于 2015-8-14 22:14 | 显示全部楼层
在中断里写这个,最方便了。
 楼主| 铜牌之路 发表于 2015-9-5 21:07 | 显示全部楼层
598330983 发表于 2015-8-14 22:13
最好用中断,松手检测。

注意不错,希望用松手检测
 楼主| 铜牌之路 发表于 2015-9-5 21:07 | 显示全部楼层
598330983 发表于 2015-8-14 22:14
在中断里写这个,最方便了。

嗯嗯,谢谢指点
liu1004010308 发表于 2015-9-6 21:28 | 显示全部楼层
看来简单问题,大家回复的就多啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部