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

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

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


前言:

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

相关文章
|
3月前
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序
STM32速成笔记(三)—按键检测
本文介绍了如何利用STM32进行按键检测,先介绍了原理,后面给出了配置步骤和应用例程。此外,本文还叙述了如何利用一个按键单独控制一个LED亮灭,以及如何检测按键长短按。
622 0
STM32速成笔记(三)—按键检测
2023年电赛---运动目标控制与自动追踪系统(E题)OpenART mini的代码移植到OpenMV
2023年电赛---运动目标控制与自动追踪系统(E题)OpenART mini的代码移植到OpenMV
210 0
|
程序员 芯片
键盘检测原理及应用实现介绍2
独立式键盘的检测原理和应用实现还可以进一步介绍如下: 4. 检测原理:独立式键盘通常使用机械开关作为按键的接触点。机械开关是一种通过机械力将两个金属触点闭合的开关。当按键被按下时,触点闭合,电路连通,通过检测电路状态可以确定按键是否被按下。 5. 应用实现:独立式键盘的检测与行列扫描不同,每个按键有独立的电路接触点,因此不需要扫描整个键盘矩阵。常见的应用实现是使用键盘控制器芯片,它具有多个输入引脚来连接各个按键的接触点,通过检测引脚的状态来确定按键是否被按下。 6. 应用场景:独立式键盘在一些对触感、耐用性和反馈要求较高的场景中得到广泛应用。以下是一些典型的独立式键盘应用场景: - 机械
121 3
|
6月前
|
缓存 编译器 索引
单片机中按键检测函数详细分析经典
单片机中按键检测函数详细分析经典
179 0
|
数据安全/隐私保护 芯片 智能硬件
键盘检测原理及应用实现介绍1
键盘是计算机、手机、平板电脑等设备上最常用的输入设备之一。它是用来输入文本、命令和控制操作的重要工具。键盘检测原理是指如何检测用户按下或释放键盘上的按键,并将按键的信息传递给计算机或其他设备进行相应的处理。 键盘检测原理可以分为两种类型:矩阵式键盘和独立式键盘。下面将分别介绍这两种键盘检测原理及其应用实现。 一、矩阵式键盘检测原理及应用实现: 矩阵式键盘是最常见的键盘类型之一,它由多个按键组成,并且按键排列成矩阵的形式。常见的矩阵式键盘为4x4或3x4排列,即有4行或3行各有4列的按键。以下是矩阵式键盘的检测原理及应用实现: 1. 检测原理:矩阵式键盘使用行列扫描的方式进行按键检测。键
201 0
|
物联网
如何实现按键的短按、长按检测?
如何实现按键的短按、长按检测?
|
缓存 物联网 编译器
国产MCU-CW32F030开发学习--按键检测
国产MCU-CW32F030开发学习--按键检测
202 0
国产MCU-CW32F030开发学习--按键检测
|
传感器 监控 网络协议
Python + ESP32 DIY自动感应智能皂液器 避免触摸更安全
Python + ESP32 DIY自动感应智能皂液器 避免触摸更安全
198 0
|
内存技术
STM32Fxx位带操作还不会?哲学三问让你实现位带自由(含位带操作核心代码)以LED与键盘为例
STM32Fxx位带操作还不会?哲学三问让你实现位带自由(含位带操作核心代码)以LED与键盘为例