蓝桥杯STM32 G431 hal库开发速成——GPIO输入——按键_stm32 hal 按键

三、配置STM32cubeMX

根据按键官方原理图:PB0控制B1按键
PB1控制B2按键
PB2控制B3按键
PA0控制B4按键
将这四个口配置为GPIO输入模式
在这里插入图片描述
GPIO输入口配置为上拉模式。

在很多情况下,当GPIO配置为输入模式并且没有连接任何输入信号时,该端口的状态是不确定的。也就是说,如果输入没有被拉高到VCC或拉低到GND,端口可能会随着环境噪声或电气干扰而随机地改变状态。这种状态被称为浮空状态(floating state),它可能导致不可预测的行为,特别是在数字逻辑电路中。为了避免这种情况,可以配置内部的上拉(pull-up)或下拉(pull-down)电阻器。上拉模式意味着内部电阻将GPIO端口拉高到VCC,确保在没有外部信号时,端口状态为高;下拉模式则意味着内部电阻将GPIO端口拉低到GND,确保端口状态为低。

上拉电阻是为了保证在没有信号输入的时候,IO口保持高电平,若按键为低电平有效,则没有信号的时候,IO应呈现高电平,所以,此处应设置为上拉输入。
同理,下拉电阻是为了保证在没有信号输入的时候,IO口保持低电平,若按键为高电平有效,则没有信号的时候,IO应呈现低电平。
在这里插入图片描述

四、按键控制LED亮与灭

实验现象:按下B1按键,LED1亮!按下B2按键,LED1灭!
按下B3按键,LED2亮!按下B4按键,LED2灭!
1.创建key.c和key.h文件,将其分别放入Src跟Inc文件中,与第一篇文章中代码封装的步骤一致。
2.编写key.c中代码

#include "key.h"
#include "main.h"
#include "led.h"

void key()
{
	//按下B1键 led1灯亮
	if(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_0)==RESET)//B1按下为低电平
	{
		HAL\_Delay(5);//防抖动
		if(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_0)==RESET)//延迟消抖
		{
			//写功能
			led(1,1);
		}
		// 等待按键松开,按键松开之前程序一直卡在while循环里,按键松开之后才能处理其他的程序。
		while(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_0)==RESET);
	}
	//按下B2键,led1灯灭
	if(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_1)==RESET)//B2按下为低电平
	{
		HAL\_Delay(5);
		if(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_1)==RESET)
		{
			//写功能
			led(1,0);
		}
		while(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_1)==RESET);
	}
	//按下B3键,led2灯亮
	if(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_2)==RESET)//B3按下为低电平
	{
		HAL\_Delay(5);
		if(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_2)==RESET)
		{
			//写功能
			led(2,1);
		}
		while(HAL\_GPIO\_ReadPin(GPIOB,GPIO_PIN_2)==RESET);
	}
	//按下B4键,led2灯灭
	if(HAL\_GPIO\_ReadPin(GPIOA,GPIO_PIN_0)==RESET)//B4按下为低电平
	{
		HAL\_Delay(5);
		if(HAL\_GPIO\_ReadPin(GPIOA,GPIO_PIN_0)==RESET)
		{
			//写功能
			led(2,0);
		}
		while(HAL\_GPIO\_ReadPin(GPIOA,GPIO_PIN_0)==RESET);
	}
}


3.在key.h中

void key(void);

4.在main.c中
在这里插入图片描述
5.在main.c while(1)中调用函数功能
在这里插入图片描述

五、key函数的封装

#define KEY\_STATE GPIO\_PIN\_RESET
#define KEY\_UNSTATE GPIO\_PIN\_SET

#define KEY1\_GPIO GPIOB
#define KEY1\_PIN GPIO\_PIN\_1

#define KEY2\_GPIO GPIOA
#define KEY2\_PIN GPIO\_PIN\_7

#define KEY3\_GPIO GPIOA
#define KEY3\_PIN GPIO\_PIN\_5

#define KEY4\_GPIO GPIOA
#define KEY4\_PIN GPIO\_PIN\_3

int keynum()
{
	int KeyNum=0;
	if(HAL\_GPIO\_ReadPin(KEY1_GPIO,KEY1_PIN)==KEY_STATE)
	{
		HAL\_Delay(5);
		if(HAL\_GPIO\_ReadPin(KEY1_GPIO,KEY1_PIN)==KEY_STATE)
		{
			KeyNum=1;

		}
		while(HAL\_GPIO\_ReadPin(KEY1_GPIO,KEY1_PIN)==KEY_STATE);
	}

	if(HAL\_GPIO\_ReadPin(KEY2_GPIO,KEY2_PIN)==KEY_STATE)
	{
		HAL\_Delay(5);
		if(HAL\_GPIO\_ReadPin(KEY2_GPIO,KEY2_PIN)==KEY_STATE)
		{

			KeyNum=2;

		}
		while(HAL\_GPIO\_ReadPin(KEY2_GPIO,KEY2_PIN)==KEY_STATE);
	}

	if(HAL\_GPIO\_ReadPin(KEY3_GPIO,KEY3_PIN)==KEY_STATE)
	{
		HAL\_Delay(5);
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/3c819dc6b11e47f60aa7f8081c266983.png)

![img](https://img-blog.csdnimg.cn/img_convert/c4e792ce8c0b025a9a3eadc976f2374a.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/c5a1c40d8113a16a1f183a2eb8a370f1.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/77e6eeed520dbc6a7ff7bdc9a362a81a.png)

![img](https://img-blog.csdnimg.cn/img_convert/d1d58afa87a2a1f0cbe0fa814bbce1fe.png)

![img](https://img-blog.csdnimg.cn/img_convert/ee003ca0470088b04d690669869c4545.png)

![](https://img-blog.csdnimg.cn/img_convert/ca1569b5f49f3b3bfeda4fe281e00e54.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值