按鍵檢測GPIO輸入
阿新 • • 發佈:2021-10-20
1. 專案
通過按鍵控制開關LED燈,按下按鍵燈亮,再按一下燈滅。
2. 程式碼
mian.c
#include "stm32f10x.h" //相當於51微控制器中的 #include <reg51.h> #include "bsp_key.h" #include "bsp_led.h" void Delay(uint32_t count) { for(; count!=0; count--); } int main(void) { //來到這裡是,系統的時鐘已經被配置到72MHz了 LED_GPIO_Config(); KEY_GPIO_Config(); //初始化KEY函式 while(1) { if(Key_Scan(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == KEY_ON) { LED_R_TOGGLE; } } }
bsp_key.c
#include "bsp_key.h" void KEY_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStruct); } uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) { if (GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON ) { //鬆手檢測 while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON); return KEY_ON; } else return KEY_OFF; }
bsp_key.h
#ifndef __bsp_key_h #define __bsp_key_h #include "stm32f10x.h" #define KEY_ON 1 #define KEY_OFF 0 #define KEY2_GPIO_PIN GPIO_Pin_13 #define KEY2_GPIO_PORT GPIOC #define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC void KEY_GPIO_Config(void); uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin); #endif/*__bsp_key_h*/
bsp_led.c
#include "bsp_led.h" void LED_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Pin = LED_R_GPIO_PIN; GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStruct); }
bsp_led.h
//標頭檔案 #ifndef __bsp_led_h #define __bsp_led_h #include "stm32f10x.h" #define LED_R_GPIO_PIN GPIO_Pin_5 #define LED_R_GPIO_PORT GPIOB #define LED_R_GPIO_CLK RCC_APB2Periph_GPIOB #define ON 1 #define OFF 0 // \C語言續行符,後面不能有任何東西 #define LED_R(a); if (a) \ GPIO_SetBits(LED_R_GPIO_PORT,LED_R_GPIO_PIN);\ else GPIO_ResetBits(LED_R_GPIO_PORT,LED_R_GPIO_PIN); //C語言中的二進位制運算子 //與1異或改變,與0異或不變 #define LED_R_TOGGLE {LED_R_GPIO_PORT->ODR ^= LED_R_GPIO_PIN;} void LED_GPIO_Config(void); #endif /*__bsp_led._h*/
3. 參考資料
- 原理圖
- 程式設計要點
a.使能 GPIO 埠時鐘;
b. 初始化 GPIO 目標引腳為輸入模式 (浮空輸入);
c. 編寫簡單測試程式,檢測按鍵的狀態,實現按鍵控制 LED 燈。
- 函式執行流程
- (1) 使用 GPIO_InitTypeDef 定義 GPIO 初始化結構體變數,以便下面用於儲存 GPIO 配置。
- (2) 呼叫庫函式 RCC_APB2PeriphClockCmd 來使能按鍵的 GPIO 埠時鐘,呼叫時我們使用“|”操作同時配置兩個按鍵的時鐘。
- (3) 向 GPIO 初始化結構體賦值,把引腳初始化成浮空輸入模式,其中的 GPIO_Pin 使用巨集“KEYx_GPIO_PIN”來賦值,使函式的實現方便移植。由於引腳的預設電平受按鍵電路影響,所以設定成浮空輸入。
- (4) 使用以上初始化結構體的配置,呼叫 GPIO_Init 函式向暫存器寫入引數,完成 GPIO 的初始化,這裡的 GPIO 埠使用“KEYx_GPIO_PORT”巨集來賦值,也是為了程式移植方便。
- (5) 使用同樣的初始化結構體,只修改控制的引腳和埠,初始化其它按鍵檢測時使用的 GPIO引腳。