通过使用定时器计数的方法来分辨按键的:短按、长按
检测到引脚被拉低:按键按下为低电平,没有按下为高电平
延时10毫秒:滤波
引脚还是被拉低:确定按键被按下
设置按键按下标志
开启定时器,开始计数:定时器中有一个全局变量用于记录计数值
直到引脚被拉高:按键被释放将为高电平
关闭定时器
检测按键按下标志
检测定时器按键检测时间全局变量是否大于某个值,一般为200ms
大于则为长按,否则为短按
typedef enum
{
KEY_SINGLE_PRESSED,
KEY_LONG_PRESSED,
KEY_DEFAULT_STATUS,
} key_state_e;
uint8_t ylf_key_scan(void)
{
static uint8_t press_flag;
if(!KEY_PIN)
{
delay_ms(10);
if (!KEY_PIN)
{
press_flag = 1;
TR0 = 1; // 定时器0开始计数
while(!KEY_PIN);
TR0 = 0; // 定时器0计数结束
}
}
if (press_flag)
{
if (KEY_COUNT >= 200)
{
KEY_COUNT = 0;
press_flag = 0;
return KEY_LONG_PRESSED;
} else {
KEY_COUNT = 0;
press_flag = 0;
return KEY_SINGLE_PRESSED;
}
}
return KEY_DEFAULT_STATUS;
}
int main(void)
{
while(1)
{
switch(ylf_key_scan())
{
case KEY_SINGLE_PRESSED:
// TO DO
break;
case KEY_LONG_PRESSED:
// TO DO
break;
default:
break;
}
}
}
|