一、按键
记录学习使用HAL库读取板载按键输入键值
板载三颗按键,引脚配置如下
其中K_UP按键按下为高电平,那么PA0引脚要配置为下拉模式;K0和K1按下为低电平,那么PE4和PE3引脚要配置为上拉模式。
二、通过按键控制LED
这里实现的功能是,按键K_UP按下同时点亮两个LED,再次按下熄灭两个LED;按键K0和K1分别按下,分别点亮LED1和LED2,再次分别按下,分别熄灭LED1和LED2。
代码如下
bsp_keys.c
文件
/*
*********************************************************************************************************
* Module Description
*
* 独立按键驱动模块,板载三个按键K_UP、K0和K1,所接引脚分别是PA0、PE4和PE3
* 按键K_UP(WK_UP可作为待机唤醒选项)按下为高电平,设置为下拉输入模式
* 按键K0和按键K1按下为低电平,设置为上拉输入模式
*********************************************************************************************************
*/
#include "bsp.h"
/*
**********************************************************************************
* @brief 按键硬件初始化,配置按键对应的GPIO
* @param None
* @return None
* @note
**********************************************************************************
*/
static void bsp_InitKeyHard()
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 打开GPIO时钟 */
GPIO_CLK_ENABLE_K_UP();
GPIO_CLK_ENABLE_K0();
GPIO_CLK_ENABLE_K1();
/* 配置K_UP为下拉输入,K0和K1为上拉输入 */
GPIO_InitStructure.Mode = GPIO_MODE_INPUT; // 输入模式
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // GPIO速度
GPIO_InitStructure.Pin = GPIO_PIN_K_UP; // K_UP引脚
GPIO_InitStructure.Pull = GPIO_PULLDOWN; // 下拉模式
HAL_GPIO_Init(GPIO_PORT_K_UP, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_K0 | GPIO_PIN_K1; // K0和K1引脚
GPIO_InitStructure.Pull = GPIO_PULLUP; // 上拉模式
HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
}
/*
**********************************************************************************
* @brief 初始化按键驱动
* @param None
* @return None
* @note
**********************************************************************************
*/
void bsp_InitKey()
{
bsp_InitKeyHard();
}
/*
**********************************************************************************
* @brief 阻塞式按键扫描函数
* @param None
* @return 键值,如下
* K_UP按下返回3
* K0按下返回1
* K1按下返回2
* @note
**********************************************************************************
*/
uint8_t bsp_ScanKey()
{
uint8_t key_value = 0; // 键值
// K_UP按键检测
if(K_UP_NOW == 1)
{
bsp_DelayMs(20);
while(K_UP_NOW == 1);
bsp_DelayMs(20);
key_value = 3;
}
// K0按键检测
if(K0_NOW == 0)
{
bsp_DelayMs(20);
while(K0_NOW == 0);
bsp_DelayMs(20);
key_value = 1;
}
// K1按键检测
if(K1_NOW == 0)
{
bsp_DelayMs(20);
while(K1_NOW == 0);
bsp_DelayMs(20);
key_value = 2;
}
return key_value;
}
bsp_keys.h
文件
#ifndef __BSP_KEYS_H
#define __BSP_KEYS_H
/* private define */
#define HARD_KEY_NUM 3 // 实体按键个数
// 按键引脚定义
#define GPIO_CLK_ENABLE_K_UP() do{__HAL_RCC_GPIOA_CLK_ENABLE();}while(0)
#define GPIO_PORT_K_UP GPIOA
#define GPIO_PIN_K_UP GPIO_PIN_0
#define GPIO_CLK_ENABLE_K0() do{__HAL_RCC_GPIOE_CLK_ENABLE();}while(0)
#define GPIO_PORT_K0 GPIOE
#define GPIO_PIN_K0 GPIO_PIN_4
#define GPIO_CLK_ENABLE_K1() do{__HAL_RCC_GPIOE_CLK_ENABLE();}while(0)
#define GPIO_PORT_K1 GPIOE
#define GPIO_PIN_K1 GPIO_PIN_3
// 按键引脚当前电平
#define K_UP_NOW HAL_GPIO_ReadPin(GPIO_PORT_K_UP, GPIO_PIN_K_UP)
#define K0_NOW HAL_GPIO_ReadPin(GPIO_PORT_K0, GPIO_PIN_K0)
#define K1_NOW HAL_GPIO_ReadPin(GPIO_PORT_K1, GPIO_PIN_K1)
// 键值定义
#define PRES_K_UP 3
#define PRES_K0 1
#define PRES_K1 2
/* public statement */
void bsp_InitKey();
uint8_t bsp_ScanKey();
#endif
main.c
文件
#include "bsp.h"
/* public statement */
static void PrintInfo();
/* public define */
uint32_t key_num = 0;
int main()
{
bsp_Init();
//PrintInfo(); /* 打印开发板信息 */
while(1)
{
key_num = bsp_ScanKey();
if(key_num == 1)
{
bsp_LedToggle(1);
}
if(key_num == 2)
{
bsp_LedToggle(2);
}
if(key_num == 3)
{
bsp_LedToggle(1);
bsp_LedToggle(2);
}
}
}