STM32CubeMX按键模块化 点灯

举报
糖果罐子 发表于 2023/10/31 20:38:45 2023/10/31
【摘要】 > 本文代码使用 `HAL `库。@[TOC](文章目录)---# 前言我们继续讲解 **stm32 f103**,这篇文章将详细 为大家讲解 如何 使用 按键点亮 RGB 灯。---# 一、按键原理图参考手册:可以 看到 板子有 4 个按键 :==KEY1, KEY2, KEY3, KEY4==。对应的 io 端口分别是 :==PA0, PG15, PC13, PE3==.![在这里插入图...

> 本文代码使用 `HAL `库。

@[TOC](文章目录)

---

# 前言
我们继续讲解 **stm32 f103**,这篇文章将详细 为大家讲解 如何 使用 按键点亮 RGB 灯。

---

# 一、按键原理图
参考手册:

可以 看到 板子有 4 个按键 :==KEY1, KEY2, KEY3, KEY4==。

对应的 io 端口分别是 :==PA0, PG15, PC13, PE3==.
![在这里插入图片描述](https://img-blog.csdnimg.cn/8a6b7e681c0e4d74ab777900b3df3968.png)

以 KEY1 为例 分析:

该电路接了一个 3V 的电压。
当 按键 按下时,电流 流向按键,然后接地,则 PA0 为 低电平 0。
当按键 松开时,电流流向 PA0 ,则 PA0 是 高电平 1。

所以:
当  ==PA0 为 低电平 0 时,按键 按下==。
当 ==PA0 为 高电平1 时,按键 松开==。

# 二、CubeMX 创建工程
1. 选择芯片。
![在这里插入图片描述](https://img-blog.csdnimg.cn/289ac71844d7429086fcb3feb3a0fb69.png)
2. 选择 Debug 模式。
![在这里插入图片描述](https://img-blog.csdnimg.cn/845b7a5417b34c06a0bd55c28ac74ec5.png)
3. 选择外部时钟。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e3db8e0e73b44785ac7ede2d4d64eda9.png)
4. 配置系统时钟,在 红框中输入 72 ,然后点击 回车 两次,即可配置好。
![在这里插入图片描述](https://img-blog.csdnimg.cn/39b080b01edf4f8a819e2352d267efd0.png)
5. 配置 io 引脚 为 输入引脚。
![在这里插入图片描述](https://img-blog.csdnimg.cn/b03d7736eae141ab80273352bf4a9e99.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/9d7c34aeac224feba29f6db53bdd44c6.png)
6. 配置引脚。
![在这里插入图片描述](https://img-blog.csdnimg.cn/edaf4ac8d4ad48d9a81ca683062ad575.png)
7. 设置工程模式和版本。
![在这里插入图片描述](https://img-blog.csdnimg.cn/c1b2b4270a1e4aa8a637142fc0466f2f.png)
8. 选取加入.c /.h文件(便于编写代码)。
![在这里插入图片描述](https://img-blog.csdnimg.cn/7cfddd322e434dcb88e25651b14588c3.png)
9. 创建工程。
![在这里插入图片描述](https://img-blog.csdnimg.cn/b8179c70d37b464f8ae77cbe94f0257f.png)

# 三、代码讲解:
由于我们采用 封装的方法来写程序,所以 我们将 key 程序用一个` .c .h `文件封装起来,这样便于我们对代码进行修改与移植。

对于 led 的代码可以参考我之前的文章:[STM32f103 CubeMX封装 led程序](https://blog.csdn.net/wuyiyu_/article/details/129108738)

### 1. GPIO的输入HAL库函数:
功能:读取一个GPIO引脚的电平。
```c
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
```
例如: 读取 K1 的电平,将其重定义。

```c
#define  K1   HAL_GPIO_ReadPin(K1_GPIO_Port, K1_Pin)
```

### 2. 消抖:
![在这里插入图片描述](https://img-blog.csdnimg.cn/3e0e85833e12448b89ce6a77c58b5011.png)

 抖动产生原因: 按键按下的 瞬间 引脚的 电平 不是马上 从 高电平 变为 低电平 或者从 低电平 变成 高电平,而是有一个抖动。
 
 解决方法: 可以使用加 `延时` 判断的办法消除这个抖动。
 
>例如:按下 K1 点亮 led
```c
    #define  K1   HAL_GPIO_ReadPin(K1_GPIO_Port, K1_Pin)
    #define Red_ON()  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET)

if(K1 == 0)  
{
HAL_Delay(100);  //消抖,延时 100 ms
if(K1 == 0)     //如果按键 真的 按下
{
Red_ON();  //led 亮
}
else Red_OFF();   //led 熄灭
}
```
### 3. 详细代码
***key.h***  文件:

```c
#include "main.h"

#define  K1   HAL_GPIO_ReadPin(K1_GPIO_Port, K1_Pin)  //读取 K1 电平
#define  K2   HAL_GPIO_ReadPin(K2_GPIO_Port, K2_Pin) //读取 K2 电平
#define  K3   HAL_GPIO_ReadPin(K3_GPIO_Port, K3_Pin) //读取 K2 电平
void Key(void);

```
***key.c*** 文件:

```go
#include "key.h"
#include "led.h"

void Key(void)
{
if(K1 == 0)
{
HAL_Delay(100);
if(K1 == 0)
Red_ON();
else Red_OFF();
}
else if(K2 == 0)
{
HAL_Delay(100);
if(K2 == 0)
Green_ON();
else Green_OFF();
}
else if(K3 == 0)
{
HAL_Delay(100);
if(K3 == 0)
BlUE_ON();
else BlUE_OFF();
}
}
```
# 四,实验现象:
对于按键 让 RGB 闪烁的实验结果我发在了 B占,有兴趣的可以看看:

[实验现象](https://www.bilibili.com/video/BV1U54y1c7hs/?vd_source=986c364d205fa1124b337bc665f57c4f)

---

# 总结
下一篇 讲 ***OLED*** 显示。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。