极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13580|回复: 9

在《爱上arduino》看到的代码不太懂

[复制链接]
发表于 2012-8-30 15:20:30 | 显示全部楼层 |阅读模式
本帖最后由 华琳 于 2012-8-31 14:49 编辑
  1. //example 03c:按下按钮后保持LED开启

  2. #define LED 13         //定义LED引脚为13
  3. #define BUTTON 7       //定义BUTTON引脚为7
  4.                        //连接上按钮
  5. int val = 0;             //val储存按钮的状态
  6. int old_val = 0;         //暂存val变量的上一个时间单位
  7. int state = 0;           //0表示LED关闭;1表示打开

  8. void setup()
  9. {
  10. pinMode(LED,OUTPUT);
  11. pinMode(BUTTON,INPUT);
  12. }

  13. void loop()
  14. {
  15. val = digitalRead(BUTTON);      //读取输入数值并储存
  16.                                //检查按钮变化情况

  17. if((val == HIGH)&&(old_val == LOW))
  18. {
  19.   state = 1 - state;
  20.   delay(10);
  21. }

  22. old_val = val;          //val已经是旧的了,暂存一下

  23. if(state == 1)
  24. {
  25.   digitalWrite(LED,HIGH);
  26. }else{
  27.   digitalWrite(LED,LOW);
  28. }
  29. }   
复制代码



以上的是代码,电路就不画出来了,电路很简单,LED插在引脚13和GND上,5v上伸出的线连着开关,开关的另一只脚分别直接连着引脚7,还有连一只10k电阻连在GND上。

我怎么也看不懂这个是代码怎么运作的,还有为什么要“old_val=val”

还有当开关关闭后,下面这部分代码怎么会成立
  1. if((val == HIGH)&&(old_val == LOW))
  2. {
  3.   state = 1-state;
  4.   delay(10);
  5. }
复制代码
我是刚刚接触arduino的,请各位高手帮帮忙!!!
回复

使用道具 举报

发表于 2012-8-30 16:46:35 | 显示全部楼层
还有当开关关闭后,下面这部分代码怎么会成立....

这段代码的意思是按一下按钮,状态标志反转一下,old_val == LOW是保证当你按住按钮不放的时候,这个状态不会连续快速转换。。。因为你按住的时候,old_val就是HIGH,也就是说这段代码只执行了一次
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-30 18:27:45 | 显示全部楼层
飞翔的红猪 发表于 2012-8-30 16:46
还有当开关关闭后,下面这部分代码怎么会成立....

这段代码的意思是按一下按钮,状态标志反转一下,old_ ...

还有,那 “old_val=val” 是为什么
回复 支持 反对

使用道具 举报

发表于 2012-8-30 18:51:17 | 显示全部楼层
华琳 发表于 2012-8-30 18:27
还有,那 “old_val=val” 是为什么

old_val的意思是上次的数据,而val是当前的数据,每次执行程序后会把当前的数据给old_val。程序具体流程是这样的:当按键按下,引脚接高电平,就是说val值为HIGH,而old_val的值默认为LOW,这样当按键按下之后会执行第一条if语句,并且state会变为1,然后跳出if语句,执行old_val=val,就是把old_val变为HIGH,然后再执行下面的if语句,因为state为1,所以执行LED为HIGH,这时候回到最上面的if语句,会发现old_val已经为HIGH,不满足if语句的执行条件,故state的值不会改变,LED的状态也不会改变,继续往下又会执行old_val=val,此时按键还没松开,因为单片机的速度很快。就这样一遍又一遍的循环执行,虽然按键不放开,但是灯的状态不会改变。当按键松开后,第一条if语句肯定不成立了,因为val的值变为LOW了,然后执行old_val=val,此时al的为LOW,所以old_val也为LOW,但是state的值无变化所以LED仍然为HIGH.让按键重新按下的时候第一条if语句执行,state的状态变为0,继续执行old_val=val,然后下面的if语句,由于state的状态为0,所以执行的是下面的else语句,所以LED灭掉。所以程序的最后执行效果就是按下按键灯的状态取反一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-31 07:49:44 | 显示全部楼层
maojidan 发表于 2012-8-30 18:51
old_val的意思是上次的数据,而val是当前的数据,每次执行程序后会把当前的数据给old_val。程序具体流程是 ...

好详细啊,谢谢了!!!
回复 支持 反对

使用道具 举报

发表于 2012-8-31 09:46:38 | 显示全部楼层
受教,我也是新手,也刚开始看
回复 支持 反对

使用道具 举报

发表于 2012-8-31 12:07:13 | 显示全部楼层
  1. pinMode(BUTTON,IMPUT);

  2. pinMode(BUTTON,INPUT);
复制代码
回复 支持 反对

使用道具 举报

发表于 2012-8-31 19:49:42 | 显示全部楼层
受教l了,谢谢大师们指点
回复 支持 反对

使用道具 举报

发表于 2012-8-31 22:09:44 | 显示全部楼层
氛围不错,支持!!!
回复 支持 反对

使用道具 举报

发表于 2013-5-10 15:52:25 | 显示全部楼层
一点就透,谢谢讲解!
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-7 22:49 , Processed in 0.039489 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表