注册 登录
查看: 382|回复: 5

按键加减太快如何设置标志位来确认按下松开 加一或减一

[复制链接]
发表于 2014-11-5 10:07:43 | 显示全部楼层 |阅读模式
case 1:
  
  {
    key=0;
    if(biaozhiwei==1)
    {
      biaozhiwei=0;
      key_num+=1;
      if(key_num>=2)
        {
          key_num=2;
          key_flag=0;
             }
    }break;
   
  } break;
回复

使用道具 举报

发表于 2014-11-5 11:17:53 | 显示全部楼层
没延时吧,导致太快。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-11-5 20:55:37 | 显示全部楼层
  1. if(KEY!=1)                     
  2. {
  3.   dealy10ms();
  4.   if(KEY!=1)
  5.   {
  6.     //自己写的命令;  
  7.   }
  8.   while(KEY!=1);
  9. }
参考一下吧!我也是小白!之前按键消抖和松手这么写的!这里KEY=0;是按下按键
回复 支持 反对

使用道具 举报

发表于 2014-11-5 21:00:20 | 显示全部楼层
ii童话Bū说话 发表于 2014-11-5 20:55
参考一下吧!我也是小白!之前按键消抖和松手这么写的!这里KEY=0;是按下按键

推荐用我们的按键代码吧,稳定,没消抖延时。
回复 支持 反对

使用道具 举报

发表于 2014-11-5 21:33:12 | 显示全部楼层
山外メ雲ジ 发表于 2014-11-5 21:00
推荐用我们的按键代码吧,稳定,没消抖延时。

是这段代码吧!
  1. /*!
  2. *  @brief      定时检测key状态
  3. *  @since      v5.0
  4. *  @note       此函数需要放入 定时中断复位函数里,定时10ms执行一次
  5. */
  6. void key_IRQHandler(void)
  7. {

  8.     KEY_e   keynum;
  9.     static uint8 keytime[KEY_MAX];                          //静态数组,保存各数组按下时间

  10.     KEY_MSG_t keymsg;                                       //按键消息

  11.     for(keynum = (KEY_e)0 ; keynum < KEY_MAX; keynum ++)    //每个按键轮询
  12.     {
  13.         if(key_get(keynum) == KEY_DOWN)                     //判断按键是否按下
  14.         {
  15.             keytime[keynum]++;                              //按下时间累加

  16.             if(keytime[keynum] <= KEY_DOWN_TIME)            //判断时间是否没超过消抖确认按下时间
  17.             {
  18.                 continue;                                   //没达到,则继续等待
  19.             }
  20.             else if(keytime[keynum] == KEY_DOWN_TIME + 1 )  //判断时间是否为消抖确认按下时间
  21.             {
  22.                 //确认按键按下
  23.                 keymsg.key = keynum;
  24.                 keymsg.status = KEY_DOWN;
  25.                 send_key_msg(keymsg);                       //把按键值和按键类型发送消息到FIFO
  26.             }
  27.             else if(keytime[keynum] <= KEY_HOLD_TIME)       //是否没超过长按HOLD按键确认时间
  28.             {
  29.                 continue;                                   //没超过,则继续等待
  30.             }
  31.             else if(keytime[keynum]  == KEY_HOLD_TIME + 1)  //是否为长按hold确认时间
  32.             {
  33.                 //确认长按HOLD
  34.                 keymsg.key = keynum;
  35.                 keymsg.status = KEY_HOLD;
  36.                 send_key_msg(keymsg);                       //发送
  37.                 keytime[keynum] = KEY_DOWN_TIME + 1;
  38.             }
  39.             else
  40.             {
  41.                 keytime[keynum] = KEY_DOWN_TIME + 1;        //继续重复检测 hold 状态
  42.             }
  43.         }
  44.         else
  45.         {
  46.             if(keytime[keynum] > KEY_DOWN_TIME)             //如果确认过按下按键
  47.             {
  48.                 keymsg.key = keynum;
  49.                 keymsg.status = KEY_UP;
  50.                 send_key_msg(keymsg);                       //发送按键弹起消息
  51.             }

  52.             keytime[keynum] = 0;                            //时间累计清0
  53.         }
  54.     }
  55. }


回复 支持 反对

使用道具 举报

发表于 2014-11-5 22:05:53 | 显示全部楼层

是的,这里是按键扫描的关键代码。定时执行。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部