一、准备工作:

     将上一节搭建的工程复制一份,命名为“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会亮一下。

[SAM4N学习笔记]按键程序(查询方式)的更多相关文章

  1. [SAM4N学习笔记]按键程序(中断方式)

    一.准备工作:      将上一节搭建的工程复制一份,命名为"6.key interrupt".这一节主要讲如何使用SAM4N的GPIO中断功能,实现按键的中断输入. 二.程序编写 ...

  2. NHibernate3.2学习笔记-几种查询方式

    一.开发环境 数据库:SQLServer2008 编译器:VS2010 .Net版本:.Net Framework 4.0 二.开发过程 1.项目结构 承接上一篇 2.执行sql语句 (1)基本语法 ...

  3. mybatis学习笔记(10)-一对一查询

    mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...

  4. MyBatis:学习笔记(3)——关联查询

    MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...

  5. SQLServer学习笔记<>相关子查询及复杂查询

    二.查询缺少值的查询 在这里我们加入要查询2008年每一天的订单有多少?首先我们可以查询下订单表的订单日期在2008年的所有订单信息. 1 select distinct orderdate,coun ...

  6. Entity Framework学习笔记(四)----Linq查询(1)

    请注明转载地址:http://www.cnblogs.com/arhat 从本章开始,老魏就介绍一下Entity Framework使用Linq来查询数据,也就是Linq To Entity.其实在E ...

  7. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  8. [Golang学习笔记] 04 程序实体1 变量声明

    变量声明: Go语言的程序实体包含:变量.常量.函数.结构体和接口,是一门静态类型的编程语言. (在声明变量或常量的时候,需要指定类型,或者给予足够信息是的Go语言能够推导出类型) Go语言变量的类型 ...

  9. [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?

    [译]聊聊C#中的泛型的使用(新手勿入)   写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发 ...

随机推荐

  1. 九度OJ 1468 Sharing -- 哈希

    题目地址:http://ac.jobdu.com/problem.php?pid=1468 题目描述: To store English words, one method is to use lin ...

  2. 九度OJ 1434 今年暑假不AC

    题目地址:http://ac.jobdu.com/problem.php?pid=1434 题目描述: “今年暑假不AC?”“是的.”“那你干什么呢?”“看世界杯呀,笨蛋!”“@#$%^&*% ...

  3. mongodb 安装及,设置账户、主从

    我原来没用过mongodb ,在晚上查了查需要的命令,关于怎么mongodb怎么用,我就不知道了 官方网站: http://www.mongodb.org/ MongoDB 安裝,主从配置一 Mong ...

  4. php中文编码

    header("Content-type: text/html; charset=utf-8"); header('Location: http://www.example.com ...

  5. Python Tips and Traps(一)

    1.如果想得到一个列表的index和内容,可以通过enumerate快速实现 drinks = ['coffee','tea', 'milk', 'water'] for index, drink i ...

  6. visual studio 生成后事件 Post-Build Event

    提出问题:我们的解决方案中有两个可执行程序,主程序运行后,会通过process.start()打开多个子程序.调用process.start的时候,需要指定子程序的可执行路径,把子程序的可执行程序放到 ...

  7. IOS多线程之NSThread

    参考:http://blog.csdn.net/totogo2010/article/details/8010231 1 简介 NSThread: 优点:NSThread 比其他两个轻量级 缺点:需要 ...

  8. VS2010升级VS2012必备(MVC4 WebPage2.0 Razor2.0资料汇集)

    刚把项目升级到2012,发现发生了很多变化,以下是最近看过的网站和资料汇集,供需要者参考. 本文在最近一个月可能会不断更新. Razor2.0 新特性介绍: 介绍1:http://vibrantcod ...

  9. APP 如何适应 iPhone 5s/6/6Plus 三种屏幕的尺寸

    初代iPhone 2007年,初代iPhone发布,屏幕的宽高是 320 x 480 像素.下文也是按照宽度,高度的顺序排列.这个分辨率一直到iPhone 3GS也保持不变. 那时编写iOS的App( ...

  10. [BZOJ 3530] [Sdoi2014] 数数 【AC自动机+DP】

    题目链接:BZOJ - 3530 题目分析 明显是 AC自动机+DP,外加数位统计. WZY 神犇出的良心省选题,然而去年我太弱..比现在还要弱得多.. 其实现在做这道题,我自己也没想出完整解法.. ...