#include "key_driver.h"
/*********************************************************************//**
* @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;
}
- 1
- 2
- 3
- 4
- 5
前往页