极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14301|回复: 7

DI按键扫描输入成功后,DO无法间歇输出(闪烁)

[复制链接]
发表于 2015-1-5 19:16:14 | 显示全部楼层 |阅读模式
大家好!
        我是新手,碰到一下问题,请都是大家!
        要实现的功能:按一下按钮, 灯间隙闪烁,再按一下,灯灭。代码如下,我试了一下,必须按住按钮不松手才可以,请高手指点,不胜感激!



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

使用道具 举报

发表于 2015-1-6 01:17:23 | 显示全部楼层
結果很正常.
xx1 預設為 LOW, 不會閃動.
第一下按後 xx1 = !xx1, xx1 會變成 HIGH, 之後開始不斷閃.
再按第二下後, xx1 = !xx1, xx1 變成 LOW 就不再閃.

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

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

使用道具 举报

发表于 2015-1-6 12:47:48 | 显示全部楼层
你用了delay()函数来延时,当程序运行到延时函数时,你按按键是没有反应的,所以你要按住按键直到延时结束系统才会有反应。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-6 16:03:25 | 显示全部楼层
Super169 发表于 2015-1-6 01:17
結果很正常.
xx1 預設為 LOW, 不會閃動.
第一下按後 xx1 = !xx1, xx1 會變成 HIGH, 之後開始不斷閃.

你好,看到你的回复,谢谢答复。
    求助一下,我要完成的功能是“按一下按键(DI2), 松开后,DO8HIGH,保持一秒,DO8LOW,DO9HIGH,保持一秒,DO9LOW,D10HIGH,循环到DO13,再回到DO8HIGH......直到设置的计数器到,或者再按一下按键DI2,   DO8,DO9,,,,,DO13全部LOW。    感谢指教!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-6 16:04:42 | 显示全部楼层
fish6823 发表于 2015-1-6 12:47
你用了delay()函数来延时,当程序运行到延时函数时,你按按键是没有反应的,所以你要按住按键直到延时结束系 ...

谢谢,如何解决这个问题,有没有好办法?
回复 支持 反对

使用道具 举报

发表于 2015-1-6 16:55:35 | 显示全部楼层
本帖最后由 Super169 于 2015-1-6 16:57 编辑
W79051658 发表于 2015-1-6 16:03
你好,看到你的回复,谢谢答复。
    求助一下,我要完成的功能是“按一下按键(DI2), 松开后,DO8HIGH, ...


基本程序不會太複雜, 先想好整個的流程吧.
當 D8, D9, D10 循環閃動到 D13 的同時, 要考慮 D2 按鍵切入的反應.

如果是希望每次按鍵後閃動以一個循環為單位, 只需在 loop 開始檢測 D2, 之後 完成一個循環就可以.  時間可以用 delay 去控制.
如果希望任何時間按下就中斷, 同樣在 loop 開始檢測 D2, 但之後要加入一些記錄進度及時間的變數, 每次檢測時間差, 去處理閃動.  不能使用 delay.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-6 21:08:46 | 显示全部楼层
Super169 发表于 2015-1-6 16:55
基本程序不會太複雜, 先想好整個的流程吧.
當 D8, D9, D10 循環閃動到 D13 的同時, 要考慮 D2 按鍵切入 ...

多谢指点!感觉与PLC程序的写法差别很大啊。
回复 支持 反对

使用道具 举报

发表于 2015-1-6 21:53:28 | 显示全部楼层

〈〉

W79051658 发表于 2015-1-6 16:04
谢谢,如何解决这个问题,有没有好办法?


可以用millis()函数来计时,如delay(30);可以用,X=millis();,然后if(millis()〉=(X+30))来判断到时没有,这样系统就不会停着等延时结束了。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 09:05 , Processed in 0.053589 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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