stm32 按键点灯 CubeMX的文章
【摘要】 > 注:我们使用的是 `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)