三、GPIO按键读取

在上一篇文章中,我们详细讲解了GPIO的写函数。万事万物都具有一定的相对性,GPIO的操作也不例外。既然有写操作,那么必然也有读操作。有了上一篇文章的基础,理解本篇内容将会更加容易。

一、这篇文章能了解什么

本篇文章将基于上一篇的内容,进一步探讨如何实现对LED灯的控制。
阅读完本篇文章后,您将了解到以下内容:

1.GPIO输入的初始化
2.GPIO读操作的实现
3.按键消抖
4.使用按键控制LED灯的实现方法
通过对这些知识的掌握,您将能够更全面地理解和运用GPIO操作,实现更复杂的功能。

1.1 GPIO输入的初始化

        首先,我们需要初始化用于按键的GPIO引脚。以下是一个示例代码,展示了如何初始化GPIO引脚以读取按键输入。

void KEY_Init(){GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //启动GPIO的时钟线,让时钟进去以驱动其GPIOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设不设置都可以GPIO_Init(GPIOA, &GPIO_InitStructure);
}

        在上述代码中,我们首先启动了GPIOA的时钟,然后配置了GPIO引脚2为上拉输入模式。

1.2 GPIO读操作的实现

        接下来,我们需要实现GPIO读操作,以检测按键的状态。通过读取GPIO引脚的电平,可以判断按键是否被按下。

uint8_t KEY_Read(){return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2);
}

        上述函数KEY_Read用于读取GPIOA引脚2的状态。如果返回值为0,则表示按键被按下;如果返回值为1,则表示按键未被按下。

1.3 按键消抖

        在实际使用按键时,由于机械抖动的存在,会导致按键在短时间内多次触发。为了解决这个问题,我们需要进行按键消抖处理。以下是一个简单的按键消抖算法示例:

int Key_detection(void){int Key_flag;if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0) {Delay_Ms(20);if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0) {while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2));Key_flag=1;}} else Key_flag= 0;return Key_flag;
}

        按键消抖的代码其实还可以更加精简,小伙伴们有好的方法嘛,可以留言在评论区。

二、代码程序

2.1 main.c(使用按键控制LED灯的实现方法)

int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);SystemCoreClockUpdate();Delay_Init();USART_Printf_Init(115200);	printf("SystemClk:%d\r\n",SystemCoreClock);printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );printf("This is printf example\r\n");LED_Init();KEY_Init();while(1){if(Key_detection()==1){GPIO_ResetBits(GPIOA, GPIO_Pin_0 |GPIO_Pin_1 );}else{GPIO_SetBits(GPIOA, GPIO_Pin_0 |GPIO_Pin_1 );}}
}

2.2 按键原理图

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

vue3.0学习笔记(二)——生命周期与响应式数据(ref,reactive,toRef,toRefs函数)

1. 组合API-setup函数 使用细节: setup 是一个新的组件选项,作为组件中使用组合API的起点。从组件生命周期来看,它的执行在组件实例创建之前vue2.x的beforeCreate执行。这就意味着在setup函数中 this 还不是组件实例,this 此时是…

ES中的数据类型学习之Aggregate metric(聚合计算)

Aggregate metric field type | Elasticsearch Guide [7.17] | Elastic 对于object类型的字段来说,可以存子字段为 min/max/sum/value_count PUT my-index {"mappings": {"properties": {"my-agg-metric-field": { -- 字段名"ty…

【测开能力提升-fastapi框架】fastapi能力提升 - 中间件与CORS

1. 中间件 1.1 介绍(ChatGPT抄的,大致可以理解) 一种机制,用于在处理请求和响应之前对其进行拦截、处理或修改。中间件可以在应用程序的请求处理管道中插入自定义逻辑,以实现一些通用的功能,如身份验证、…

idea部分常用模板

idea部分常用模板 —2020年06月09日 psvm(main方法) //模板一:psvmpublic static void main(String[] args) {}sout(输出) //模板二:soutSystem.out.println("hello!");//变形: s…

React中的无状态组件:简约之美

🎉 博客主页:【剑九 六千里-CSDN博客】 🎨 上一篇文章:【掌握浏览器版本检测:从代码到用户界面】 🎠 系列专栏:【面试题-八股系列】 💖 感谢大家点赞👍收藏⭐评论✍ 引言…

前言及汇编(30小时精通C++和外挂实战)

前言及汇编(30小时精通C和外挂实战) 1,前言2,汇编的重要性(1)网上流传的谬论(2)国内技术氛围(3)学习建议(4)代码本质挖掘(…

C语言之宏详解(超级详细!)

目录 一、用宏前须知-#define相关知识 大致结构: 对预定义符号的补充: 二、用#define定义宏 什么是宏? #define的替换规则: 三、常用的宏定义 1、宏定义常量 2、定义一个宏语句 3、宏定义函数 宏与函数的对比: …

【Linux 驱动】IMX6ULL eLCDIF驱动

1. eLCDIF设备树 lcdif: lcdif021c8000 {compatible "fsl,imx6ul-lcdif", "fsl,imx28-lcdif"; //属性reg <0x021c8000 0x4000>; //起始地址 地址大小interrupts <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>; …

[路由器]IP-MAC的绑定与取消

背景&#xff1a;当公司的网络不想与外部人员进行共享&#xff0c;可以在路由器页面配置IP-MAC的绑定&#xff0c;让公司内部人员的手机和电脑的mac&#xff0c;才能接入到公司。第一步&#xff1a;在ARP防护中&#xff0c;启动IP-MAC绑定选项&#xff0c;必须启动仅允许IP-MAC…

Modbus转BACnet/IP网关快速对接Modbus协议设备与BA系统

摘要 在智能建筑和工业自动化领域&#xff0c;Modbus和BACnet/IP协议的集成应用越来越普遍。BA&#xff08;Building Automation&#xff0c;楼宇自动化&#xff09;系统作为现代建筑的核心&#xff0c;需要高效地处理来自不同协议的设备数据&#xff0c;负责监控和管理建筑内…

双边性:构建神经网络的新方法

正如承诺的那样&#xff0c;这是最近我遇到的最有趣的想法之一的第二部分。如果你错过了&#xff0c;请务必观看本系列的第一部分 - 神经科学家对改进神经网络的看法 - 我们讨论了双边性的生物学基础以及我们大脑的不对称性质如何带来更高的性能。 在这篇文章中&#xff0c;我…

吴恩达深度学习笔记1 Neural Networks and Deep Learning

参考视频&#xff1a;(超爽中英!) 2024公认最好的【吴恩达深度学习】教程&#xff01;附课件代码 Professionalization of Deep Learning_哔哩哔哩_bilibili Neural Networks and Deep Learning 1. 深度学习引言(Introduction to Deep Learning) 2. 神 经 网 络 的 编 程 基 础…

【RT摩拳擦掌】RT600 4路音频同步输入1路TDM输出方案

【RT摩拳擦掌】RT600 4路音频同步输入1路TDM输出方案 一&#xff0c; 文章简介二&#xff0c;硬件平台构建2.1 音频源板2.2 音频收发板2.3 双板硬件连接 三&#xff0c;软件方案与软件实现3.1 方案实现3.2 软件代码实现3.2.1 4路I2S接收3.2.2 I2S DMA pingpong配置3.2.3 音频数…

【BUG】已解决:AttributeError: ‘str‘ object has no attribute ‘read‘

AttributeError: ‘str‘ object has no attribute ‘read‘ 目录 AttributeError: ‘str‘ object has no attribute ‘read‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998https://bbs.csdn.net/topics/617804998 欢迎来到我的主…

【CSS】容器查询:@container

目录 什么是容器查询如何使用container实际应用场景浏览器支持 什么是容器查询 容器查询是一种CSS特性&#xff0c;允许开发者根据组件所在的容器的大小来应用样式&#xff0c;而不是整个视口的大小。这使得组件能够更加灵活地适应不同的布局环境&#xff0c;而不仅仅是依赖于…

IDEA缓存和索引

IDEA缓存和索引 —2020年06月10日 IntelliJ IDEA首次加载项目的时候。都会创建索引&#xff0c;而创建索引的时间根项目的文件多少成正比。 IntelliJ IDEA的缓存和索引主要是用来加快文件查询&#xff0c;从而加快各种查找、代码提示等操作的速度。 某些特殊情况下&#xf…

2024“钉耙编程”中国大学生算法设计超级联赛(2)

Rank Search Result (hdu.edu.cn) URL划分 - HDU 7451 - Virtual Judge (vjudge.net)​​​​​​​ 这题唯一要注意的就是后面只输出有等号的部分&#xff0c;然后模拟即可。 #include<bits/stdc.h> using lllong long; using ullunsigned long long; using PIIstd::…

《梦醒蝶飞:释放Excel函数与公式的力量》18.1 图表类型与设计

第18章&#xff1a;创建图表和数据可视化 18.1 图表类型与设计 Excel提供了多种图表类型&#xff0c;帮助用户以直观的方式展示数据。选择合适的图表类型和设计可以显著提高数据的可读性和理解度。以下将介绍常见的图表类型及其应用&#xff0c;并通过具体案例进行说明。 18.…

ML.Net 学习之使用经过训练的模型进行预测

什么是ML.Net&#xff1a;&#xff08;学习文档上摘的一段&#xff1a;ML.NET 文档 - 教程和 API 参考 | Microsoft Learn 【学习入口】&#xff09; 它使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中。 借助此功能&#xff0c;可以使用应用程序的可用数据进行自…

【中项】系统集成项目管理工程师-第4章 信息系统架构-4.5技术架构

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…