128 lines
4.2 KiB
C
128 lines
4.2 KiB
C
/**
|
|
****************************************************************************************************
|
|
* @file key.c
|
|
* @author 正点原子团队(ALIENTEK)
|
|
* @version V1.0
|
|
* @date 2021-10-14
|
|
* @brief 按键输入 驱动代码
|
|
* @license Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
|
|
****************************************************************************************************
|
|
* @attention
|
|
*
|
|
* 实验平台:正点原子 探索者 F407开发板
|
|
* 在线视频:www.yuanzige.com
|
|
* 技术论坛:www.openedv.com
|
|
* 公司网址:www.alientek.com
|
|
* 购买地址:openedv.taobao.com
|
|
*
|
|
* 修改说明
|
|
* V1.0 20211014
|
|
* 第一次发布
|
|
*
|
|
****************************************************************************************************
|
|
*/
|
|
|
|
#include "./BSP/KEY/key.h"
|
|
#include "./SYSTEM/delay/delay.h"
|
|
|
|
|
|
/**
|
|
* @brief 按键初始化函数
|
|
* @param 无
|
|
* @retval 无
|
|
*/
|
|
void key_init(void)
|
|
{
|
|
GPIO_InitTypeDef gpio_init_struct; /* GPIO配置参数存储变量 */
|
|
KEY0_GPIO_CLK_ENABLE(); /* KEY0时钟使能 */
|
|
KEY1_GPIO_CLK_ENABLE(); /* KEY1时钟使能 */
|
|
KEY2_GPIO_CLK_ENABLE(); /* KEY2时钟使能 */
|
|
WKUP_GPIO_CLK_ENABLE(); /* WKUP时钟使能 */
|
|
|
|
gpio_init_struct.Pin = KEY0_GPIO_PIN; /* KEY0引脚 */
|
|
gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输入 */
|
|
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
|
|
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
|
|
HAL_GPIO_Init(KEY0_GPIO_PORT, &gpio_init_struct); /* KEY0引脚模式设置,上拉输入 */
|
|
|
|
gpio_init_struct.Pin = KEY1_GPIO_PIN; /* KEY1引脚 */
|
|
gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输入 */
|
|
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
|
|
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
|
|
HAL_GPIO_Init(KEY1_GPIO_PORT, &gpio_init_struct); /* KEY1引脚模式设置,上拉输入 */
|
|
|
|
gpio_init_struct.Pin = KEY2_GPIO_PIN; /* KEY2引脚 */
|
|
gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输入 */
|
|
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
|
|
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
|
|
HAL_GPIO_Init(KEY2_GPIO_PORT, &gpio_init_struct); /* KEY2引脚模式设置,上拉输入 */
|
|
|
|
gpio_init_struct.Pin = WKUP_GPIO_PIN; /* WKUP引脚 */
|
|
gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输入 */
|
|
gpio_init_struct.Pull = GPIO_PULLDOWN; /* 下拉 */
|
|
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
|
|
HAL_GPIO_Init(WKUP_GPIO_PORT, &gpio_init_struct); /* WKUP引脚模式设置,下拉输入 */
|
|
|
|
}
|
|
|
|
/**
|
|
* @brief 按键扫描函数
|
|
* @note 该函数有响应优先级(同时按下多个按键): WK_UP > KEY2 > KEY1 > KEY0!!
|
|
* @param mode:0 / 1, 具体含义如下:
|
|
* @arg 0, 不支持连续按(当按键按下不放时, 只有第一次调用会返回键值,
|
|
* 必须松开以后, 再次按下才会返回其他键值)
|
|
* @arg 1, 支持连续按(当按键按下不放时, 每次调用该函数都会返回键值)
|
|
* @retval 键值, 定义如下:
|
|
* KEY0_PRES, 1, KEY0按下
|
|
* KEY1_PRES, 2, KEY1按下
|
|
* KEY2_PRES, 3, KEY2按下
|
|
* WKUP_PRES, 4, WKUP按下
|
|
*/
|
|
uint8_t key_scan(uint8_t mode)
|
|
{
|
|
static uint8_t key_up = 1; /* 按键按松开标志 */
|
|
uint8_t keyval = 0;
|
|
|
|
if (mode) key_up = 1; /* 支持连按 */
|
|
|
|
if (key_up && (KEY0 == 0 || KEY1 == 0 || KEY2 == 0 || WK_UP == 1)) /* 按键松开标志为1, 且有任意一个按键按下了 */
|
|
{
|
|
delay_ms(10); /* 去抖动 */
|
|
key_up = 0;
|
|
|
|
if (KEY0 == 0) keyval = KEY0_PRES;
|
|
|
|
if (KEY1 == 0) keyval = KEY1_PRES;
|
|
|
|
if (KEY2 == 0) keyval = KEY2_PRES;
|
|
|
|
if (WK_UP == 1) keyval = WKUP_PRES;
|
|
}
|
|
else if (KEY0 == 1 && KEY1 == 1 && KEY2 == 1 && WK_UP == 0) /* 没有任何按键按下, 标记按键松开 */
|
|
{
|
|
key_up = 1;
|
|
}
|
|
|
|
return keyval; /* 返回键值 */
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|