一板网
发表于: 2015-6-3 13:18:39 | 显示全部楼层

一、准备工作:


将上一节搭建的工程复制一份,命名为“5.key scanf”。这一节主要讲如何使用SAM4N的GPIO输入功能,实现按键的输入。


二、程序编写:     

这个程序比较简单,主要实现查询按键的输入状态,首先打开原理图,按键电路如下:

29143801-518fe2df707046ec8638def48bd7ff83.png


可以看出按键一边连接在PA30上面,一边连接到GND,当按下按键时,PA30管脚的电平会被拉低。


首先要去配置按键为上拉输入。



  1. #define USER_BUTTON (0x01UL<<30)

  2. /************************************************************

  3. *函数名: Key_GPIO_Config()

  4. *参 数 :void

  5. *返回值:void

  6. *功 能 :按键GPIO的初始化函数,使用按键前必须先调用此函数进行初始化

  7. *************************************************************/

  8. void Key_GPIO_Config(void)

  9. {

  10. /*禁止外设管理控制寄存器(PMC)写保护*/

  11.   PMC->PMC_WPMR = 0x504D4300;

  12.     /*使能PIOA时钟*/

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

  14. /*使能外设管理控制寄存器(PMC)写保护*/

  15.   PMC->PMC_WPMR = 0x504D4301;

  16.   /*使能USER_BUTTON管脚,对应为PA30*/

  17. PIOA->PIO_PER=(USER_BUTTON);

  18. /*禁止USER_BUTTON管脚*/

  19. PIOA->PIO_ODR=(USER_BUTTON);

  20. /*使能USER_BUTTON管脚的上拉电阻,设置为上拉*/

  21. PIOA->PIO_PUER=(USER_BUTTON);

  22. }
复制代码

   

第一步,打开PIOA的时钟,接着使能PIOA30的GPIO功能,然后禁止PIOA30的输出,只作为输入功能,接着使能PIOA30的上拉电阻。这样初始化就完成了。

接着要写一个查询按键状态的函数,如下:




  1.    /***************************************************************

  2. *函数名: Key_Scan()

  3. *参数  :void

  4. *返回值:uint8_t  返回0为按下,1为没按下

  5. *功能:按键GPIO的初始化函数,使用按键前必须先调用此函数进行初始化

  6. *************************************************************/

  7. uint8_t  Key_Scan(void)

  8. {

  9. if(0==(PIOA->PIO_PDSR&USER_BUTTON)) //判断按键是否被按下

  10. {

  11. delay_ms(10);          //如果是,延时进行按键软件消抖

  12. if(0==(PIOA->PIO_PDSR&USER_BUTTON))          //再次判断是否是按下

  13. {

  14.                //如果是,等待按键松开

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

  16. return 0;

  17. }

  18. return 1;

  19.   }

  20. }
复制代码


  

首先是去读取PIO_PDSR寄存器,得到PIOA当前的管脚状态,判断PIOA30是否为低电平,如果为低电平则延时消抖,再次判断是否为低电平,如果还是为低电平则判断按键按下有效,等待按键松开。


在main函数中只要定时的去检查这个按键状态即可:



  1.   int main(void)

  2. {

  3. systick_hw_init();

  4. led_hw_init();

  5. UART0_Init(115200);

  6. Key_GPIO_Config();

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

  8. while(1){

  9. if(Key_Scan()==0){

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

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

  12.   delay_ms(200);

  13. }

  14. delay_ms(100);

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

  16. }

  17. }
复制代码

当按下按键时,会打印一个按下的信息到串口,同时LED会亮一下。


29143802-ef8e40e000c54867a6da814be263df06.png



跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 28 | 回复: 31



手机版|

GMT+8, 2024-4-29 18:11 , Processed in 0.053309 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表