具体就是下面5个按键有两个作为功能选择键,需要有三种功能。另外三个键作为个十百位按一下加1 0-9循环加 该如何实现呢?
我现在实现了单个按键的长按和短按的状态机扫描 接下来不知道该怎么改了
uint32_t GetKEY(void)
{
/* 获取KEY按键的输入电平状态,按键按下时为低电平0 */
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9) == 0)
{
return KEY1_DOWN;
}
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0) == 0)
{
return KEY2_DOWN;
}
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7) == 0)
{
return KEY3_DOWN;
}
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6) == 0)
{
return KEY4_DOWN;
}
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1) == 0)
{
return KEY5_DOWN;
}
return NO_KEY;
}
uint32_t ReadKeyStatus(void)
{
static uint8_t KeyState = KEY_UP;//按键状态
static uint8_t KeyPrev = NO_KEY; //上一次按键值
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
}
else
{
KeyState = KEY_UP;//转入状态0
}
break;
//状态2:按键按下
case KEY_DOWN:
if(KeyPress != KeyPrev)//按键释放,端口高电平
{
KeyState = KEY_UP;//转入状态0
KeyReturn = KEY_DOWN | KeyPrev;//返回单次按下 或运算得到哪个按键处于什么状态
}
break;
}
return KeyReturn;
}
|
评论
|