蓝桥杯 stm32 按键点灯 CubeMX

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

注我们使用的是 HAL

文章目录


前言

一、按键 原理图

在这里插入图片描述
从图中我们可以看到有 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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
返回列表

上一篇:牛客网刷题

下一篇:正则表达式