1.硬件电路:
2.软件设计:
我们要实现按下按键LED灯的状态实现反转
1.GPIO
输⼊输出相关宏
![](https://img-blog.csdnimg.cn/ba5a924a708e495b90980b80bdbd908e.png)
2.设置按键所用的GPIO引脚为输入模式
//设置GPIO0引脚的功能为GPIO
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U,FUNC_GPIO0);
//设置GPIO为输入模式 禁止GPIO输出
GPIO_DIS_OUTPUT(GPIO_ID_PIN(0));
//禁止内部上拉
PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO0_U);
3.使用GPIO_INPUT_GET(引脚号)读取引脚的电平状态
GPIO_INPUT_GET(GPIO_ID_PIN(0));//读取引脚0的状态
3.程序的功能和源码:
程序功能:第一次按下LED点亮,再次按下LED熄灭.
程序源码:
//#include "ets_sys.h"
#include "user_config.h"//用户配置
#include "eagle_soc.h"//GPIO函数,宏定义
#include "c_types.h" //变量类型
#include "osapi.h" //系统函数
#include "user_interface.h"
/******************************************************************************
* FunctionName : user_rf_cal_sector_set
* Description : SDK just reversed 4 sectors, used for rf init data and paramters.
* We add this function to force users to set rf cal sector, since
* we don't know which sector is free in user's application.
* sector map for last several sectors : ABCCC
* A : rf cal
* B : rf init data
* C : sdk parameters
* Parameters : none
* Returns : rf cal sector
*******************************************************************************/
uint32 ICACHE_FLASH_ATTR
user_rf_cal_sector_set(void)
{
enum flash_size_map size_map = system_get_flash_size_map();
uint32 rf_cal_sec = 0;
switch (size_map) {
case FLASH_SIZE_4M_MAP_256_256:
rf_cal_sec = 128 - 5;
break;
case FLASH_SIZE_8M_MAP_512_512:
rf_cal_sec = 256 - 5;
break;
case FLASH_SIZE_16M_MAP_512_512:
rf_cal_sec = 512 - 5;
break;
case FLASH_SIZE_16M_MAP_1024_1024:
rf_cal_sec = 512 - 5;
break;
case FLASH_SIZE_32M_MAP_512_512:
rf_cal_sec = 1024 - 5;
break;
case FLASH_SIZE_32M_MAP_1024_1024:
rf_cal_sec = 1024 - 5;
break;
case FLASH_SIZE_64M_MAP_1024_1024:
rf_cal_sec = 2048 - 5;
break;
case FLASH_SIZE_128M_MAP_1024_1024:
rf_cal_sec = 4096 - 5;
break;
default:
rf_cal_sec = 0;
break;
}
return rf_cal_sec;
}
void ICACHE_FLASH_ATTR
user_rf_pre_init(void)
{
}
//毫秒延时函数
void ICACHE_FLASH_ATTR
delay_ms(u32 C_time)
{
for(;C_time>0;C_time--){
os_delay_us(1000);//1ms
}
}
//按键初始化
void KEY_GPIO_Init(void)
{
//设置GPIO0引脚的功能为GPIO
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U,FUNC_GPIO0);
//设置GPIO为输入模式 禁止GPIO输出
GPIO_DIS_OUTPUT(GPIO_ID_PIN(0));
//禁止内部上拉
PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO0_U);
}
//LED初始化
void LED_GPIO_Init(void)
{
//设置GPIO4引脚的功能为GPIO
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);
//默认输出为高点平
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
uint8_t ledflag=0;
//LED、KEY初始化
LED_GPIO_Init();
KEY_GPIO_Init();
//波特率=74880
os_printf("\r\nESP8266按键点灯\r\n");
while(1)
{
system_soft_wdt_feed();//喂狗
if(GPIO_INPUT_GET(GPIO_ID_PIN(0))==0 && (ledflag==0))
{
while(GPIO_INPUT_GET(GPIO_ID_PIN(0))==0);
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);
ledflag=1;
}
else if(GPIO_INPUT_GET(GPIO_ID_PIN(0))==0 &&(ledflag==1))
{
while(GPIO_INPUT_GET(GPIO_ID_PIN(0))==0);
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);
ledflag=0;
}
}
}