目录
cubeMX配置:
原理图
引脚配置为上拉模式
定时器
使用定时器3(通用定时器,使用外部晶振,内部时钟),分频系数为80(从0开始则为80-1),则每1s 1m次,定时评率为为10000,对应1s 1m/10000次,频率为10ms每次
一定记得开启NVIC使能中断
编写中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
代码模板:
思路:
单个单机按键带长按键判断—>单个单机按键加双击按键,同时修复长按键误触发短按键功能bug—>4个单机按键加双击按键,同时优化代码,修改bug
开始之前:重整了工程结构
删除common.c/.h
在main.h中加入
#define uint unsigned int
#define uchar unsigned char
在main.c中引用自定义库:
#include "led.h"
在自定义库的.h改引用main.h,代替common.h
Interrupt.c:
#include "interrupt.h" // 引入头文件 interrupt.h
uchar judge_state=0,key_num=100,key_time=0; // 定义全局变量 judge_state 表示按键状态,key_num 表示按键编号,key_time 表示按键按下的时间
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) // 定义定时器中断回调函数
{
if(htim->Instance==TIM3) // 判断是否是定时器3的事件
{
switch (judge_state) // 根据按键状态进行不同的处理
{
case 0: // 初始状态
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) // 检测按键是否按下
{
judge_state=1; // 进入按键按下状态
key_time=0; // 按键计时清零
}
break;
}
case 1: // 按键按下状态
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) // 继续检测按键是否按下
{
judge_state=2; // 进入按键确认按下状态
key_num=1; // 按键确认按下,设置按键编号为1
}
else
judge_state=0; // 按键未按下,返回初始状态
break;
}