内容简介
本实验是在ESP8266入门学习之使用软件定时器控制LED闪烁实验基础上进行的
实验内容:
- 使用软件定时器创建按键key扫描定时回调函数;
- 按键key短按一次,led状态变化一次(点亮或熄灭);
实验目的:
- 学习GPIO做输入控制;
硬件原理
使用MTCK引脚做输出引脚,低电平有效。MTCK引脚的Function4即做GPIO13。
软件原理
添加user_key文件
1、添加user_key.c文件,鼠标右击IoT_Demo\user,选择New->Source File;
2、添加user_key.h文件,鼠标右击IoT_Demo\include,选择New->Header File;
程序分析
MTCK引脚的Function4即做GPIO13。
程序编辑
/*
* key.h
*
* Created on: 2021年2月3日
* Author: Administrator
*/
#ifndef IOT_DEMO_INCLUDE_USER_KEY_H_
#define IOT_DEMO_INCLUDE_USER_KEY_H_
#include "gpio.h"
#define KEY_IO_MUX PERIPHS_IO_MUX_MTCK_U
#define KEY_IO_NUM 13
#define KEY_IO_FUNC FUNC_GPIO13
#define KEY_GET_LEVEL GPIO_INPUT_GET(GPIO_ID_PIN(KEY_IO_NUM))
void user_key_init(void);
#endif /* IOT_DEMO_INCLUDE_USER_KEY_H_ */
/*
* key.c
*
* Created on: 2021年2月3日
* Author: Administrator
*/
#include "osapi.h"
#include "os_type.h"
#include "led.h"
#include "user_key.h"
os_timer_t os_timer_key_scan; /*定义软件定时器句柄*/
/******************************************************************************
* FunctionName : key_scan
* Description :
* Parameters : none
* Returns : none
*******************************************************************************/
LOCAL void ICACHE_FLASH_ATTR
user_key_scan(void)
{
static bool flag = 0; /*消抖*/
static bool leve = 1; /*每次按键只做一次LED电平翻转*/
static bool stat = 0; /*长按电平只变化一次,松手后才能按下一次*/
if(KEY_GET_LEVEL == 0)
{
if((KEY_GET_LEVEL == 0)&&(flag == 1)&&(stat == 0))
{
stat = 1;
leve = !leve;
GPIO_OUTPUT_SET(GPIO_ID_PIN(LED_IO_NUM), leve);
}
flag = 1;
}
else
{
flag = 0;
stat = 0;
}
}
/******************************************************************************
* FunctionName : key_init
* Description : key 引脚及软件定时器初始化
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_key_init(void)
{
PIN_FUNC_SELECT(KEY_IO_MUX, KEY_IO_FUNC); /*选择key引脚*/
PIN_PULLUP_EN(KEY_IO_MUX); /*使能上拉*/
GPIO_DIS_OUTPUT(GPIO_ID_PIN(KEY_IO_NUM)); /*初始化引脚为输出*/
os_timer_disarm(&os_timer_key_scan);
os_timer_setfn(&os_timer_key_scan,(os_timer_func_t *)user_key_scan,NULL);
os_timer_arm(&os_timer_key_scan,10,1); /**周期为10ms/
}
程序下载
下载程序后观察现象