CUBEMX之 按键长按短按
本人使用的单片机型号是STM32G431
CUBEMX图:
常规延时短按
1.定义
#define B1 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)
#define B2 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)
#define B3 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)
#define B4 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)
2.代码块
u8 key_scan(void)
{
if(key_up && (B1==0 || B2==0 || B3==0 || B4==0))
{
HAL_Delay(10);
key_up = 0;
if(B1==0) return 1;
else if(B2 == 0) return 2;
else if(B3 == 0) return 3;
else if(B4 == 0) return 4;
}
else if(B1 && B2 && B3 && B4)
{
key_up = 1;
}
return 0;
}
3.执行
while (1){
ab=key_scan();
led(ab);
}
定时器长按+短按
(说明:频率因为比赛要求设成80M,f=80M/(80*1000)=1KHz)
1.原理
tim1计数100次就是一个检测周期就是0.1s。
每调用一次回调函数检测是否按下,按下countplus++,没按下就不管。
在这100次里检测按下此数>60次,即是短按。
同理tim2计数1000次,次数>600次就是长按。
2.代码块
中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
key1=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
key2=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
if(key1==0){
countplus++;
}
if(time1<100){time1++;}
else {
if(countp>60){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_10);
}
countp=0;
time1=0;
}
if(key2==0){
countpp++;
}
if(time2<1000){time2++;}
else {
if(countpp>600){
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_11);
}
countpp=0;
time2=0;
}
}