|
一、准备工作:
将上一节搭建的工程复制一份,命名为“5.key scanf”。这一节主要讲如何使用SAM4N的GPIO输入功能,实现按键的输入。
二、程序编写:
这个程序比较简单,主要实现查询按键的输入状态,首先打开原理图,按键电路如下:
可以看出按键一边连接在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);
- }
- }
复制代码
当按下按键时,会打印一个按下的信息到串口,同时LED会亮一下。
|