一、准备工作: 将上一节搭建的工程复制一份,命名为“5.key scanf”。这一节主要讲如何使用SAM4N的GPIO输入功能,实现按键的输入。 二、程序编写: 这个程序比较简单,主要实现查询按键的输入状态,首先打开原理图,按键电路如下: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-25863.png
可以看出按键一边连接在PA30上面,一边连接到GND,当按下按键时,PA30管脚的电平会被拉低。 首先要去配置按键为上拉输入。 #define USER_BUTTON (0x01UL<<30) /************************************************************ *函数名: Key_GPIO_Config() *参 数 :void *返回值:void *功 能 :按键GPIO的初始化函数,使用按键前必须先调用此函数进行初始化 *************************************************************/ 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); } } |