1. 程式人生 > >GPIO輸入控制

GPIO輸入控制

GPIO輸入暫存器

GPIO輸入暫存器GPIO_IN

在這裡插入圖片描述 BIT[15:0]輸入狀態位(可讀可寫):若對應的位為1,表示該IO的引腳狀態為高電平;若對應的位為低電平,表示該IO的引腳狀態為低電平。BIT[15:0]對應16個GPIO的輸入狀態位。

輸入相關巨集定義

GPIO_OUTPUT_SET(gpio_no, bit_value)

巨集名稱:GPIO_OUTPUT_SET(gpio_no, bit_value)
巨集功能:設定指定引腳(gpio_no)為指定電平(bit_value)
形參:
        gpio_no:指定的GPIO口
			可寫引數:GPIO_ID_PIN(n)//n的取值範圍為[15:0],對應的是GPIO[15:0]
		 bit_value:指定電平
		 	 可填引數:1 -- 高電平    0 -- 低電平
		 示例:GPIO_OUTPUT_SET(GPIO_ID_PIN(0),1);//設定GPIO0引腳為高電平

GPIO_DIS_OUTPUT(gpio_no)

巨集名稱:GPIO_DIS_OUTPUT(gpio_no)
巨集功能:設定指定引腳(gpio_no)為輸入模式
形參:
        gpio_no:指定的GPIO口
			可寫引數:GPIO_ID_PIN(n)//n的取值範圍為[15:0],對應的是GPIO[15:0]
示例:GPIO_DIS_OUTPUT(GPIO_ID_PIN(0));//設定GPIO0為輸入模式

GPIO_INPUT_GET(gpio_no)

巨集名稱:GPIO_INPUT_GET(gpio_no)
巨集功能:獲取指定引腳(gpio_no)的電平狀態
形參:
        gpio_no:指定的GPIO口
       		可寫引數:GPIO_ID_PIN(n)//n的取值範圍為[15:0],對應的是GPIO[15:0]
示例:GPIO_INPUT_GET(GPIO_ID_PIN(0));//獲取GPIO0的當前狀態

ESP8266輸入控制舉例

硬體連線圖

在這裡插入圖片描述 由原理圖可知:按鍵BOOT接到ESP8266模組的GPIO0引腳。由於GPIO0通過R3進行電源上拉,所以GPIO0預設為高電平狀態。當使能按鍵引腳之後,按下按鍵為低電平。

按鍵初始化程式碼

這裡的按鍵初始化程式碼使用多檔案程式設計。 1 新建驅動檔案key.c和key.h 我們為了不去修改工程裡面的makefile檔案,所以我們直接將key.c放置在app資料夾下的driver檔案裡面 在這裡插入圖片描述 在這裡插入圖片描述

在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 在這裡插入圖片描述 2 新增標頭檔案 在這裡插入圖片描述 在這裡插入圖片描述 3 配置IO口模式 在這裡插入圖片描述

4 原始碼

//key.c原始碼
#include "driver/key.h"

void KeyInitConfig(void)
{
	//1.設定按鍵所對應的GPIO0口為IO口模式 -- 詳見文件3.3.1.1章節
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);	// GPIO0設為IO口
	//2.由於GPIO0通過R3進行電源上拉,所以GPIO0預設為高電平狀態,在這裡要將內部拉高取消
	PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO0_U);
	//3.設定GPIO0引腳為輸入模式
	GPIO_DIS_OUTPUT(GPIO_ID_PIN(0));
}
//usrt_mian.c原始碼
void ICACHE_FLASH_ATTR user_init(void)
{
	system_soft_wdt_feed();//喂軟體看門狗,防止程式跑偏
	uart_init(9600, 9600);//設定串列埠波特率
	LedInitConfig();
	KeyInitConfig();
	os_printf("=============================================\r\n");
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n嵌入式陳工個人編輯資料\r\n未經本人同意請勿私自傳播\r\n");
	os_printf("\r\n按鍵控制測試程式碼\r\n");
	os_printf("\r\n帶看門狗\r\n");
	os_printf("=============================================\r\n");


	while (1)
	{
		if ((GPIO_INPUT_GET(GPIO_ID_PIN(0))) == 0)//檢測按鍵是否按下
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 0);//點亮LED
		else
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 1);//點亮LED
	}
}