嵌入式开发学习之--按键检测
推荐
原创
©著作权归作者所有:来自51CTO博客作者Coder个人博客的原创作品,请联系作者获取转载授权,否则将追究法律责任
前言:
回顾之前做过的两个实验,led灯和蜂鸣器,都是通过I/O配置引脚输出,今天,我们要做的按键检测,则是I/O的引脚输入。
正文:
一、项目概况
1.1项目需求
第一个按键按下后蜂鸣器响,抬起后红灯亮,再按一下蜂鸣器响,抬起后红灯灭。
1.2项目来源
作者脑洞。
1.3项目开发环境
软件:keil5;
硬件:野火挑战者开发板。
1.4项目意义
作为洗衣机,电饭煲等家用电器的按钮使用。
二、开发步骤
首先我们要做的第一件事,还是去查找电路原理图。看看关于按键部分的电路是什么样的。通过野火提供的硬件电路原理图我们看到有两个按键SW1和SW3,分别是通过PA0引脚和PC13引脚进行检测,通过电路图可以看到,当按键没有按下时,两个引脚都是接地,按下以后则是连通了3.3V,也就是说,两个引脚的逻辑完全相同,都是按键松开检测为低电平,按键按下检测为高电平。
除了新增加的按键,我们还用到了之前实验中用到的led灯和蜂鸣器。所以我们新创建key.c和key.h这两个文件,同时把之前的led.c、led.h、beep.c、beep.h都复制过来。以模板工程为基础,创建新的工程。
接着来写一下key.c,key.h的引脚配置代码,大体步骤和之前的led、蜂鸣器基本类似,这里需要注意的是引脚的模式是配置成浮空输入模式,然后既不拉高也不拉低。
key.h
#ifndef __KEY_H
#define __KEY_H
#include "stm32f4xx.h"
//引脚定义
/*******************************************************/
#define KEY1_PIN GPIO_Pin_0
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_CLK RCC_AHB1Periph_GPIOA
#define KEY2_PIN GPIO_Pin_13
#define KEY2_GPIO_PORT GPIOC
#define KEY2_GPIO_CLK RCC_AHB1Periph_GPIOC
/*******************************************************/
#define KEY_ON 1
#define KEY_OFF 0
#define KEY1_READ GPIO_ReadInputDataBit(KEY1_GPIO_PORT ,KEY1_PIN)
#define KEY2_READ GPIO_ReadInputDataBit(KEY2_GPIO_PORT ,KEY2_PIN)
void Key_GPIO_Config(void);
#endif
key.c
#include "key.h"
//按键引脚初始化
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
GPIO_InitStructure.GPIO_Pin = KEY1_PIN;
//配置成输入模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = KEY2_PIN;
GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
}
有了上述代码,我们可以通过Key_GPIO_Config对引脚进行初始化,然后通过KEY1_READ和KEY2_READ获取两个按键的状态。这里我们只需要用KEY1_READ就可以了,获取到按键状态,然后根据按键状态去控制led灯和蜂鸣器。
main.c
#include "stm32f4xx.h"
#include "led.h"
#include "beep.h"
#include "key.h"
void bsp_init(void)
{
BEEP_GPIO_Config();
Key_GPIO_Config();
LED_GPIO_Config();
}
uint8_t key1_inspect()
{
if(KEY1_READ==KEY_ON){
return KEY_ON;
}else if(KEY1_READ==KEY_OFF){
return KEY_OFF;
}
}
uint8_t key2_inspect()
{
if(KEY2_READ==KEY_ON){
return KEY_ON;
}else if(KEY2_READ==KEY_OFF){
return KEY_OFF;
}
}
int main(void)
{
uint8_t led_status;
led_status=OFF;
bsp_init();
while(1){
if(key1_inspect()==KEY_ON){
led_status=!led_status;
BEEP_ON;
while(key1_inspect()==KEY_ON){
}
BEEP_OFF;
}
LED1(led_status);
}
}
总结:
I/O输入是一很简单的输入,但是有了输入也就是有互动了,也就是说学会I/O输入就可以通过按钮对机器进行控制。而且按键输入也是嵌入式设备上应用十分广泛的一种输入方式,主要就是简单,便宜。