注:我们使用的是
HAL
库
文章目录
- 前言
- 一、按键 原理图:
- 二、按键CubeMX配置:
- 三、代码讲解
- 1. 读按键:( 三行代码)
- 2.按键消抖:
- 3,按键点灯:
- 总结
- 实验效果:
前言
一、按键 原理图:
从图中我们可以看到有 4个按键,B1 , B2 , B3 , B4。
对应的 GPIO 端口是 PB0 , PB1, PB2 ,PA0。
当按键按下,IO 口读到低电平;按键弹起,IO 口读到高电平。
LED 的原理图,CubeMX 配置,以及代码讲解都在我的上篇文章 里详细讲解了,这 篇文章主要为大家讲解 按键 的使用。
蓝桥杯嵌入式之 LED 闪烁
二、按键CubeMX配置:
(1)设置 IO 端口是 PB0 , PB1, PB2 ,PA0为 输入模式。
(2)设置 RCC
(3)设置时钟:选用内部时钟,80 MHZ.
(4)设置工程模式和版本。
(5)选取加入.c /.h文件(便于编写代码)
(6) 创建工程
三、代码讲解
1. 读按键:( 三行代码)
Trg
代表 单次触发。
Cont
表示 长按。
KB1 ~ KB4
分别对应 按键 B1 ~ B4
#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.按键消抖:
通常我们使用的都是机械弹性开关,当机械触点断开,闭合时,由于机械点的弹性作用,一个按键在按下,松开时不会马上接通,断开。
为了确保按键的一次闭合一次断开只响应一次,需要进行消抖处理。
按键的抖动是由按键的机械特性决定的,一般都会在 10 ms
以内。
按下按键,10 ms 后读取按键值。
__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
,便于下一次按下读取数值。
__IO uint32_t uwTick;
3,按键点灯:
可以通过 Trg & 0x01 按位进行判断是哪个按键按下。
例如:
if(Trg & 0x01) //按下B1
{
LED_Control(0x10); //点亮 LED5
}
if(Trg & 0x02) //B2
{
LED_Control(0x20); //点亮 LED6
}
LED_Control ( 0x10 ) ; 该函数为点亮 LED 灯的函数,前面提到了在我的上篇文章的 例程代码 中已详细讲解
。蓝桥杯嵌入式之 LED 闪烁
总结
实验效果:
实验效果录制在 B 占,在下面网址:
https://www.bilibili.com/video/BV1s24y1Y7uZ/?vd_source=986c364d205fa1124b337bc665f57c4f