下面的程序实现了短按和长按 现在不需要长按 需要三次短按 请教大家该如何修改程序
/**-------------------------------------------------------
* @函数名 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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>