STM32按鍵的檢測

STM32的按鍵檢測相對比較簡單,首先按部就班的初始化連接的到的i/o,然後寫一個按鍵掃描函數,這個和51單片機的差不多。

以下是一個比較典型的例子:

利用按鍵控制LED:

key.h文件

#ifndef__KEY_H

#define__KEY_H 

#include"sys.h“

#defineKEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//讀取按鍵0

#defineKEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//讀取按鍵1

#defineKEY2  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//讀取按鍵2

#defineKEY3  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//讀取按鍵3(WK_UP)

#defineKEY_UP   4

#defineKEY_LEFT  3

#defineKEY_DOWN  2

#defineKEY_RIGHT  1

void KEY_Init(void);//IO初始化

u8 KEY_Scan(u8);    //按鍵掃描函數     

#endif

key.c文件

void KEY_Init(void)//IO初始化

{

    GPIO_InitTypeDef GPIO_InitStructure;

    //初始化KEY0-->GPIOA.13,KEY1-->GPIOA.15  上拉輸入

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能時鐘

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//PE2~4

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設置成上拉輸入

    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;初始化 WK_UP-->GPIOA.0    下拉輸入

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//PA0設置成輸入,默認下拉   

    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0

}

u8 KEY_Scan(u8mode)

{  static u8 key_up=1;//按鍵按鬆開標誌

  if(mode)key_up=1; //支持連按   

  if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))

  {

  delay_ms(10);//去抖動

  key_up=0;

  if(KEY0==0)return KEY_RIGHT;

  else if(KEY1==0)return KEY_DOWN;

  else if(KEY2==0)return KEY_LEFT;

  else if(KEY3==1)return KEY_UP;

  }elseif(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;       

   return0;// 無按鍵按下

}

main.c文件

 int main(void)

 {

     u8 t;

    delay_init();         //延時函數初始化   

     LED_Init();                             //LED端口初始化

     KEY_Init();                             //初始化與按鍵連接的硬件接口

     BEEP_Init();           //初始化蜂鳴器端口

     LED0=0;  //先點亮紅燈

      while(1) {

   t=KEY_Scan(0);  //得到鍵值

                           if(t){    

     switch(t) { 

   caseKEY_UP:  //控制蜂鳴器

         BEEP=!BEEP;

        break;

   caseKEY_LEFT: //控制LED0翻轉

          LED0=!LED0;

         break;

   caseKEY_DOWN:  //控制LED1翻轉 

          LED1=!LED1;

          break;

    caseKEY_RIGHT:  //同時控制LED0,LED1翻轉

          LED0=!LED0;

         LED1=!LED1;

         break;

  }

                }else delay_ms(10);

                    } 

 }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章