1. 程式人生 > >stm32學習筆記——按鍵(掃描法)

stm32學習筆記——按鍵(掃描法)

stm32學習筆記——按鍵(掃描法)

目的:利用掃描IO口的方式直接操作按鍵

配置檔案:#include "stm32f10x_gpio.h" 

  #include "stm32f10x_rcc.h" 

暫存器、結構體定義以及庫函式參看流水燈一節

程式程式碼分析:(程式碼出自FIRE

Led.c檔案再次不在敘述,參看流水燈一節

重點分析key.c檔案,其基本結構如下:

1、按鍵io口初始化,這裡有兩個按鍵key1key2,初始化過程完全相同

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)//該函式將返回一個

unsigned char型變數,輸入引數為GPIO暫存器結構體(字母),和GPIO埠號(數字)

{

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,傳入引數為無符號32int型變數