STM32-按键扫描配置

server/2024/12/25 0:17:12/

问题引入

由于在使用例程中的按键时,发现按键无效,经过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/server/152908.html

相关文章

用 Python 实现井字棋游戏

一、引言 井字棋(Tic-Tac-Toe)是一款经典的两人棋类游戏。在这个游戏中,玩家轮流在 3x3 的棋盘上放置自己的标记,通常是 “X” 和 “O”,第一个在棋盘上连成一线(横、竖或斜)的玩家即为获胜者。…

对象的状态变化处理与工厂模式实现

一、引言 在 C 编程中,有效地处理对象的状态变化以及合理运用设计模式可以极大地提高代码的可维护性、可扩展性和可读性。本文将深入探讨 C 如何处理对象的状态变化以及如何实现工厂模式。 二、C 中对象的状态变化处理 使用成员变量表示状态 class GameCharacte…

图像生成工具WebUI

介绍 Stable Diffusion WebUI(AUTOMATIC1111,简称A1111)是一个为高级用户设计的图形用户界面(GUI),它提供了丰富的功能和灵活性,以满足复杂和高级的图像生成需求。如今各种人工智能满天飞&…

vue create 创建项目 提示 Failed to check for updates 淘宝 NPM 镜像站喊你切换新域名啦

1、使用 vue create demo创建项目的时候发现 提示 “Failed to check for updates”, 执行 npm config list 看了一下 镜像源是:https://registry.npm.taobao.org 然后搜索一下发现这个淘宝这个镜像域名切换了。 公告地址:【公告】淘宝 npm …

如何使用 Python 连接 SQLite 数据库?

SQLite是一种轻量级的嵌入式数据库,广泛应用于各种应用程序中。 Python提供了内置的sqlite3模块,使得连接和操作SQLite数据库变得非常简单。 下面我将详细介绍如何使用sqlite3模块来连接SQLite数据库,并提供一些实际开发中的建议和注意事项…

Oracle、ACCSEE与TDMS的区别

Oracle、ACCSEE和TDMS都是不同类型的数据管理和存储工具,它们各自有独特的用途、结构和复杂性。Oracle是一个功能强大的关系型数据库管理系统,适用于大规模企业级应用,支持复杂查询和事务管理。ACCSEE主要应用于实时数据采集和过程监控&#…

流年运势API接口_解析个人命理十年大运PHP实现方法返回json数据

介绍 流年运势与十年大运的 API 接口提供了一种高效的方式来分析个体的命理特征。通过输入个人的基本信息(包括姓、名、性别、出生日期和时间),用户可以获取详细的命理分析,包括五行数量、生肖、八字、十神、命宫等信息。这些数据…

OpenCV(python)从入门到精通——文件操作

图像的读取 import cv2 as cv 图片的读取if __name__ __main__:# 读取图片img cv.imread(r"images/1.jpg",cv.IMREAD_COLOR)# 显示图片cv.imshow("pic show",img)# 暂停cv.waitKey(0)不同读取方式,灰度图读取 import cv2 as cv 图片的读取if __name__ …