按键作为人机交互中重要的一环,是必需掌握的部分。比赛板子上一共有4个按键,分别连接到不同的IO口上(B1----PB0,B2----PB1,B3----PB2,B4----PA0)。如下图所示,按键在松开(空闲)状态时,IO口检测到电平为高电平,按键按下时,IO口检测到的为低电平。我们把相应IO口设置为输入模式,那么捕捉到低电平,我们就可以认为按键被按下了。由于物理按键存在一些抖动、振动等不确定因素,所以需要添加软件消抖(在检测到按下信号后,隔10~20ms后再次确认状态,排除干扰)。我们选择结合定时器轮询,同时使用状态机检测方法(将在下面的编程部分进行介绍),这样既可以实现消抖、多按键检测、单次起效,还可以拓展实现长短按、双按等等。
一、STM32Cube 按键的设置
复制上次的2_TIM工程文件夹,并命名为“3_KEY”,打开TEST.ioc。
Cube中将PB0,PB1,PB2,PA0设置为输入模式,上拉(Pull-up),并进行命名。按键外接上拉电阻,在空闲状态下,IO口被拉至高电平,所以选择上拉模式。
轮询用的定时器我们沿用上次设置的总控定时器TIM4,这样基本设置就好了,按“GENERATE CODE”更新工程。
二、按键(状态机)程序的实现
用Keil 5打开TEST.uvprojx,再打开USER中用于中断的interrupt.c。
我们计划通过按键来控制按钮,各按键效果:
B1:亮LD1、LD2
B2:亮LD3、LD4
B3:LD5、LD6状态翻转
B4:熄灭LD1~LD6
其他LED灯效果:LD7始终熄灭,LD8每0.5s翻转一次状态。
1、基本的状态机编程
首先,我们为状态机定义三个状态:空闲状态,未按下(IDLE)、按下待执行相应功能(PRESSED_READY)、按下功能已执行等待松开按键回到空闲状态(PRESSED_FINISH)。
我们定义了一个枚举类型变量 ButtonState,来记录这些状态。
typedef enum
{
IDLE, //未按下,空闲状态
PRESSED_READY, //按下,待执行相应功能
PRESSED_FINISH, //按下,功能已执行,等待松开按键回到空闲状态
//PRESSED_COUNT //按下&#x