嵌入式开发学习之--按键检测

前言:

        回顾之前做过的两个实验,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输入就可以通过按钮对机器进行控制。而且按键输入也是嵌入式设备上应用十分广泛的一种输入方式,主要就是简单,便宜。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值