前言
一、按键 原理图:
从图中我们可以看到有 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;
1
2
3,按键点灯:
可以通过 Trg & 0x01 按位进行判断是哪个按键按下。
例如:
if(Trg & 0x01) //按下B1 { LED_Control(0x10); //点亮 LED5 } if(Trg & 0x02) //B2 { LED_Control(0x20); //点亮 LED6 }
LED_Control ( 0x10 ) ; 该函数为点亮 LED 灯的函数,前面提到了在我的上篇文章的 例程代码 中已详细讲解。蓝桥杯嵌入式之 LED 闪烁
总结
实验效果:
下一节我们讲解 ADC 功能的实现。
实验效果录制在 B 占,在下面网址:
https://www.bilibili.com/video/BV1s24y1Y7uZ/?vd_source=986c364d205fa1124b337bc665f57c4f