STM32-按键扫描配置

devtools/2024/12/26 8:13:40/

问题引入

由于在使用例程中的按键时,发现按键无效,经过Debug发现程序进入按键扫描死循环中。

由于初始按键引脚时,按键引脚上拉,按下为高电平。给的引脚配置为浮空输入(不确定高低电平),导致初始按键引脚电平初始就为高,所以导致无论按键按下与否,按键引脚一直为高。

使得按键扫描函数,一直在while中,无法退出,程序无法往下运行。

经过改正,初始按键引脚下拉即可解决上述问题。

GPIO_InitStructure.Pull = GPIO_PULLDOWN;
/*** @brief   检测是否有按键按下* @param   具体的端口和端口位*		@arg GPIOx: x可以是(A...G) *		@arg GPIO_PIN 可以是GPIO_PIN_x(x可以是1...16)* @retval  按键的状态*		@arg KEY_ON:按键按下*		@arg KEY_OFF:按键没按下*/
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;
}
/*** @brief  配置按键用到的I/O口* @param  无* @retval 无*/
void Key_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;/*开启按键GPIO口的时钟*/KEY1_GPIO_CLK_ENABLE();KEY2_GPIO_CLK_ENABLE();/*设置引脚为输入模式*/GPIO_InitStructure.Mode = GPIO_MODE_INPUT; /*设置引脚不上拉也不下拉*/GPIO_InitStructure.Pull = GPIO_PULLDOWN;/*选择按键的引脚*/	GPIO_InitStructure.Pin = KEY1_PIN; /*使用上面的结构体初始化按键*/HAL_GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);/*选择按键的引脚*/GPIO_InitStructure.Pin = KEY2_PIN; /*使用上面的结构体初始化按键*/HAL_GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);}

知识扩展

1.理论分析

理论情况按键的电压波形应该为方波

但是实际按键电压波形,会有电压抖动,我们需要通过延时来进行按键消抖,这里需要用到延时函数delay_ms()

1.2按键扫描程序逻辑

通过分析,我们可以知道。

  • 第一步,判断是否有按键按下,有按键按下时,将继续执行,没有按键按下时,将返回0,即没有按键按下。
  • 第二步,当判断为有按键按下时,判断为key0还是key1,当为key0时,返回1,即为按键1按下;当为key1时,返回为2,即为按键2按下。

2.程序编写

如上所示。


http://www.ppmy.cn/devtools/145044.html

相关文章

如何理解TCP/IP协议?如何理解TCP/IP协议是什么?

理解TCP/IP协议 1. 什么是TCP/IP协议? TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是一组用于实现网络通信的协议,广泛用于互联网和局域网中。TCP/IP协议栈由一系列协议组成,规定了计算机如何在网络中发送和接收数据。它通常被用来…

ES学习class类用法(十一)

这里写目录标题 一、class 类的用法二、类的继承 一、class 类的用法 JS语言中,生成实例对象的传统方法是通过构造函数: function Person(name,age){this.namename;this.ageage;}Person.prototype.sayNamefunction(){return this.name}let pnew Person(…

[N1CTF 2018]eating_cms

[N1CTF 2018]eating_cms 知识点 文件上传 解题 这个题感觉还好,知识点真心不难,就是全混在一起。 思路差不多挺离谱 首先看到,有一个登录界面,然后猜测有注册界面 admin注册不了,随便注册一个账号。 注册之后&…

TCP为什么需要三次握手和四次挥手?

在 TCP/IP 协议中,三次握手(Three-Way Handshake)和四次挥手(Four-Way Handshake)是为了确保可靠的数据传输和连接的建立与断开。下面将详细讲解这两个过程,并结合实际项目代码示例进行解释。 1. 三次握手(三次握手) 三次握手是用来建立一个 TCP 连接的过程。通过这个…

汽车经销商门店管理新趋势:信息化工具助力精益运营

随着汽车市场竞争日益激烈,新能源汽车的崛起、新零售模式的普及,以及消费者对服务体验需求的不断提高,传统汽车经销商的门店运营正面临严峻挑战。如何在这种充满不确定性的市场中维持竞争力?答案就在于——精益运营。 汽车经销商门…

鸿蒙学习笔记:用户登录界面

文章目录 1. 提出任务2. 完成任务2.1 创建鸿蒙项目2.2 准备图片资源2.3 编写首页代码2.4 启动应用 3. 实战小结 1. 提出任务 本次任务聚焦于运用 ArkUI 打造用户登录界面。需呈现特定元素:一张图片增添视觉感,两个分别用于账号与密码的文本输入框&#…

物联网水文观测设备

物联网水文观测设备的功能涵盖了水文监测的多个方面,以下是其主要功能: 实时数据收集: 物联网水文观测设备能够实时收集水位、流量、水质等参数,实现对水环境的持续监测。这种连续的数据收集方法有助于及时发现和预警水资源问题&a…

Laya ios接入goole广告,开始接入 2

开始使用 | iOS | Google for Developers 谷歌广告的官网,需要搭梯子,API你说详细吧,也就那样,主要是没接过 一步步来吧 0.laya导包 前端出包原生 screenorientation 全部 portrait,我这个是竖屏的 注意这个&a…