1. 程式人生 > 其它 >按鍵檢測GPIO輸入

按鍵檢測GPIO輸入

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引腳。