DI按键扫描输入成功后,DO无法间歇输出(闪烁)
大家好!我是新手,碰到一下问题,请都是大家!
要实现的功能:按一下按钮, 灯间隙闪烁,再按一下,灯灭。代码如下,我试了一下,必须按住按钮不松手才可以,请高手指点,不胜感激!
void setup()
{
pinMode( 10 , OUTPUT);
pinMode( 11 , OUTPUT);
pinMode( 12 , OUTPUT);
pinMode( 13 , OUTPUT);
pinMode( 2 , INPUT_PULLUP);
}
bool xx1=LOW;
void loop()
{
if(digitalRead(2)==LOW)
{
delay(30);
if(digitalRead(2)==LOW)
{
xx1=!(xx1);
while(digitalRead(2)==LOW);
}
}
if( xx1==HIGH)
{
digitalWrite( 10,HIGH );
delay(1000);
digitalWrite(10,LOW);
delay(1000);
}
}
結果很正常.
xx1 預設為 LOW, 不會閃動.
第一下按後 xx1 = !xx1, xx1 會變成 HIGH, 之後開始不斷閃.
再按第二下後, xx1 = !xx1, xx1 變成 LOW 就不再閃.
如果按住不放, 會停在 while(digitalRead(2)==LOW); 之中.
你沒說明要做什麼, 不知有什麼問題.
如果要說問題, 應該是第一部份有點沒意義.你先說說自已想做什麼吧. 你用了delay()函数来延时,当程序运行到延时函数时,你按按键是没有反应的,所以你要按住按键直到延时结束系统才会有反应。 Super169 发表于 2015-1-6 01:17 static/image/common/back.gif
結果很正常.
xx1 預設為 LOW, 不會閃動.
第一下按後 xx1 = !xx1, xx1 會變成 HIGH, 之後開始不斷閃.
你好,看到你的回复,谢谢答复。
求助一下,我要完成的功能是“按一下按键(DI2), 松开后,DO8HIGH,保持一秒,DO8LOW,DO9HIGH,保持一秒,DO9LOW,D10HIGH,循环到DO13,再回到DO8HIGH......直到设置的计数器到,或者再按一下按键DI2, DO8,DO9,,,,,DO13全部LOW。 感谢指教! fish6823 发表于 2015-1-6 12:47 static/image/common/back.gif
你用了delay()函数来延时,当程序运行到延时函数时,你按按键是没有反应的,所以你要按住按键直到延时结束系 ...
谢谢,如何解决这个问题,有没有好办法? 本帖最后由 Super169 于 2015-1-6 16:57 编辑
W79051658 发表于 2015-1-6 16:03 static/image/common/back.gif
你好,看到你的回复,谢谢答复。
求助一下,我要完成的功能是“按一下按键(DI2), 松开后,DO8HIGH, ...
基本程序不會太複雜, 先想好整個的流程吧.
當 D8, D9, D10 循環閃動到 D13 的同時, 要考慮 D2 按鍵切入的反應.
如果是希望每次按鍵後閃動以一個循環為單位, 只需在 loop 開始檢測 D2, 之後 完成一個循環就可以.時間可以用 delay 去控制.
如果希望任何時間按下就中斷, 同樣在 loop 開始檢測 D2, 但之後要加入一些記錄進度及時間的變數, 每次檢測時間差, 去處理閃動.不能使用 delay.
Super169 发表于 2015-1-6 16:55 static/image/common/back.gif
基本程序不會太複雜, 先想好整個的流程吧.
當 D8, D9, D10 循環閃動到 D13 的同時, 要考慮 D2 按鍵切入 ...
多谢指点!感觉与PLC程序的写法差别很大啊。
〈〉
W79051658 发表于 2015-1-6 16:04 static/image/common/back.gif谢谢,如何解决这个问题,有没有好办法?
可以用millis()函数来计时,如delay(30);可以用,X=millis();,然后if(millis()〉=(X+30))来判断到时没有,这样系统就不会停着等延时结束了。
页:
[1]