实验现象:按下BOOT按键可控制LED状态翻转。
它主要定义了BOOT宏,用于获取 IO0的状态,并声明了key_init和key_scan函数,以便外部文件能够调用这些函数。
通过这些声明和定义,该文件为其他部分的代码提供了必要的接口和功能支持。
key.h
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
/* 引脚定义 */
#define BOOT_GPIO_PIN GPIO_NUM_0
/*IO操作*/
#define BOOT gpio_get_level(BOOT_GPIO_PIN)
/* 按键按下定义 */
#define BOOT_PRES 1 /* BOOT按键按下 */
/* 函数声明 */
void key_init(void); /* 初始化按键 */
uint8_t key_scan(uint8_t mode); /* 按键扫描函数 */
key.c
#include "key.h"
/**
* @brief 初始化按键
* @param 无
* @retval 无
*/
void key_init(void)
{
gpio_config_t gpio_init_struct;
gpio_init_struct.intr_type = GPIO_INTR_DISABLE; /* 失能引脚中断 */
gpio_init_struct.mode = GPIO_MODE_INPUT; /* 输入模式 */
gpio_init_struct.pull_up_en = GPIO_PULLUP_ENABLE; /* 使能上拉 */
gpio_init_struct.pull_down_en = GPIO_PULLDOWN_DISABLE; /* 失能下拉 */
gpio_init_struct.pin_bit_mask = 1ull << BOOT_GPIO_PIN; /* BOOT按键引脚 */
gpio_config(&gpio_init_struct); /* 配置使能 */
}
/**
* @brief 按键扫描函数
* @param mode:0 / 1, 具体含义如下:
* 0, 不支持连续按(当按键按下不放时, 只有第一次调用会返回键值,
* 必须松开以后, 再次按下才会返回其他键值)
* 1, 支持连续按(当按键按下不放时, 每次调用该函数都会返回键值)
* @retval 键值, 定义如下:
* BOOT_PRES, 1, BOOT按下
*/
uint8_t key_scan(uint8_t mode)
{
uint8_t keyval = 0;
static uint8_t key_boot = 1; /* 按键松开标志 */
if(mode)
{
key_boot = 1;
}
if (key_boot && (BOOT == 0)) /* 按键松开标志为1,且有任意一个按键按下了 */
{
vTaskDelay(10); /* 去抖动 */
key_boot = 0;
if (BOOT == 0)
{
keyval = BOOT_PRES;
}
}
else if (BOOT == 1)
{
key_boot = 1;
}
return keyval; /* 返回键值 */
}
main.c
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "nvs_flash.h"
#include "led.h"
#include "key.h"
/**
* @brief 程序入口
* @param 无
* @retval 无
*/
void app_main(void)
{
uint8_t key;
esp_err_t ret;
ret = nvs_flash_init(); /* 初始化NVS */
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
led_init(); /* 初始化LED */
key_init(); /* KEY初始化 */
while(1)
{
key = key_scan(0); /* 获取键值 */
switch (key)
{
case BOOT_PRES: /* BOOT被按下 */
{
LED_TOGGLE(); /* LED状态翻转 */
break;
}
default:
{
break;
}
}
vTaskDelay(10);
}
}
实验现象:按下BOOT按键可控制LED状态翻转。
它主要定义了BOOT宏,用于获取 IO0的状态,并声明了key_init和key_scan函数,以便外部文件能够调用这些函数。
通过这些声明和定义,该文件为其他部分的代码提供了必要的接口和功能支持。
key.h
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
/* 引脚定义 */
#define BOOT_GPIO_PIN GPIO_NUM_0
/*IO操作*/
#define BOOT gpio_get_level(BOOT_GPIO_PIN)
/* 按键按下定义 */
#define BOOT_PRES 1 /* BOOT按键按下 */
/* 函数声明 */
void key_init(void); /* 初始化按键 */
uint8_t key_scan(uint8_t mode); /* 按键扫描函数 */
key.c
#include "key.h"
/**
* @brief 初始化按键
* @param 无
* @retval 无
*/
void key_init(void)
{
gpio_config_t gpio_init_struct;
gpio_init_struct.intr_type = GPIO_INTR_DISABLE; /* 失能引脚中断 */
gpio_init_struct.mode = GPIO_MODE_INPUT; /* 输入模式 */
gpio_init_struct.pull_up_en = GPIO_PULLUP_ENABLE; /* 使能上拉 */
gpio_init_struct.pull_down_en = GPIO_PULLDOWN_DISABLE; /* 失能下拉 */
gpio_init_struct.pin_bit_mask = 1ull << BOOT_GPIO_PIN; /* BOOT按键引脚 */
gpio_config(&gpio_init_struct); /* 配置使能 */
}
/**
* @brief 按键扫描函数
* @param mode:0 / 1, 具体含义如下:
* 0, 不支持连续按(当按键按下不放时, 只有第一次调用会返回键值,
* 必须松开以后, 再次按下才会返回其他键值)
* 1, 支持连续按(当按键按下不放时, 每次调用该函数都会返回键值)
* @retval 键值, 定义如下:
* BOOT_PRES, 1, BOOT按下
*/
uint8_t key_scan(uint8_t mode)
{
uint8_t keyval = 0;
static uint8_t key_boot = 1; /* 按键松开标志 */
if(mode)
{
key_boot = 1;
}
if (key_boot && (BOOT == 0)) /* 按键松开标志为1,且有任意一个按键按下了 */
{
vTaskDelay(10); /* 去抖动 */
key_boot = 0;
if (BOOT == 0)
{
keyval = BOOT_PRES;
}
}
else if (BOOT == 1)
{
key_boot = 1;
}
return keyval; /* 返回键值 */
}
main.c
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "nvs_flash.h"
#include "led.h"
#include "key.h"
/**
* @brief 程序入口
* @param 无
* @retval 无
*/
void app_main(void)
{
uint8_t key;
esp_err_t ret;
ret = nvs_flash_init(); /* 初始化NVS */
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
led_init(); /* 初始化LED */
key_init(); /* KEY初始化 */
while(1)
{
key = key_scan(0); /* 获取键值 */
switch (key)
{
case BOOT_PRES: /* BOOT被按下 */
{
LED_TOGGLE(); /* LED状态翻转 */
break;
}
default:
{
break;
}
}
vTaskDelay(10);
}
}
每一个童年的梦想都值得用青春去捍卫!