GPIO輸入控制
阿新 • • 發佈:2018-12-12
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
}
}