stm32學習筆記——按鍵(掃描法)
stm32學習筆記——按鍵(掃描法)
目的:利用掃描IO口的方式直接操作按鍵
配置檔案:#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
暫存器、結構體定義以及庫函式參看流水燈一節
程式程式碼分析:(程式碼出自FIRE)
Led.c檔案再次不在敘述,參看流水燈一節
重點分析key.c檔案,其基本結構如下:
1、按鍵io口初始化,這裡有兩個按鍵key1和key2,初始化過程完全相同
void Key1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定義GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//開GPIO時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //選中IO口標號
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //配置IO口速度
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);//利用初始化庫函式初始化GPIO
}
2、掃描按鍵
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,u16 GPIO_Pin)//該函式將返回一個
{
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ); //利用單個位讀取函式讀取按鍵的值
{
Key_Delay(10000); //延時,消抖
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) //再次確認按鍵按下
{
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);//等待按鍵釋放
return KEY_ON;
}
else
return KEY_OFF;
}
else
return KEY_OFF;
}
其中有兩個巨集定義
#define KEY_ON 0
#define KEY_OFF 1
3、按鍵按下後的執行函式:按鍵按下後需要執行相應的操作,所以要列寫此函式
void Key_Test(void)
{
LED_GPIO_Config();
LED1_ON;
LED2_ON;
/*config key*/
Key1_GPIO_Config();//呼叫按鍵GPIO初始化函式
Key2_GPIO_Config();
while(1)
{
if( Key_Scan(GPIOA,GPIO_Pin_0) == KEY_ON ) // KEY1
{
LED1_TOGGLE;
}
if( Key_Scan(GPIOC,GPIO_Pin_13) == KEY_ON ) // KEY2
{
LED2_TOGGLE;
}
}
}
其中操作LED燈的幾個函式參看流水燈一節
小總結:1、在寫key.c檔案時,除了包含自己的key.h檔案,還要包含led.h檔案才能呼叫 流水燈函式。
2、主函式還要包含上述兩個標頭檔案
3、延時函式
static void Key_Delay(__IO u32 nCount)
{
for(; nCount != 0; nCount--);
}
注意函式中static 和__IO的巨集定義為volatile,傳入引數為無符號32位int型變數