具体就是下面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;
}
|
@xch :确实是 我做按键设置一个百位数时,每按键一次 加一,结果 而是连续加,估计是key-down,保持了10ms状态 如何使用状态机用定时器 精准消抖啊
@babyrabbit : 该消的没消,不必消的却消了。按键的感觉一定很差。 你应该在确认按键释放前消除抖动。确认按下则没必要消除抖动,
@babyrabbit :采用状态机的形式 写的按键
@xch :这个程序是在中断中调用的,每隔10ms调用一次。中断程序没有贴出来。
@babyrabbit : 按键是极其不可靠的开关.你得加上消除抖动程序. 需要使用定时器中断.在中断之中处理按键
@xch :我是做来用的,请问大神有什么使用的按键检测程序吗,拿来学习一下。
这个按键检测软件太像做作业。离实用还差很多