较为科学合理的按键处理都是用状态机,不然有些实时性要求高的场合,延时无处应对
定时器设置为1ms,一般采用10ms的间隔检查IO口电平,例如
u8 bcu_key_cc_state_machine(void)
//should be called every 10ms
{
static unsigned char key_state = key_state_0;
unsigned char key_press, key_return = PRESS_NO;
key_press = GPIO_ReadInputDataBit(PORT_KEY_CC, BIT_KEY_CC);
switch(key_state)
{
case key_state_0:
if(key_press == PORT_LOW)
//key is pressed
{
key_state = key_state_1;
}
break;
case key_state_1:
if(key_press == PORT_LOW)
//key is pressed
{
key_return = PRESS_YES;
key_state = key_state_2;
}
else
{
key_state = key_state_0;
}
break;
case key_state_2:
if(key_press == PORT_HIGH)
//key is released
{
key_state = key_state_0;
}
break;
}
return key_return;
}
u8 bcu_key_cc_check(void)
{
u8 keyvalue = PRESS_NO;
if(delay10msok_key_cc == 1)
{
delay10msok_key_cc = 0;
keyvalue = bcu_key_cc_state_machine();
if(keyvalue == PRESS_YES)
{
return TRUE;
}
else
{
return FALSE;
}
}
}
delay10msok_key_cc定义成volatile类型,在中断里置位,在应用里清零。
|