一、按键
记录学习使用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);}}
}