上一章,我们介绍了STM32F4的IO口作为输出的使用,这一章,将向大家介绍如何使用按键作为输入使用。
(一)硬件连接
根据正点原子的stm32f4阿波罗开发板,可以看见
按键KEY0连接在PH3上、
KEY1连接在PH2上、
KEY2连接在PC13上、
KEY_UP连接在PA0 上。
根据电路图分析,当按键KEY0,KEY1、KEY2导通时,PH3、PH2、PC13为低电平;
按键KEY_UP导通时,PA0为低电平。
(图为按下按键开关后,IO后就会从高电平变为低电平)
因此,我们可以通过反复读取按键输入引脚的信号,然后识别高低电平来判断是否有按键触发。
(二)按键消抖
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
说白了有时候按键输入引脚有低电平不一定代表着是按键按下,可能是干扰信号。因此我们需要通过一些抖动处理,将这些干扰信号过滤,从而获得真实的按键触发信号。
我们如何去抖动呢?
首次检测到按键输入引脚有低电平后,稍作延时,再次读取该引脚,如果还是低电平,则确认是按键触发信号,否则,判断为干扰信号,不予处理。
(三)Hal库读取引脚函数
该函数返回值为该引脚读入的电平状态。
(四)实操
按下KEY2(PC13)按键,DS1(PC0)小灯点亮,反之熄灭。
1.时钟配置
2.IO端口配置
设置PC13为输出引脚
设置PB0为输出模式
//延时和按键函数
void Delay(unsigned int t) {while(t--); } void Scan_Key() {if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == RESET){ Delay(1000);if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == RESET){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == SET);}} }
在主函数while(1)中调用按键检测函数就好了。
3.实验现象
按键按下前:
按键按下后: