3131|12

1291

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

非中断的按键模式 [复制链接]

本帖最后由 强仔00001 于 2015-6-10 00:25 编辑

上次分享到点亮板子的LED,今天来点高级些的。用板子上的按键控制LED的亮灭。现在这次是用非中断模式的方法,很简单粗暴的方法,就是直接检测IO口的电平状态。当然在这之前要把按键的IO设置为输入。然后就是在死循环里检测按键是否按下,一旦按下IO就会被拉低,if((P1IN & GPIO_PIN4) == 0)这语句就是检测P1.4口是否按下,一旦按下就为低电平,进入下面的处理程序,在最后还加上了个松手检测,程序很简单,当然这个程序只能作为学习用的,实际项目中还有很大的改进。
  这次用到的寄存器不是很多。主要用到PxINPxOUTPxRENPxDIR4个即可,PxDIR用来设置管脚的方向。如下图的说明很明白了。
   如下例子就是把P1.1P1.4设置为输入:P1DIR |= 0x01;//设定P1.0为输出

然后就是把按键的IO口设置为上拉,为啥要上拉呢??因为板子的按键直接是连接到单片机的IO口的,如下图:
   把他设置成上拉是为了降低外界干扰到这个IO的得到的电平状态,而且这样也规定了不按下按键时的电平为高。这个上拉寄存器配置很简单,写1就是上拉。如下图:
  这里大家要注意一点,PxREN这个寄存器只能控制IO口带上拉或者下拉这两种情况的。具体是上拉还是下拉,还要靠PxOUT这个寄存器控制,详细如下图:
  所以当PxOUT = 1PxREN= 1PxDIR= 0IO口即设置为输入上拉,当PxOUT = 0PxREN= 1PxDIR= 0IO口设置为输入下拉模式。
  1. #include "msp.h"                        // Device header
  2. #include "driverlib.h"
  3. int main()
  4. {
  5.         volatile uint32_t i;
  6.         
  7.     // Stop watchdog timer
  8.     WDT_A_hold(WDT_A_BASE);

  9.                 P1DIR |= 0x01;//设定P1.0为输出
  10.          
  11.                 P1SEL0 &= ~0x12;
  12.           P1SEL1 &= ~0x12;
  13.           P1DIR  &= ~0x12;
  14.                 P1REN |= 0x12;
  15.                 P1OUT |= 0x12;

  16.     while(1)
  17.     {

  18.                         if((P1IN & GPIO_PIN1) == 0)
  19.                         {
  20.                                 P1OUT ^= 0x01;
  21.                                 while((P1IN & GPIO_PIN1) == 0);
  22.                         }
  23.                         if((P1IN & GPIO_PIN4) == 0)
  24.                         {

  25.                                 P1OUT ^= 0x01;
  26.                                 while((P1IN & GPIO_PIN4) == 0);
  27.                         }
  28.         for(i=10000; i>0; i--);
  29.     }
  30.         
  31. }


  32. /***************************库的写法
  33. int main()
  34. {
  35.         volatile uint32_t i;
  36.         
  37.     // Stop watchdog timer
  38.     WDT_A_hold(WDT_A_BASE);

  39.                 //设定P1.0为输出
  40.           GPIO_setAsOutputPin( GPIO_PORT_P1, GPIO_PIN0  );

  41.     //Confinguring P1.1 & P1.4 as an input and enabling interrupts
  42.     GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1 | GPIO_PIN4);

  43.         
  44.    
  45.     while(1)
  46.     {
  47.                                 
  48.                           
  49.         // Delay
  50.                         if(GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN1) == 0)
  51.                         {
  52.                                  GPIO_toggleOutputOnPin( GPIO_PORT_P1,GPIO_PIN0);
  53.                                  while(GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN1) == 0);
  54.                                 
  55.                         }
  56.                         if(GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN4) == 0)
  57.                         {
  58.                                  GPIO_toggleOutputOnPin( GPIO_PORT_P1,GPIO_PIN0);
  59.                                  while(GPIO_getInputPinValue(GPIO_PORT_P1,GPIO_PIN4) == 0);                        
  60.                         }
  61.     }
  62.         
  63. }
  64. ******************************************/







复制代码
库函数很简单,可以建议初学者从库函数这个切入
这次新增了两个函数:
                       GPIO_setAsInputPinWithPullUpResistor这个函数是设置IO口为输入上拉
                       GPIO_getInputPinValue这个函数是读取某个IO的电平状态。
代码分享:
Key.zip (302.75 KB, 下载次数: 0, 售价: 1 分芯积分)

最后做下广告,大家有时间帮我拉拉票,倒数第3就是我的
https://bbs.eeworld.com.cn/huodong/RIGOL20150527/

QQ截图20150609234220.png (158.13 KB, 下载次数: 2)

QQ截图20150609234220.png

最新回复

帮大神顶贴了  详情 回复 发表于 2015-6-29 11:24
 
点赞 关注

回复
举报

1万

帖子

24

TA的资源

版主

沙发
 
好几天不见你发帖了。

点评

前段时间有点忙  详情 回复 发表于 2015-6-10 00:26
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
dcexpert 发表于 2015-6-10 00:24
好几天不见你发帖了。

前段时间有点忙
 
 
 

回复

1560

帖子

24

TA的资源

五彩晶圆(初级)

4
 
楼主精力真好。不过我还是换用IAR算了,那个430ware老更新不了。

点评

反正用啥编译器都一样,我回头看看IAR的  详情 回复 发表于 2015-6-10 12:13
 
个人签名这孩子,成熟的象征,理智的典范。
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

5
 
lonerzf 发表于 2015-6-10 06:55
楼主精力真好。不过我还是换用IAR算了,那个430ware老更新不了。

反正用啥编译器都一样,我回头看看IAR的
 
 
 

回复

186

帖子

0

TA的资源

一粒金砂(中级)

6
 
我去 你也参加那个活动了啊 有个哥们儿参加那个活动天天让我投票 你也不说一声 帮你投啊!

点评

忘记叫你了,现在也不迟  详情 回复 发表于 2015-6-15 17:22
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

7
 
Ben讨厌苦咖啡 发表于 2015-6-15 15:30
我去 你也参加那个活动了啊 有个哥们儿参加那个活动天天让我投票 你也不说一声 帮你投啊!

忘记叫你了,现在也不迟

点评

已投~明天继续~哈哈~  详情 回复 发表于 2015-6-15 20:17
 
 
 

回复

186

帖子

0

TA的资源

一粒金砂(中级)

8
 
强仔00001 发表于 2015-6-15 17:22
忘记叫你了,现在也不迟

已投~明天继续~哈哈~

点评

感谢支持  详情 回复 发表于 2015-6-16 23:33
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

9
 

感谢支持
 
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

10
 
帮大神顶贴了

点评

谢谢支持,最近有些忙了,明天出一个贴  详情 回复 发表于 2015-6-17 23:56
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

11
 

谢谢支持,最近有些忙了,明天出一个贴
 
 
 

回复

7

帖子

1

TA的资源

一粒金砂(初级)

12
 

帮大神顶贴了

点评

谢谢支持,最近复习,少少上了  详情 回复 发表于 2015-6-29 22:25
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

13
 

谢谢支持,最近复习,少少上了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表