按键的三行代码
key_value = KEY_Scan();
key_up = key_value & (key_old ^ key_value);
key_down = ~key_value & (key_old ^ key_value);
key_old = key_value;
按键的长按、短按
实现按键的长按、短按思路很简单,在第一次按键按下的key_down下降沿开始计时,给定一个计时时间,如果在这个计
时时间之内检测到了key_up上升沿(代表按键松开),则为短按。如果在这个定时时间内没有检测到key_up上升沿,则
为长按。
uint8_t KEY_Time_Count;
uint8_t key_value,key_up,key_down,uc_Key_Value;
static uint8_t key_old;
void KEY_Proc(void)
{
if(uwTick - uwTick_KEY_Set_Point<10) return;
uwTick_KEY_Set_Point=uwTick;
key_value = KEY_Scan();
key_up = key_value & (key_old ^ key_value);
key_down = ~key_value & (key_old ^ key_value);
key_old = key_value;
if(key_down)
{
KEY_Time_Count = 0;
}
if(KEY_Time_Count < 10)
{
switch(key_up)
{
case 1:
ucLed = 0xFF;
break;
}
}
else
{
switch(key_value)
{
case 1:
ucLed = 0x00;
break;
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6)
{
KEY_Time_Count++;
HAL_TIM_Base_Start_IT(&htim6);
}
}
按键的单击、双击
实现按键的单击、双击的思路与长按、短按的区分相似。在第一次按键按下后的上升沿开始计时,到第二次按键按下
的这段时间内,如果时间超过了规定的时间则为单击。如果在规定的时间内就检测到了下降沿则为双击。
uint8_t key_value,key_up,key_down,uc_Key_Value;
static uint8_t key_old;
uint8_t key_down_num;
uint8_t KEY_Pressed_Num_Time_Count;
void KEY_Proc(void)
{
if(uwTick - uwTick_KEY_Set_Point<10) return;
uwTick_KEY_Set_Point=uwTick;
key_value = KEY_Scan();
key_up = key_value & (key_old ^ key_value);
key_down = ~key_value & (key_old ^ key_value);
key_old = key_value;
if(key_up)
{
if(key_down_num == 0)
key_down_num = 1;
}
if(key_down_num == 1)
{
KEY_Pressed_Num_Time_Count += 10;
if(KEY_Pressed_Num_Time_Count >= 150)
{
switch(key_old)
{
case 2:
ucLed = 0x80;
break;
}
key_down_num = 0;
KEY_Pressed_Num_Time_Count = 0;
}
}
if(key_down)
{
if(key_down_num == 1)
{
switch(key_down)
{
case 2:
ucLed = 0x01;
break;
}
KEY_Pressed_Num_Time_Count = 0;
key_down_num = 0;
}
}
}
|