[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

相关文章
相关标签/搜索