长按按钮,如何让LED点亮三秒后息灭?
本帖最后由 hjhhsl35158 于 2014-10-14 17:33 编辑void setup()
{
pinMode(A0,INPUT_PULLUP);
pinMode(13,OUTPUT);
}
void loop()
{
if(digitalRead(A0)==LOW)
{
digitalWrite(13,HIGH);
delay (3000);
digitalWrite(13,LOW);
}
}
现在的情况就是长按按钮就会隔三秒闪一次,不会息灭。我是新手,代码该如何修改?谢谢! 本帖最后由 i7456 于 2014-10-14 14:06 编辑
int ledPin =13; // the number of the LED pin
int buttonPin = 3;
int ledState;
long previousMillis = 0;
long interval = 3000;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop()
{
unsigned long currentMillis = millis();
//如果按键未按下(高电平),定义为状态0;更新按键未按下的最新时间标签
if((digitalRead(buttonPin) == HIGH)){
ledState = 0;
previousMillis = currentMillis;
}
//如果检测到按键按下(下降沿),定义为状态1
if((ledState==0)&&(digitalRead(buttonPin)==LOW)){
delay(20);
ledState = 1;
}
//如果按键按下(低电平)时间超过3秒钟,定义为状态2
if((ledState == 1)&&(currentMillis - previousMillis > interval))
ledState = 2;
//如果状态为1,让灯亮
if(ledState == 1)
digitalWrite(ledPin, HIGH);
//如果状态不为1,让灯灭
else
digitalWrite(ledPin, LOW);
}
i7456 发表于 2014-10-14 13:51 static/image/common/back.gif
非常感谢i7456的兄弟!代码已测试过了,和我想要的功能一样。 楼主的代码只差一刀,我来补刀
void setup()
{
pinMode(A0, INPUT_PULLUP);
pinMode(13, OUTPUT);
}
void loop()
{
if(digitalRead(A0) == LOW)
{
digitalWrite(13, HIGH);
delay (3000);
digitalWrite(13, LOW);
while(digitalRead(A0) == LOW) {}
}
}
差倒数第三行while 本帖最后由 i7456 于 2014-10-15 09:30 编辑
程序里要尽量避免使用较长时间的延时,死循环。当程序的功能稍复杂时,如果延时过长,实时性会非常差。
平时自己写程序时,最好避免使用长时间的延时,对以后写复杂些的程序有好处。 Ansifa 发表于 2014-10-15 01:05 static/image/common/back.gif
楼主的代码只差一刀,我来补刀
void setup()
感谢拨刀相助!想问一下为什么后面要加一对大括号呢? i7456 发表于 2014-10-15 09:27 static/image/common/back.gif
程序里要尽量避免使用较长时间的延时,死循环。当程序的功能稍复杂时,如果延时过长,实时性会非常差。
...
明白了,再次感谢!
页:
[1]