蓝桥杯嵌入式(G431)备赛笔记——按键模块设计

本文是作者准备蓝桥杯嵌入式比赛的备赛笔记,主要介绍了如何使用cubeMX配置STM32的按键模块,包括定时器设置、中断回调函数编写以及优化4个按键的单击、双击和长按功能。在代码实现中,通过调整定时器分频系数实现10ms的中断频率,并在中断回调函数中处理按键状态,防止抖动和长按键误触。此外,文章还强调了开启中断的重要性以及工程结构的整理。
摘要由CSDN通过智能技术生成

目录

cubeMX配置:

代码模板:

最终模板

注意:


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;
            }
         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄奕子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值