蓝桥杯嵌入式开发-按键长按_单击_双击
interrupt.h
#ifndef __BSP_INT
#define __BSP_INT
#include "main.h"
struct key{
uint8_t key_single_flag;
uint8_t key_double_flag;
uint8_t key_long_flag;
uint8_t key_status;
uint8_t key_judge;
uint8_t key_time;
uint8_t double_time;
uint8_t double_scan_en;
};
#endif
interrupt.c
#include "interrput.h"
struct key keys[4]={0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2){
keys[0].key_status = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
keys[1].key_status = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
keys[2].key_status = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
keys[3].key_status = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
for(int i=0 ;i<4 ;i++){
switch(keys[i].key_judge){
case 0:
{
if(keys[i].double_scan_en){
keys[i].double_time++;
if(keys[i].double_time>=20){
keys[i].key_single_flag =1;
keys[i].double_time=0;
keys[i].double_scan_en = 0;
break;
}
}
if(keys[i].key_status == 0){
keys[i].key_judge = 1;
}
break;
}
case 1:
{
if(keys[i].double_scan_en && (keys[i].key_status == 0) && (keys[i].double_time<30)){
keys[i].double_time = 0;
keys[i].double_scan_en = 0;
keys[i].key_double_flag = 1;
keys[i].key_judge = 3;
break;
}
if(keys[i].key_status == 0){
keys[i].key_time = 0;
keys[i].key_judge = 2;
}else{
keys[i].key_judge = 0;
}
break;
}
case 2:
{
if(keys[i].key_status == 0){
keys[i].key_time++;
if(keys[i].key_time>=50){
keys[i].key_long_flag = 1;
keys[i].key_time = 0;
keys[i].key_judge = 3;
break;
}
}else{
keys[i].double_scan_en = 1;
keys[i].key_judge = 0;
}
break;
}
case 3:
{
if(keys[i].key_status == 1){
keys[i].key_judge = 0;
}
}
}
}
}
}