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

  • 相关阅读:
    Dot Net WinForm 控件开发 (七) 为属性提下拉式属性编辑器
    WinForm 程序的界面多语言切换
    c#遍历HashTable
    Dot Net WinForm 控件开发 (三) 自定义类型的属性需要自定义类型转换器
    Dot Net WinForm 控件开发 (六) 为属性提供弹出式编辑对话框
    Dot Net WinForm 控件开发 (一) 写一个最简单的控件
    Dot Net WinForm 控件开发 (四) 设置属性的默认值
    Dot Net WinForm 控件开发 (二) 给控件来点描述信息
    Dot Net WinForm 控件开发 (八) 调试控件的设计时行为
    Dot Net WinForm 控件开发 (五) 复杂属性的子属性
  • 原文地址:https://www.cnblogs.com/xiaoming1989/p/3449550.html
Copyright © 2011-2022 走看看