STM32G431RBT6之按键模块04
按键用法:

- 短按
- 长按
- 双击/三击
按键电平变化:按下为0,弹起为1
- cubeMX中配置按键引脚并将其设置为上拉

- 设置定时器,时钟源,分频系数,重装载值

时钟源:Internal Clock; Prescaler:79; Counter Period:9999 ; 这样的设置是10ms中断一次
- 使能中断

- interrupt.c && interrupt.h
重写中断处理函数

- interrupt.h
#ifndef _INTERRUPT_H #define _INTERRUPT_H #include "main.h" #include "stdbool.h" struct keys { uchar judge_sta; bool key_sta; bool single_flag; }; void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); #endif
- interrupt.c

#include "interrupt.h" struct keys key[4]={0,0,0}; void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance==TIM3) { key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0); key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1); key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2); key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0); } for(int i=0;i<4;i++) { switch(key[i].judge_sta) { case 0: { if(key[i].key_sta==0) key[i].judge_sta=1; } break; case 1: { if(key[i].key_sta==0) { key[i].judge_sta=2; key[i].single_flag=1; }else{ key[i].judge_sta=0; } } break; case 2: { if(key[i].key_sta==1) key[i].judge_sta=0; } break; } } } - main.c
用extern导入外部变量
注意格式不是:struct keys key[4]={0,0,0};
而是:struct keys key[4];

开中断

- 注意LED对应的数据
LED1 0X01
LED2 0X02
LED3 0X04
LED4 0X08
LED5 0X10
LED6 0X20
LED7 0X40
LED8 0X80

浙公网安备 33010602011771号