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

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

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


前言:

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

相关文章
|
Android开发 开发者 UED
个人开发 App 成功上架手机应用市场的关键步骤
个人开发 App 成功上架手机应用市场的关键步骤
|
容灾 安全 大数据
为数据安全而生,阿里云容灾备份方案场景实践解析
数字经济时代,数据正以超出想象的速度快速增长。短短几年,数据量已经从TB级别跃升到PB乃至ZB级别。
5958 0
|
数据采集 数据可视化 数据处理
利用 Jupyter 实现自动化报告生成
【8月更文第29天】自动化报告生成是在数据分析领域非常有用的一项技能。它可以帮助我们节省大量的手动工作时间,并确保每次生成的报告都是一致且准确的。本文将介绍如何使用 Jupyter Notebook 结合 Python 库(如 Pandas 和 Matplotlib)来实现自动化报告生成。
1138 0
|
Dart 开发工具 Android开发
快速集成 Flutter Shorebird 热更新
Flutter Shorebird 是一种云端代码推送服务,可以让开发者在几分钟内集成,无需修改代码即可将更新推送到任何 Dart 代码,支持所有 Android 和 iOS 设备,并符合 App Store 和 Play Store 的规定。Shorebird 最大的优点是无代码侵入,快速集成,设计优秀。
618 2
快速集成 Flutter Shorebird 热更新
【循环链表】数据结构——单向循环链表和双向循环链表操作&笔记
【循环链表】数据结构——单向循环链表和双向循环链表操作&笔记
|
负载均衡 算法 容灾
slb基础概念
【9月更文挑战第2天】
3975 25
|
关系型数据库 MySQL Linux
Linux 安装 mysql【使用yum源进行安装】
这篇文章介绍了在Linux系统中使用yum源安装MySQL数据库的步骤,包括配置yum源、安装MySQL服务、启动服务以及修改root用户的默认密码。
Linux 安装 mysql【使用yum源进行安装】
|
机器学习/深度学习 人工智能 PyTorch
Transformers 4.37 中文文档(三十二)(1)
Transformers 4.37 中文文档(三十二)
287 0
|
机器学习/深度学习 PyTorch 数据处理
数据增强与 DataLoader:提升模型泛化能力的策略
【8月更文第29天】在深度学习中,数据的质量和数量对于模型的性能至关重要。数据增强是一种常用的技术,它通过对原始数据进行变换(如旋转、缩放、裁剪等)来生成额外的训练样本,从而增加训练集的多样性和规模。这有助于提高模型的泛化能力,减少过拟合的风险。同时,`DataLoader` 是 PyTorch 中一个强大的工具,可以有效地加载和预处理数据,并支持并行读取数据,这对于加速训练过程非常有帮助。
1187 1