最近在做按键的状态机程序 请问如何实现按键的多次按下呢

2019-12-20 21:31发布

下面的程序实现了短按和长按  现在不需要长按 需要三次短按 请教大家该如何修改程序
/**-------------------------------------------------------
  * @函数名 SZ_STM32_KEYScan
  * @功能   获取KEY按键的输入电平状态,按键按下时为低电平0
  * @参数   无
  * @返回值 1  对应开发板上第一个KEY按键处于按下状态
  *         2  对应开发板上第二个KEY按键处于按下状态
  *         3  对应开发板上第三个KEY按键处于按下状态
  *         4  对应开发板上第四个KEY按键处于按下状态
  *         0  开发板上没有KEY按键处于按下状态
***------------------------------------------------------*/
uint32_t GetKEY(void)

{   
    /* 获取KEY按键的输入电平状态,按键按下时为低电平0 */
    if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2) == 0)
    {
      
          return KEY1_DOWN;
    }
   if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1) == 0)
    {
      
          return KEY2_DOWN;
    }
                if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6) == 0)
    {
      
          return KEY3_DOWN;
    }
                if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3) == 0)
    {
      
          return KEY4_DOWN;
    }
                if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_10) == 0)
    {
      
          return KEY5_DOWN;
    }
                if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9) == 0)
    {
      
          return KEY6_DOWN;
    }
                if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_11) == 0)
    {
      
          return KEY7_DOWN;
    }
   
    return NO_KEY;

}

uint32_t ReadKeyStatus(void)
{
        static uint8_t KeyState = KEY_UP;//按键状态
        static uint8_t KeyPrev = NO_KEY; //上一次按键值
        static int TimeCount = 0;                 //按键按下计时
        uint8_t KeyPress = NO_KEY;                 //按键值
        uint8_t KeyReturn = KEY_UP;                 //返回按键状态
       
        KeyPress = GetKEY();//得到被按下的状态
       
        switch(KeyState)
        {
                //状态0:没有按键按下
                case KEY_UP:
                        if(KeyPress != NO_KEY)//有按键按下
                        {
                                KeyState = KEY_SURE;//转入状态1
                                KeyPrev = KeyPress;//记录按键值
                        }
                        break;
                //状态1:按键确认状态
                case KEY_SURE:
                        if(KeyPress == KeyPrev)//确认和上次相同
                        {
                                KeyState = KEY_DOWN;//转入状态2
                                TimeCount = 0;//计数器清零
                        }
                        else
                        {
                                KeyState = KEY_UP;//转入状态0
                        }
                        break;
                //状态2:按键按下
                case KEY_DOWN:
                        if(KeyPress != KeyPrev)//按键释放,端口高电平
                        {
                                KeyState = KEY_UP;//转入状态0
                                KeyReturn = KEY_DOWN | KeyPrev;//返回单次按下 或运算得到哪个按键处于什么状态
                        }
                        else if((KeyPress == KeyPrev) && (++TimeCount >= 35)) //超过TimeCount时间没有释放
                        {
                                KeyState = KEY_LONG;//转入状态3
                                TimeCount = 0;//计数器清零
                                KeyReturn = KEY_LONG | KeyPrev;//返回连续按下
                        }
                        break;
                //状态3:长按
                case KEY_LONG:
                        if(KeyPress != KeyPrev)//按键释放 端口高电平
                        {
                                KeyState = KEY_UP;//转入状态0
                                KeyReturn = KEY_UP;
                        }
                        else if((KeyPress == KeyPrev) && (++TimeCount >= 35)) //超过TimeCount没有释放
                        {
                                KeyReturn = KEY_LONG | KeyPrev;//返回连续按下
                                TimeCount = 0;//?????
                        }
                        else//释放了,返回高电平状态
                        {
                                KeyReturn = KEY_UP;
                        }
                        break;
                       
               
        }
       
        return KeyReturn;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。