按键也是蓝桥杯的必考功能常见的考法有单功能按键(只有按键按下和松开两种状态)、多功能按键(一个按键有多种功能单击、双击、长按等)。蓝桥杯主要考的是单功能按键但也有例外如第九届省赛就靠了长按键和断按键,这篇文章主要是多功能按键进行一个说明。
按键在cubemx中的配置如下图

按键的配置
将按键配置成输入模式,接下来就是对GPIO PB0进行配置了配置如下将按键配置成下拉
具体原因如下检测低电平的时候上拉,检测高电平时下拉。

配置图
但是这里注意一下蓝桥杯的按键接法特殊,即可以检测高电平也可以检测低电平,所以上拉、下拉都可以。

蓝桥杯按键原理图
以上就完成了按键的配置。接下来就是业务代码的编写了。
首先我们要搞清楚按键的单击、双击、长按分别是什么。
单击:按键短暂的按下后松开。
双击:按键两次按下且他们的时间间隔在我们规定的范围内。
长按:按键按下时间超过我们规定的范围。
我们一共用到四个变量,为了整齐方便我们把他们整合成为了一个结构体

按键相关变量的结构体
然后我们轮询扫描按键逻辑如下
如果是第一次按下且按下的时间超过了3S则视为长按,将所有变量置0,准备下一次的检测。

长按

变量置0
Fuction_key.u32time1 是一个在定时器中以1 ms自加的变量。
检测按键当第一次按键按下且检测到第二次按键按下他们之间的时间间隔小于0.5s则视为双击

双击
单击就是在按键按下一次且0.5s以后没有动作则视为单击

单击