查看: 2552|回复: 1

SAM4N试用之按键程序(查询方式)

[复制链接]
  • TA的每日心情
    奋斗
    2015-1-22 18:04
  • 签到天数: 189 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-10-27 22:17:55 | 显示全部楼层 |阅读模式
    分享到:
    一、准备工作:
         将上一节搭建的工程复制一份,命名为“5.key scanf”。这一节主要讲如何使用SAM4NGPIO输入功能,实现按键的输入。
    二、程序编写:
         这个程序比较简单,主要实现查询按键的输入状态,首先打开原理图,按键电路如下:
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-25863.png 图片1.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的时钟,接着使能PIOA30GPIO功能,然后禁止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会亮一下。
    图片2.png

    5.按键例程(查询方式).pdf (126.74 KB, 下载次数: 7)
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-7-16 09:10
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-10-28 08:28:58 | 显示全部楼层
    狂赞中。。。。。。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-21 11:00 , Processed in 0.129973 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.