zoukankan      html  css  js  c++  java
  • [SAM4N学习笔记]按键程序(查询方式)

    一、准备工作:

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

    二、程序编写:

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

    wps_clip_image-6583

    可以看出按键一边连接在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! ");

    while(1){

    if(Key_Scan()==0){

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

    UART0_SendString("USER_BUTTON 被按下! ");

      delay_ms(200);

    }

    delay_ms(100);

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

    }

    }

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

    wps_clip_image-30805

  • 相关阅读:
    UVALive
    HDU6405 Make ZYB Happy 广义sam
    企业级通用链表雏形
    数据结构与算法-递归的形象化理解
    Pictures & texts synthesiser
    全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别
    LINUX 目录文件结构
    测试
    maven 查找jar包的version
    web.xml文件的web-app标签体各版本的约束
  • 原文地址:https://www.cnblogs.com/xiaoming1989/p/3449550.html
Copyright © 2011-2022 走看看