按键的三行代码
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;
static uint8_t key_old;void KEY_Proc(void)
{if(uwTick - uwTick_KEY_Set_Point<50) 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;case 2:break;case 3:break;case 4:break;}}else {switch(key_value) {case 1:ucLed = 0x00;break;case 2:break; case 3:break; case 4:break; }}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6){KEY_Time_Count++; HAL_TIM_Base_Start_IT(&htim6);}
}
按键的单击、双击
- 实现按键的单击、双击的思路与长按、短按的区分相似。在第一次按键按下后的上升沿(key_up)开始计时,到第二次按键按下的下降沿(key_down)这段时间,如果这段时间超过了设定的规定的时间则为单击。如果在设定的规定的时间内检测到了下降沿(key_down)则为双击。
uint8_t key_value,key_up,key_down;
static uint8_t key_old;
uint8_t key_down_num;
__IO uint32_t uwTick_KEY_Pressed_Time_Count;void KEY_Proc(void)
{if(uwTick - uwTick_KEY_Set_Point<50) 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) {key_temp = key_up; if(key_down_num == 0){key_down_num = 1; uwTick_KEY_Pressed_Time_Count= uwTick; }else key_down_num = 0;}if(key_down_num == 1) {if((uwTick - uwTick_KEY_Pressed_Time_Count) >= 300) {switch(key_temp) {case 2:ucLed = 0x80;break;case 1:break;case 3:break;case 4:break;}key_down_num = 0; }else {switch(key_down) {case 2:ucLed = 0x01;break;case 1:break;case 3:break;case 4:break;}}}}