STM32-GPIO输入——按键检测

1 软件设计

为了使程序更有条例,方便移植在“工程模板”之上新建“bsp_key.c”及“bsp_key.h”文件,这些文件也可根据您的喜好命名,这 些文件不属于STM32HAL库的内容,是由我们自己根据应用需要编写的

1.1 编程要点 

1)使能GPIO端口时钟;

2) 初始化GPIO目标引脚为输入模式(浮空输入);

3.)编写简单测试程序,检测按键的状态,实现按键控制LED灯。

1.2 代码分析

1.2.1 按键引脚宏定义

为了方便移植,我们把按键引脚等资源宏定义到 “bsp_key.h”文件中,以下代码根据按键的硬件连接,把检测按键输入的GPIO端口、GPIO引脚号以及GPIO端口时钟 封装起来了。以下是我的开发板的定义,不同硬件根据自己资源更改。

#ifndef __KEY_H
#define	__KEY_H#include "stm32f1xx.h"
#include "main.h"
//引脚定义
/*******************************************************/
#define KEY1_PIN                  GPIO_PIN_0                 
#define KEY1_GPIO_PORT            GPIOA                      
#define KEY1_GPIO_CLK_ENABLE()    __HAL_RCC_GPIOA_CLK_ENABLE()#define KEY2_PIN                  GPIO_PIN_13                 
#define KEY2_GPIO_PORT            GPIOC                      
#define KEY2_GPIO_CLK_ENABLE()     __HAL_RCC_GPIOC_CLK_ENABLE()
/*******************************************************//** 按键按下标置宏* 按键按下为高电平,设置 KEY_ON=1, KEY_OFF=0* 若按键按下为低电平,把宏设置成KEY_ON=0 ,KEY_OFF=1 即可*/
#define KEY_ON	1
#define KEY_OFF	0void Key_GPIO_Config(void);
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);#endif /* __KEY_H */

1.2.2 按键初始化函数

        利用上面的宏,编写按键的初始化函数。代码如下:

void Key_GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;/*开启按键GPIO口的时钟*/KEY1_GPIO_CLK_ENABLE();KEY2_GPIO_CLK_ENABLE();/*选择按键的引脚*/	GPIO_InitStructure.Pin = KEY1_PIN; /*设置引脚为输入模式*/GPIO_InitStructure.Mode = GPIO_MODE_INPUT; /*设置引脚不上拉也不下拉*/GPIO_InitStructure.Pull = GPIO_NOPULL;/*使用上面的结构体初始化按键*/HAL_GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);/*选择按键的引脚*/GPIO_InitStructure.Pin = KEY2_PIN; /*使用上面的结构体初始化按键*/HAL_GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);}

1.2.3 检测按键的状态

初始化按键后,就可以通过检测对应引脚的电平来判断按键状态,需注意的是我的按键是有硬件消抖的,若你的按键没有的话需要添加软件消抖,简单的软件消抖只需要加延时就可以了,代码如下:

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin){			/*检测是否有按键按下 */if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON )  {	 /*等待按键释放 */while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON);   return 	KEY_ON;	 }elsereturn KEY_OFF;}

1.2.4 主函数代码

        在主函数进行初始化,然后调用Key_Scan函数,轮询检测按键的状态,按下一次LED灯翻转一次。代码如下:

int main(void)
{/* 系统时钟初始化成72MHz */SystemClock_Config();/* LED 端口初始化 */LED_GPIO_Config();	 /*初始化按键*/Key_GPIO_Config();/* 轮询按键状态,若按键按下则反转LED */ while(1)                            {	   if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON  ){/*LED1反转*/LED1_TOGGLE;}   if( Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) == KEY_ON  ){/*LED2反转*/LED2_TOGGLE;}   }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024-01-06-AI 大模型全栈工程师 - 机器学习基础

摘要 2024-01-06 阴 杭州 晴 本节简介: a. 数学模型&算法名词相关概念; b. 学会数学建模相关知识; c. 学会自我思考,提升认知,不要只会模仿; 课程内容 1. Fine-Tuning 有什么作用? a. 什么是模型训练&#xff…

Linux(一)

目录结构 【在 Linux 世界里,一切皆文件】 linux 的文件系统是采用级层式的树状目录结构; 序号名称介绍备注1/:根目录一般根目录下只存放目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始; 当…

机器学习1-种类及应用

机器学习主要包括以下几种主要的种类: 1. 监督学习(Supervised Learning) 在监督学习中,模型通过使用已标记的训练数据(包括输入和对应的输出)来学习预测目标变量。常见的任务包括回归和分类。应用&#xf…

Docker进阶篇-Docker微服务实战

一、通过IDEA新建一个普通微服务模块 1、建Moduel <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation…

Open CASCADE学习|曲面上一点的曲率及切平面

曲率&#xff08;Curvature&#xff09;是一个几何学的概念&#xff0c;用于描述一个物体的形状在某一点上的弯曲程度。在我们日常生活中&#xff0c;曲率与我们的生活息息相关&#xff0c;如道路的弯道、建筑物的拱形结构、自然界的山脉等等。了解曲率的概念和计算方法&#x…

开源软件,推动技术创新

文章目录 一、开源软件介绍二、推动技术创的影响力三、常见的开源软件四、应用案例五、存在安全风险 一、开源软件介绍 开源软件&#xff0c;也称为自由软件或公众可用的软件&#xff0c;是一种源代码公开的软件。与传统的商业软件不同&#xff0c;开源软件由社区驱动&#xf…

Unity中开发程序打包发布

添加ESC脚本 使用Unity打包发布的过程中&#xff0c;考虑到打开的程序会处于全屏界面&#xff0c;而此时我们又会有退出全屏的需求&#xff0c;因此需要添加ESC脚本&#xff0c;当我们单击ESC脚本的过程中&#xff0c;退出全屏模式。 在Assets/Scenes下&#xff0c;创建esc.cs…

Python之PySpark简单应用

文章目录 一、介绍1.准备工作2. 创建SparkSession对象&#xff1a;3. 读取数据&#xff1a;4. 数据处理与分析&#xff1a;5. 停止SparkSession&#xff1a; 二、示例1.读取解析csv数据2.解析计算序列数据map\flatmap 三、问题总结1.代码问题2.配置问题 一、介绍 PySpark是Apa…

Linux离线安装Telnet

前言&#xff1a;由于服务器部署在内网环境&#xff0c;不能yum安装 1.先从网站下载好我们所需要到的三个rpm包http://www.rpmfind.net/linux/rpm2html/search.php?queryxinetd&submitSearch...&system&arch image.png 三个依赖包分别是&#xff1a; -rw-r--r-- 1…

Invicti Professional v24.1.0.43434

新的安全检查 添加了对 dotCMS 的检查添加了对 Ultimate Member WordPress 插件的检查添加了新的 mXSS 模式添加了新签名来检测 JWK 改进 改进了针对 Weak Ciphers Enabled 漏洞的建议改进了对 swagger.json 漏洞的检测添加了对 AWS WAFv2 规则的支持改进了更多错误和警告消…

探索Gin框架:Golang使用Gin完成文件上传

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 在之前的文章中&#xff0c;我们讲解了Gin框架的快速入门使用&#xff0c;今天我们来聊聊如何使用…

golang的sqlite驱动不使用cgo实现 更换gorm默认的SQLite驱动

golang的sqlite驱动不使用cgo实现 更换gorm默认的SQLite驱动 最近在开发一个边缘物联网程序时使用Golang开发&#xff0c;用到GORM来操作SQLite数据库&#xff0c;GORM默认使用gorm.io/driver/sqlite这个库作为SQLite驱动&#xff0c;该库用CGO实现&#xff0c;在使用过程中遇…

OpenAI Gym 中级教程——多智能体系统

Python OpenAI Gym 中级教程&#xff1a;多智能体系统 在强化学习中&#xff0c;多智能体系统涉及到多个智能体相互作用的情况。在本篇博客中&#xff0c;我们将介绍如何在 OpenAI Gym 中构建和训练多智能体系统&#xff0c;并使用 Multi-Agent Deep Deterministic Policy Gra…

Unity_Shader

Unity_Shader 目录 Unity_Shader 带着问题开始: Shader Graph 开始吧!

【NLP冲吖~】一、朴素贝叶斯(Naive Bayes)

0、朴素贝叶斯法 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集&#xff0c;首先基于特征条件独立假设学习输入输出的联合概率分布&#xff0c;然后基于此模型&#xff0c;对给定的输入 x x x&#xff0c;利用贝叶斯定理求出后验概率最大的…

【Spring Boot 3】应用启动执行特定逻辑

【Spring Boot 3】应用启动执行特定逻辑 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…

element-ui button 仿写 demo

基于上篇 button 源码分享写了一个简单 demo&#xff0c;在写 demo 的过程中&#xff0c;又发现了一个小细节&#xff0c;分享一下&#xff1a; 1、组件部分&#xff1a; <template><buttonclass"yss-button"click"handleClick":class"[ty…

STM32目录结构

之前一直头疼的32目录&#xff0c;比51复杂&#xff0c;又没有C规律&#xff0c;也不像python脚本文件关联不强&#xff0c;也不像工整的FPGA工程&#xff0c;编的时候到处放&#xff0c;爆出的错千奇百怪。短暂整理了一个&#xff0c;还是没有理得很轻。 startup_stm32f10x_m…

基于python+django,我开发了一款药店信息管理系统

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 功能包括&#xff1a;药品管理、分类管理、顾客管理、用户管理、日志管理、系统信息模块。 代码结构 server目录是后端代码web目录是前端代码 部署运行…

2024年1月29日-2月4日(全面进行+收集虚幻商城免费资源)

从上周发现&#xff0c;一轮轮推就行&#xff0c;每轮多个时间片&#xff0c;每个时间片一门。周一到周五一轮&#xff0c;周六日多轮&#xff08;比如上下午各一轮&#xff09;。 周一&#xff1a; 7&#xff1a;09–9&#xff1a;20卫星导航定位&#xff08;p3&#xff09;&a…