【STM32】标准库与HAL库对照学习教程外设篇--按键控制


STM32全部教程【STM32】标准库与HAL库对照学习系列教程大全

一、前言

本篇介绍关于如何使用STM32控制按键,并使用标准库与HAL库同时配置按键以增加您对按键的理解,希望对您有所帮助。

本篇讲解的是使用软件控制按键,关于使用中断控制按键,可以参考这篇文章:【STM32】标准库与HAL库对照学习教程五–外部中断详讲与配置

二、准备工作

  • STM32开发板(我用的是普中的STM32F103ZE开发板)
  • cubemx软件、keil 5(MDK)
  • 开发板原理图

三、按键介绍

按键是一种电子开关,使用时按开关按钮,开关导通,当松开手时,开关断开
在这里插入图片描述
由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动

抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms。如下图所示
在这里插入图片描述


按键抖动会引起按键被误读多次。为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖。

按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖

  • 硬件消抖:按键电路有过滤的电容,可以吸收不稳定的抖动信号。
  • 软件消抖:通过软件延时一段时间,等抖动时间过去后再进按键状态判断,一般为5ms 到 10ms

我的开发板没有过滤电容进行硬件消抖,所以我用的是软件消抖(一般也是用软件消抖)

四、硬件图

根据自己开发板的原理图来。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、标准库控制按键

关于工程配置在我写的教程篇中已有详细介绍,这里不进行阐述,直接给出控制程序。
main.c

#include "LED.h"
#include "Delay.h"
#include "System.h"
#include "key.h"


/*************************************************
*函数名:    main
*函数功能: 主函数
*输入:     无  
*返回值:   无
**************************************************/
int main()
{
	SysTick_Init(72);
	LED_Init();
	KEY_Soft_Init();
	
	while(1)
	{
		Key = KEY_Scan(1);
		switch(Key)
		{
			case NONE: break; 
			case key_up:  LED_0 = !LED_0; break; //LED0电平翻转
			case key0:   LED_1 = 0; break;  //LED1点亮
			case key1:   LED_1 = 1; break;  //LED1熄灭
			default :break;
		}
	}
}

key.c

#include "key.h"
#include "Delay.h"
#include "System.h"

/*************************************************
*函数名:    KEY_Soft_Init
*函数功能:  按键初始化
*输入:      无
*返回值:    无
**************************************************/
void KEY_Soft_Init()
{
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(KEY_UP_RCC|KEY_RCC, ENABLE);  //打开对应端口时钟

	/************引脚初始化************/
	GPIO_InitStruct.GPIO_Pin = KEY_UP_Pin;    //WU_UP引脚
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;  //下拉输入模式
	GPIO_Init(KEY_UP_GPIO_Port, &GPIO_InitStruct);  //初始化引脚
	
	GPIO_InitStruct.GPIO_Pin = KEY_Pin; //KEY1与KEY0引脚
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入模式
	GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);  //初始化引脚
	
}

/*************************************************
*函数名:    KEY_Scan
*函数功能:  按键扫描
*输入:      Mode:1-支持连按,0-不支持连按
*返回值:    key枚举类型,key_up:KEY_UP按键按下,Key1:  KEY1按键按下	,Key0:  KEY0按键按下,NONE:  没有按键按下													
**************************************************/
key KEY_Scan(u16 Mode)
{
	static u16 KEY_Value = 1;  
	if(Mode == 1) KEY_Value = 1;  //是否支持连按
	if( KEY_Value == 1 && (KEY_UP == 1 || KEY1 == 0 || KEY0 == 0))  //如果有按键按下
	{
		KEY_Value = 0;  
		Delay_ms(10);  //消抖
		if(KEY_UP == 1) return key_up;   //判断KEY_UP按键按下
		else if(KEY1 == 0) return key1;  //判断KEY1按键按下
		else if(KEY0 == 0) return key0;  //判断KEY0按键按下
		else return NONE;                //没有按键按下
	}
	else if(KEY_UP == 0 && KEY1 == 1 && KEY0 == 1)   //没有按键按下时
			KEY_Value = 1;
	return NONE;
}

key.h

#ifndef KEY_H_
#define KEY_H_

#include "stm32f10x.h"


/************IO口宏定义便于移植************/
//引脚按键接高电平
#define KEY_UP_GPIO_Port GPIOA
#define KEY_UP_Pin       GPIO_Pin_0
#define KEY_UP_RCC       RCC_APB2Periph_GPIOA

//引脚按键接地
#define KEY_GPIO_Port    GPIOE
#define KEY_Pin          GPIO_Pin_3|GPIO_Pin_4
#define KEY_RCC          RCC_APB2Periph_GPIOE

/************位带操作************/
#define KEY_UP           PAin(0)
#define KEY1             PEin(3) 
#define KEY0             PEin(4)

/************使用枚举将按键值化************/
typedef enum key
{
	NONE = 0,
	key_up = 1,   //KEY_UP按键按下
	key0 =  2,    //KEY0按键按下
	key1 = 3      //KEY1按键按下
}key;

static key Key;  //枚举变量申明

/************函数申明************/
void KEY_Soft_Init(void);  //按键初始化
key KEY_Scan(u16 Mode);    //扫描函数

#endif

工程程序涉及位带与延时函数的知识,可以看这两文章理解:
【STM32】标准库与HAL库对照学习教程四–延时函数详解

【STM32】标准库与HAL库对照学习教程六–位带操作

六、HAL库控制按键

HAL库我们使用cubemx配置工程,相关配置操作在我写的教程篇中有详细说明,这里只放相关配置图,具体生成工程不再详细阐述。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
④按键
在这里插入图片描述
在这里插入图片描述
⑤LED
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


程序


在这里插入图片描述

#include "System.h"
/*************************************************
*函数名:    KEY_Scan
*函数功能:  按键扫描
*输入:      Mode:0-间断模式,1-连按模式 
*返回值:    1:KEY_UP按键按下
            2:KEY1按键按下
		    3:KEY0按键按下
			0:无按键按下
**************************************************/
uint16_t KEY_Scan(uint8_t Mode)
{
	static uint8_t KEY_Value = 1;
	if(Mode == 1) KEY_Value = 1;   //判断是否为连按模式
	if(KEY_Value == 1 && (PAin(0) == 1 || PEin(3) == 0 || PEin(4) == 0))  //有按键按下
	{
		KEY_Value = 0;
		HAL_Delay(10);  //延时消抖
		if(PAin(0) == 1) return 1;      //KEY_UP按键按下
		else if(PEin(3) == 0) return 2; //KEY1按键按下
		else if(PEin(4) == 0) return 3; //KEY0按键按下
		else return 0;  //无按键按下
	}
	else if(PAin(0) == 0 && PEin(3) == 1 && PEin(4) == 1)  //无按键按下
		KEY_Value = 1;
	return 0;
}


在这里插入图片描述

switch(KEY_Scan(0))
		{
			case 0:break;
			case 1:PBout(5) = !PBout(5); break;  //LED0翻转电平
			case 2:PEout(5) = 0; break;          //LED1点亮
			case 3:PEout(5) = 1; break;          //LED1熄灭
			default: break;
		}

是不是和标准库差不多呀,只是IO口的配置交给了cubemx配置了。

关于想要更深入了解按键的使用,可以看这篇文章:
一个学妹写的按键检测函数把我秀翻了
挺高级的。

那么关于按键的使用到这里就结束啦!
在这里插入图片描述

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
STM32标准库HAL库都是针对STM32系列微控制器的库,但是它们的设计思路和使用方法有所不同。STM32标准库是由ST公司提供的一套基于寄存器操作的低层驱动库,而HAL库则是基于标准库的封装,提供了更加高级的API接口,使得开发者可以更加方便地进行开发。 具体来说,STM32标准库主要包括以下几个部分: 1. CMSIS(Cortex Microcontroller Software Interface Standard):这是一套由ARM公司提供的针对Cortex-M系列微控制器的标准接口,包括了一些通用的API接口和一些与具体芯片相关的头文件和链接脚本等。 2. 寄存器操作库:这是STM32标准库的核心部分,通过对芯片内部寄存器的直接操作,实现了对外设的控制和数据传输等功能。 3. 外设驱动库:这是对一些常用外设(如USART、SPI、I2C等)的封装,提供了更加方便的API接口,使得开发者可以更加方便地进行开发。 相比之下,HAL库则提供了更加高级的API接口,使得开发者可以更加方便地进行开发。HAL库主要包括以下几个部分: 1. HAL库核心:这是HAL库的核心部分,提供了一些通用的API接口,如时钟配置、中断控制等。 2. 外设驱动库:这是对一些常用外设(如USART、SPI、I2C等)的封装,提供了更加方便的API接口,使得开发者可以更加方便地进行开发。 3. 扩展库:这是一些额外的功能库,如USB库、文件系统库等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修成真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值