stm32 按键点灯 CubeMX的文章

举报
糖果罐子 发表于 2023/10/31 21:00:29 2023/10/31
【摘要】 > 注:我们使用的是 `HAL` 库@[TOC](文章目录)---# 前言# 一、按键 原理图:![在这里插入图片描述](https://img-blog.csdnimg.cn/53410dc72c644976843b5665608fd793.png)从图中我们可以看到有 ***4个按键,B1 , B2 , B3 , B4***。对应的 GPIO 端口是 ***PB0 , PB1, PB2 ...

> 注:我们使用的是 `HAL` 库

@[TOC](文章目录)

---

# 前言



# 一、按键 原理图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/53410dc72c644976843b5665608fd793.png)
从图中我们可以看到有 ***4个按键,B1 , B2 , B3 , B4***。

对应的 GPIO 端口是 ***PB0 , PB1, PB2 ,PA0***。

==当按键按下,IO 口读到低电平;按键弹起,IO 口读到高电平==。

`LED 的原理图,CubeMX 配置,以及代码讲解都在我的上篇文章 里详细讲解了,这 篇文章主要为大家讲解 按键 的使用。`
[蓝桥杯嵌入式之 LED 闪烁](https://blog.csdn.net/wuyiyu_/article/details/128595199)


---


# 二、按键CubeMX配置:
(1)设置 IO 端口是 ***PB0 , PB1, PB2 ,PA0***为 ==输入==模式。
![在这里插入图片描述](https://img-blog.csdnimg.cn/cafdb2dc8ff047f0be860dc3763bac0b.png)

(2)设置 RCC

![在这里插入图片描述](https://img-blog.csdnimg.cn/cf6d85c8f487423bb4bfab98f6b997b4.png)

(3)设置时钟:选用内部时钟,80 MHZ.

![在这里插入图片描述](https://img-blog.csdnimg.cn/11e03850e8fc4a0c85608dec8884b48b.png)

(4)设置工程模式和版本。

![在这里插入图片描述](https://img-blog.csdnimg.cn/c4a2abcc43634cb79e690315b143590c.png)

(5)选取加入.c /.h文件(便于编写代码)

![在这里插入图片描述](https://img-blog.csdnimg.cn/b3c69f23f9414b659eb0d00e1be988d6.png)

(6) 创建工程
![在这里插入图片描述](https://img-blog.csdnimg.cn/37b4fd6c86234677b8a8d3c673d1c14a.png)

---

# 三、代码讲解
### 1. 读按键:( 三行代码)
`Trg`   代表 单次触发。
`Cont`  表示 长按。
`KB1 ~ KB4`分别对应 按键 B1 ~ B4
```c
#define  KB1  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)  //B1
#define  KB2  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)  //B2
#define  KB3  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2) //B3
#define  KB4  HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) //B4
#define  KEYPORT   KB1 | (KB2<<1) |(KB3<<2) |(KB4<<3) | 0xf0

u8 Trg;   //全局变量,单次触发
u8 Cont;  //全局变量,长按

/* 三行代码读按键值 */
void Key_Read(void)
{
u8 ReadData = (KEYPORT)^0xff;
Trg = ReadData & (ReadData ^ Cont);
Cont = ReadData;
}


```


### 2.按键消抖:
通常我们使用的都是机械弹性开关,当机械触点断开,闭合时,由于机械点的弹性作用,==一个按键在按下,松开时不会马上接通,断开==。
![在这里插入图片描述](https://img-blog.csdnimg.cn/0c7b32956624440d9e0f057d4b6bd6d6.png)


为了确保按键的一次闭合一次断开只响应一次,需要进行消抖处理。

按键的抖动是由按键的机械特性决定的,一般都会在 `10 ms `以内。

==按下按键,10 ms 后读取按键值。==
```c
    __IO uint32_t keyTick = 0;

while(1)
{
if(uwTick - keyTick < 10) //10ms 的机械消抖
return ;

keyTick = uwTick;  //便于下一次按下按键,读取数值
Key_Read();   //读取按键值
}

```
==uwTick== 是延迟函数 ***HAL_Delay***  里面的一个计时变量。 默认是` 1ms` 增加一次。

按下按键后,==uwTick== 开始计数,10 ms 后读取按键值。

 将` keyTick = uwTick`,便于下一次按下读取数值。

```c
__IO uint32_t uwTick;

```

### 3,按键点灯:
可以通过 ==Trg  & 0x01== 按位进行判断是哪个按键按下。
例如:

```c
if(Trg & 0x01)     //按下B1
{
LED_Control(0x10);  //点亮 LED5 
}
if(Trg & 0x02)  //B2
{
LED_Control(0x20);  //点亮 LED6 
}

```
`LED_Control ( 0x10 ) ; 该函数为点亮 LED 灯的函数,前面提到了在我的上篇文章的 例程代码 中已详细讲解`。[蓝桥杯嵌入式之 LED 闪烁](https://blog.csdn.net/wuyiyu_/article/details/128595199)


# 总结
### 实验效果:
`下一节我们讲解 ADC 功能的实现。`

实验效果录制在 B 占,在下面网址:
https://www.bilibili.com/video/BV1s24y1Y7uZ/?vd_source=986c364d205fa1124b337bc665f57c4f
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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