三、最后也是最重要的一步就是按键状态扫描的实现。
// 定义一个全局的按键状态
Type_Key_Status key_status = KEY_NULL;
void key_scan(void)
{
uint16_t old_key_value = 0,new_key_value =0;
switch(key_status)
{
case KEY_NULL:
old_key_value = read_key();
if(old_key_value == 0) //没按键按下
{
return;
}
delay_ms(50);
new_key_value = read_key();
if(old_key_value == new_key_value)
{
old_key_value = new_key_value; //有键按下,状态跳转
key_short_press_callback(new_key_value) //回调按下处理函数
key_status = KEY_PRESS;
}else
{
key_status = KEY_NULL;
}
break;
case KEY_PRESS:
delay_ms(50);
new_key_value = read_key();
if(old_key_value == new_key_value)
{
old_key_value = new_key_value;
key_long_press_callback(new_key_value); //回调长按下处理
key_status = KEY_LONG_PRESS;
}else
{
key_short_release_callback(new_key_value); //回调短按释放处理
key_status = KEY_RELEASE;
}
break;
case KEY_LONG_PRESS:
delay_ms(50);
new_key_value = read_key();
if(old_key_value == new_key_value)
{
old_key_value = new_key_value;
key_long_long_press_callback(new_key_value); //回调超长按下处理
key_status = KEY_RELEASE; //更具自定义功能状态去跳转
}else
{
key_long_release_callback(new_key_value); //回调长按释放处理
key_status = KEY_RELEASE;
}
break;
case KEY_RELEASE:
release_key_handle();
key_status = KEY_NULL; //释放回到正常检测状态
break;
}
};
四、最后就是在各个按键状态的基础上实现处理函数,这里就可以对编码的那就值进行解析,分别处理,对于按键释放有组合也很好处理。
void key_short_press_handle(uint16_t key_value)
{
switch(key_value & USER_KEY_ALL_MSK)
{
//没有组合键
case USER_KEY1_MSK:
break;
case USER_KEY2_MSK:
break;
case USER_KEY3_MSK:
break;
case USER_KEY4_MSK:
break;
case USER_KEY5_MSK:
break;
case USER_KEY6_MSK:
break;
//组合按键
case USER_KEY1_MSK|USER_KEY2_MSK : break;
...
}
}