W79051658 发表于 2015-1-5 19:16:14

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);
   
    }
   
}

Super169 发表于 2015-1-6 01:17:23

結果很正常.
xx1 預設為 LOW, 不會閃動.
第一下按後 xx1 = !xx1, xx1 會變成 HIGH, 之後開始不斷閃.
再按第二下後, xx1 = !xx1, xx1 變成 LOW 就不再閃.

如果按住不放, 會停在 while(digitalRead(2)==LOW); 之中.

你沒說明要做什麼, 不知有什麼問題.
如果要說問題, 應該是第一部份有點沒意義.你先說說自已想做什麼吧.

fish6823 发表于 2015-1-6 12:47:48

你用了delay()函数来延时,当程序运行到延时函数时,你按按键是没有反应的,所以你要按住按键直到延时结束系统才会有反应。

W79051658 发表于 2015-1-6 16:03:25

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。    感谢指教!

W79051658 发表于 2015-1-6 16:04:42

fish6823 发表于 2015-1-6 12:47 static/image/common/back.gif
你用了delay()函数来延时,当程序运行到延时函数时,你按按键是没有反应的,所以你要按住按键直到延时结束系 ...

谢谢,如何解决这个问题,有没有好办法?

Super169 发表于 2015-1-6 16:55:35

本帖最后由 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.

W79051658 发表于 2015-1-6 21:08:46

Super169 发表于 2015-1-6 16:55 static/image/common/back.gif
基本程序不會太複雜, 先想好整個的流程吧.
當 D8, D9, D10 循環閃動到 D13 的同時, 要考慮 D2 按鍵切入 ...

多谢指点!感觉与PLC程序的写法差别很大啊。

fish6823 发表于 2015-1-6 21:53:28

〈〉

W79051658 发表于 2015-1-6 16:04 static/image/common/back.gif
谢谢,如何解决这个问题,有没有好办法?

可以用millis()函数来计时,如delay(30);可以用,X=millis();,然后if(millis()〉=(X+30))来判断到时没有,这样系统就不会停着等延时结束了。
页: [1]
查看完整版本: DI按键扫描输入成功后,DO无法间歇输出(闪烁)