目录
一、按键检测原理
按键通常是由一个机械开关或者触摸传感器组成。机械开关是一个物理设备,当按键被按下时,它会切换连接状态。触摸传感器则会检测到触摸或者压力变化。这些硬件设备会将按键的状态转换为电信号。
二、按键物理连接
按键的硬件连接决定了我们在配置按键IO时IO的状态。以我们使用的STM32F103RCT6核心板为例,上面有三个按键
其中WK_UP一端接VCC,另一端接单片机。KEY0和KEY1一端接地,另一端接单片机。硬件电路不同,导致他们在进行按键检测时IO的配置不同。
针对WK_UP这种按键电路,按键按下时,单片机的引脚接到VCC,因此在未按下的情况下该引脚的默认电平为低电平,也就是要把IO设置为输入下拉模式。同理,对于K2和K3这种连接方式,对应IO应该配置为输入上拉模式,使得按键未被按下时,引脚处于高电平状态。
三、配置STM32CubeMX
首先,我们从原理图可以得到三个按键接单片机的引脚分别为PA0、PC15、PA15,所以我们要把这三个引脚配置为GPIO输入模式。两个LED一端接地,另一端分别接单片机的PA8和PD2引脚,所以我们要把这两个引脚配置成GPIO输出模式。
四、编写按键检测程序+按键控制LED
首先,我们先对HAL_GPIO_ReadPin()和HAL_GPIO_WritePin()函数进行宏定义,方便后面程序编写。
#define KEY0 HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)
#define KEY1 HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)
#define WK_UP HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin)
#define LED0_SET HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET)
#define LED1_SET HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET)
#define LED0_RESET HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET)
#define LED2_RESET HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET)
接下来编写按键检测程序来控制LED的亮灭:
void KEY_SET_LED(void)
{
//KEY0控制LED0亮
if(!KEY0)
{
HAL_Delay(15); //按键消抖
while(!KEY0); //松手检测
LED0_RESET;
}
//KEY1控制LED0灭
if(!KEY1)
{
HAL_Delay(15); //按键消抖
while(!KEY1); //松手检测
LED0_SET;
}
//WK_UP控制LED1灯的亮灭
if(WK_UP)
{
HAL_Delay(15); //按键消抖
while(WK_UP); //松手检测
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); //电平翻转函数
}
}
最后再在main函数的while循环里面调用即可。