[SAM4N學習筆記]按鍵程序(查詢方式)

1、準備工做:

     將上一節搭建的工程複製一份,命名爲「5.key scanf」。這一節主要講如何使用SAM4N的GPIO輸入功能,實現按鍵的輸入。函數

2、程序編寫:

     這個程序比較簡單,主要實現查詢按鍵的輸入狀態,首先打開原理圖,按鍵電路以下:ui

wps_clip_image-6583

能夠看出按鍵一邊鏈接在PA30上面,一邊鏈接到GND,當按下按鍵時,PA30管腳的電平會被拉低。this

首先要去配置按鍵爲上拉輸入。blog

#define USER_BUTTON (0x01UL<<30)ip

/************************************************************get

*函數名: Key_GPIO_Config()it

*參 數 :voidtest

*返回值:void原理

*功 能 :按鍵GPIO的初始化函數,使用按鍵前必須先調用此函數進行初始化cli

*************************************************************/

void Key_GPIO_Config(void)

{

/*禁止外設管理控制寄存器(PMC)寫保護*/

  PMC->PMC_WPMR = 0x504D4300;

    /*使能PIOA時鐘*/

  PMC->PMC_PCER0 = (1UL << ID_PIOA); 

/*使能外設管理控制寄存器(PMC)寫保護*/

  PMC->PMC_WPMR = 0x504D4301; 

  /*使能USER_BUTTON管腳,對應爲PA30*/

PIOA->PIO_PER=(USER_BUTTON);

/*禁止USER_BUTTON管腳*/

PIOA->PIO_ODR=(USER_BUTTON);

/*使能USER_BUTTON管腳的上拉電阻,設置爲上拉*/

PIOA->PIO_PUER=(USER_BUTTON);

}

   第一步,打開PIOA的時鐘,接着使能PIOA30的GPIO功能,而後禁止PIOA30的輸出,只做爲輸入功能,接着使能PIOA30的上拉電阻。這樣初始化就完成了。

   接着要寫一個查詢按鍵狀態的函數,以下:

   /***************************************************************

*函數名: Key_Scan()

*參數  :void

*返回值:uint8_t  返回0爲按下,1爲沒按下

*功能:按鍵GPIO的初始化函數,使用按鍵前必須先調用此函數進行初始化

*************************************************************/

uint8_t  Key_Scan(void)

{

if(0==(PIOA->PIO_PDSR&USER_BUTTON)) //判斷按鍵是否被按下

{

delay_ms(10);          //若是是,延時進行按鍵軟件消抖

if(0==(PIOA->PIO_PDSR&USER_BUTTON))          //再次判斷是不是按下

{

               //若是是,等待按鍵鬆開

while(0==(PIOA->PIO_PDSR&USER_BUTTON));

return 0;

}

return 1;

  }

}

  首先是去讀取PIO_PDSR寄存器,獲得PIOA當前的管腳狀態,判斷PIOA30是否爲低電平,若是爲低電平則延時消抖,再次判斷是否爲低電平,若是仍是爲低電平則判斷按鍵按下有效,等待按鍵鬆開。

在main函數中只要定時的去檢查這個按鍵狀態便可:

  int main(void)

{

systick_hw_init();

led_hw_init();

UART0_Init(115200);

Key_GPIO_Config();

UART0_SendString("this is a key test demo!\r\n");

while(1){

if(Key_Scan()==0){

PIOB->PIO_CODR=(0x01<<LED0_PIN);

UART0_SendString("USER_BUTTON 被按下!\r\n");

  delay_ms(200);

}

delay_ms(100);

  PIOB->PIO_SODR=(0x01<<LED0_PIN);

}

}

   當按下按鍵時,會打印一個按下的信息到串口,同時LED會亮一下。

wps_clip_image-30805

相關文章
相關標籤/搜索