[mw_shl_code=c,true]#define KEY_STATE_0 0
#define KEY_STATE_1 1
#define KEY_STATE_2 2
#define KEY_NONE 0
#define KEY_FILTER_TIME 500 //消抖时间
#define KEY_LONGPRESS_TIME 500000 //长按时间
/*********************************************************************//**
* @brief 按键处理--消抖,长按
* @param[in] 键值
* @return 短按时,返回传入的键值。长按时,传入键值的最高位被置1
注意:如果传入键值的最高位为1,返回值将出错
**********************************************************************/
uint32_t key_driver(uint32_t code)
{
static uint32_t key_state = KEY_STATE_0, key_time = 0, code_last = 0;
uint32_t key_return = KEY_NONE;
switch (key_state)
{
case KEY_STATE_0: //初始状态
if (code != 0)
{
code_last = code;
key_time = 0;
key_state = KEY_STATE_1; //如果有键被按下,记录键值,并进入消抖及长按确认状态
}
break;
case KEY_STATE_1: //消抖及长按确认
if (code != code_last)
if (key_time > KEY_FILTER_TIME) //如果键值改变,且经过的时间大于消抖时间,认为是一次短按
key_return = code_last; //返回键值
key_state = KEY_STATE_0; //回到初始状态
}
else if (++key_time >= KEY_LONGPRESS_TIME) //如果时间大于长按时间
{
key_return = (1<<(sizeof(uint32_t)*8-1))|code_last; //最高位置1
key_state = KEY_STATE_2; //转到等待按键释放状态
}
break;
case KEY_STATE_2:
if (code != code_last) //等到按键释放,返回初始状态
key_state = KEY_STATE_0;
break;
}
return key_return;
}
[/mw_shl_code]
这个是网上 下载的装机方式消抖 法,把按键扫描整合进去还是去不了短按消抖和长按消抖,有没有人懂的,谢谢! |