2014-07-22 61 views
0

我有一个Arduino Mega 2560.我有一个LED接地并通过面包板连接到引脚12,开关通过面包板连接到引脚7和引脚2。我编写了这个程序,以便按下按钮可以在开启和关闭之间改变LED的状态。组件都似乎工作,所以我认为这是一个编码问题。这里是我的代码:我该如何解决这个arduino代码?(详情如下)

boolean running = false; 
boolean ledon = true; 
void statechange() { 
    if(running == false) { 
    running = true; 
    ledon = !ledon; 
    if(led on) { 
     digitalWrite(12, HIGH); 
    } else { 
     digitalWrite(12, LOW); 
    } 
    delay(1000); 
    running = false; 
    } 
} 

void setup() { 
    pinMode(12, OUTPUT); 
    pinMode(7, OUTPUT); 
    digitalWrite(7, HIGH); 
} 

void loop() { 
    attachInterrupt(0,statechange,CHANGE); 
} 

我没有收到任何错误,它只是不起作用,无论如何LED都不亮。

+0

http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Unnamed_numerical_constants –

回答

0

您确定这是对吗?

if(ledon) 
    { 
     digitalWrite(12, HIGH); 
    } 
    else 
    { 
     digitalWrite(12, LOW); 
    } 

它看起来像“如果LED亮,打开它,否则,如果LED熄灭,将其关闭。”

它不应该是:

if(ledon) 
    { 
     digitalWrite(12, LOW); 
     ledon = false; 
    } 
    else 
    { 
     digitalWrite(12, HIGH); 
     ledon = true; 
    } 

如果您使用ledon跟踪状态的,但是独立改变你的if语句的状态下,两个可能不同步。特别是如果其他地方的代码可以改变ledon的状态。

困扰我的另一件事是这一行:if(running == false)

如果是真的(例如,您硬件没有运行?),那么什么是试图在那个改变I/O状态点时间?

+0

该变量的代码位翻转之前,我想。 – user3102599

+0

@ user3102599一旦你知道它被更改为...我会实现它......请参阅编辑。 –

0
boolean ledon = true; 

void statechange() 
{ 
    ledon = !ledon; 
    digitalWrite(12, ledon ? HIGH : LOW); 
} 

void setup() 
{ 
    pinMode(12, OUTPUT); 
    pinMode(7, OUTPUT); 
    digitalWrite(7, HIGH); 

} 

void loop() 
{ 
    attachInterrupt(0,statechange,CHANGE); 
} 
+0

其实我只是想让LED在按下按钮时改变状态,而不是闪烁,不过谢谢。 – user3102599

+0

在这种情况下,您的代码可以简化。我会更新我的答案。 –