目录
一、长按与短按
在按键按下的时候,即key_down下降沿开始计时。给定一个计时时间,如果在这个计时时间之内检测到了key_up上升沿,即按键松开,则为短按。如果在这个定时时间内没有检测到key_up上升沿,则为长按。
uint8_t Key_Scan(void)
{
uint8_t val=0;
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)==0)
val =1;
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)==0)
val =2;
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)==0)
val =3;
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0)
val =4;
return val;
}
void key_proc(void)
{
if(uwTick - key_uwTick<50)return ;
key_uwTick = uwTick;
key_val = Key_Scan();
key_down = key_val & (key_old^key_val);
key_up = ~key_val & (key_old^key_val);
key_old = key_val;
if(key_down)
{
key_time_uwTick = uwTick;
}
if(uwTick-key_time_uwTick<1000) // 短短
{
switch(key_up)
{
case 1:
ucled =0xff;
break;
case 2:
ucled =0x0;
break;
}
}
else // 长按
{
switch(key_val)
{
case 1:
ucled =0;
break;
case 2:
ucled =0x01;
break;
}
}
}
注:按键返回值一定要初始化为0。
二、单击与双击
在第一次按键按下的key_down下降沿开始计时,给定一个计时时间,如果在这个计时时间之内检测到了key_up上升沿(代表按键松开),则为短按。如果在这个定时时间内没有检测到key_up上升沿,则为长按。
void key_proc(void)
{
if(uwTick - key_uwTick<50)return ;
key_uwTick = uwTick;
key_val = Key_Scan();
key_down = key_val & (key_old^key_val);
key_up = ~key_val & (key_old^key_val);
key_old = key_val;
if(key_up)//当第一次按键按下抬起时
{
key_temp=key_up; //记录按键按下抬起后的键值
if(key_down_num == 0)
{
key_down_num = 1; //记录第一次按键已经按下
key_time_uwTick = uwTick; // 开始计时
}
else //如果检测到双击后的第二次上升沿 将按键按下次数清理 以便于判断下一次按键的单击-双击
key_down_num=0;
}
if(key_down_num == 1)//当第一次按下并抬起时
{
if(uwTick - key_time_uwTick >= 1000) //当按键按下1s时间后没有检测到第二次按键按下-单击
{
switch(key_temp)
{
case 1:
ucled =1;
break;
case 2:
ucled =0;
break;
}
key_down_num =0; // 清零 以便下一次判断按键类型
}
else //按键在1s内检测到按键按下-双击
{
switch(key_down)
{
case 3:
ucled = 1;
break;
case 4:
ucled = 0;
break;
}
}
}
}