如何阻止我的代码进入从8到9再到8的无限循环?

时间:2017-11-24 07:59:27

标签: arduino

我试图通过使用_switch cases_编写一个从1到10的小程序来使我的显示工作,然后每次计数器同时达到0,6或9时使LED闪烁。每当它击中0或9时,它应该向下或向上计数,这取决于它是在底部还是顶部。如何使用我当前的代码完成这项工作?

int COUNT=0; //count integer for å telle 0-10 inc.

void setup() {
  for (int i=2;i<9;i++) {
    pinMode(i, OUTPUT); {
      // setter alle pins til output
      pinMode(ledPin1, OUTPUT);
      pinMode(ledPin2, OUTPUT);
      pinMode(ledPin3, OUTPUT);
    }
  }
}

void loop() {
  switch (COUNT) {
    case 0: // Når den teller seg opp til 0, viser den 0 på disp
      digitalWrite(segA, LOW);
      digitalWrite(segB, LOW);
      digitalWrite(segC, LOW);
      digitalWrite(segD, LOW);
      digitalWrite(segE, LOW);
      digitalWrite(segF, LOW);
      digitalWrite(segG, HIGH);
      digitalWrite(ledPin2, HIGH); // skrur på LED lyset - GRØNN
      delay(500); // 750 milli sek delay.
      digitalWrite(ledPin2, LOW); // skrur av LED lyset - GRØNN
      delay(500); // 750 milli sek delay.
      break;
    case 1: // Når den teller seg opp til 1, viser den 1 på disp
      digitalWrite(segA, HIGH);
      digitalWrite(segB, LOW);
      digitalWrite(segC, LOW);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
      break;
    case 2: // Når den teller seg opp til 2, viser den 2 på disp
      digitalWrite(segA, LOW);
      digitalWrite(segB, LOW);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, LOW);
      digitalWrite(segE, LOW);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, LOW);
      break;
    case 3: // Når den teller seg opp til 3, viser den 3 på disp
      digitalWrite(segA, LOW);
      digitalWrite(segB, LOW);
      digitalWrite(segC, LOW);
      digitalWrite(segD, LOW);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, LOW);
      break;
    case 4: // Når den teller seg opp til 4, viser den 4 på disp
      digitalWrite(segA, HIGH);
      digitalWrite(segB, LOW);
      digitalWrite(segC, LOW);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, LOW);
      digitalWrite(segG, LOW);
      break;
    case 5: // Når den teller seg opp til 5, viser den 5 på disp
      digitalWrite(segA, LOW);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, LOW);
      digitalWrite(segD, LOW);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, LOW);
      digitalWrite(segG, LOW);
      break;
    case 6: // Når den teller seg opp til 6, viser den 6 på disp
      digitalWrite(segA, LOW);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, LOW);
      digitalWrite(segD, LOW);
      digitalWrite(segE, LOW);
      digitalWrite(segF, LOW);
      digitalWrite(segG, LOW);
      digitalWrite(ledPin1, HIGH); // skrur på LED lyset - BLÅ
      delay(500); // 750 milli sek delay.
      digitalWrite(ledPin1, LOW); // skrur av LED lyset - BLÅ
      delay(500); // 750 milli sek delay.
      break;
    case 7: // Når den teller seg opp til 7, viser den 7 på disp
      digitalWrite(segA, LOW);
      digitalWrite(segB, LOW);
      digitalWrite(segC, LOW);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
      break;
    case 8: // Når den teller seg opp til 8, viser den 8 på disp
      digitalWrite(segA, LOW);
      digitalWrite(segB, LOW);
      digitalWrite(segC, LOW);
      digitalWrite(segD, LOW);
      digitalWrite(segE, LOW);
      digitalWrite(segF, LOW);
      digitalWrite(segG, LOW);
      break;
    case 9: // Når den teller seg opp til 9, viser den 9 på disp
      *things*
      digitalWrite(ledPin3, HIGH); // skrur på LED lyset - RØD
      delay(500); // 750 milli sek delay.
      digitalWrite(ledPin3, LOW); // skrur av LED lyset - RØD
      delay(500); // 750 milli sek delay.
      break;
    break;
  }
  if (COUNT<10) {
    COUNT++;
    delay(1000); // teller opp hvert 1000ms
  }
  if (COUNT==10) {
    COUNT=9; // hvis den teller opp til 10, reseter den til 9
    delay(128);
    COUNT--;
    delay(1000);
  }
  if (COUNT==-1) {
    COUNT++;
    delay(1000);
  }
}

2 个答案:

答案 0 :(得分:1)

在删除了许多不太有意义的代码之后(至少在手头的问题上),看起来你想要类似的东西:

int COUNT=0;
int change = 1;

void setup(){...}

void loop() {
    switch (COUNT){
        // cases 0-9:
        // Do something
        // break;
    }

    if(COUNT == 9) { change = -1; }
    if(COUNT == 0) { change = 1; }
    COUNT += change;
}

为每次迭代指定增量(1表示递增,-1表示递减),然后每次迭代将该更改添加到实际上移或下移。

您需要进行的唯一更改是在到达其中一个末端时调整增量以反向运行,在您的情况下为0和9。

答案 1 :(得分:0)

我有一些类似的代码:

nt ports [] = {2,3,4,5,6,7,8,9};  // Digital PINS: used for display controll.
  int my_display [10] [7] ={      // Array with values of digital pins.
  {1,1,1,1,1,1,0},    // 0
  {0,1,1,0,0,0,0},    // 1
  {1,1,0,1,1,0,1},    // 2
  {1,1,1,1,0,0,1},    // 3
  {0,1,1,0,0,1,1},    // 4
  {1,0,1,1,0,1,1},    // 5
  {1,0,1,1,1,1,1},    // 6
  {1,1,1,0,0,0,0},    // 7
  {1,1,1,1,1,1,1},    // 8
  {1,1,1,0,0,1,1},    // 9
  };


void setup(){
  for (int i = 0; i < 8; i++){     // Set all digital pin in OUTPUT mode.
    pinMode(ports[i], OUTPUT);
  }  
}

void loop(){
 digitalWrite(9,LOW);              // Pin 9 control the display dot.
 for(int i = 0; i<10; i++ ){       // This loop numbers array.
   for(int j = 0; j<7; j++ ){      // This loop pins array.
    digitalWrite(ports[j],my_display[i][j]);    // Set Value to pin in function of number.
    }
 delay(1000);                      // Refresh time
 }

// Now start reverse count. And put visible the display dot.
 digitalWrite(9,HIGH);

 for(int i = 9; i>=0; i-- ){
   for(int j = 6; j>=0; j-- ){
    digitalWrite(ports[j],my_display[i][j]);
    }
 delay(1000);
 }
}

在我的代码中,如果你想要反向计数只需要改变循环的限制,只需要将循环代码放在循环的末尾。

PD:你说&#34; 每当计数器达到0,6或9时它会闪烁,同时它应该倒计时并自行重置 &#34;如果你在6点反转你的计数,怎么可能去9?