按键用法:
- 短按
- 长按
- 双击/三击
按键电平变化:按下为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