2015-06-16 22 views
0

我是使用Arduino的初學者,我試圖用LED指示二進制數。二進制計數器在Arduino中使用循環LED指示燈

我的代碼是:

int ledPins[] = {2,3,4,5,6,7,8,9}; 
{ 
    int delaytime = 500; 
    int x; 
    int mod; 
    int index; 
    int remain; 
    for (x=0; x<512; x++) 
    { 
    if(x%2 == 1) 
    { 
    digitalWrite(2,HIGH); 
    } 
    else 
    { 
    digitalWrite(2,LOW); 
    } 
    for (index=1, mod=4, remain=1; index<8; index++, mod*=2, remain+=4) 
    { 
     if(x%mod>remain) 
     { 
     digitalWrite(ledPins[index],HIGH); 

     } 
     else { 
     digitalWrite(ledPins[index], LOW); 
     } 
    } 
    delay(delaytime); 
    } 
} 

我想要的LED開啓,當x%MOD>保持。 (例如7%4> 1,所以LED 3將打開)

請有人幫助我。非常感謝你。

+0

我該如何讓他們做我想讓他們做的事?我希望mod可以乘以2並保持增加4 –

+0

@GregHewgill謝謝。我認爲這樣做會起作用,但由於某種原因,現在第一個LED仍然亮着,之後還有其他一些LED亮起。即使當我把代碼恢復到原來的狀態時,也會發生這種情況。 –

+0

那麼您可能需要查看確定應點亮哪些LED的算法。我不太確定你的'x%mod>剩餘'條件實際上應該檢查,但它似乎沒有進行位提取。我會用'&'和'<<'等運算符重寫那個循環(搜索「二進制打印數」或類似的更多細節)。 –

回答

0

我認爲9號是LSD,2號是MSD,請嘗試下面的代碼。

LEDControlLoop(){ 

    int x = 0; 
    int delaytime = 500; 
    DDRD = B11111111; // sets port d as output 

    while(1){ // infinte while loop, 
     PORTD = x; 
     delay(delaytime); 
     x++; 
     if(x>255){ 
      x = 0; 
      //break; //optional 
     } 
    } 
} 
+0

這段代碼是怎麼回事? –

2

您可以使用模運算符'%',而不是使用模運算符。例如,下面的x的當前值寫入你的LED:

for(i=0; i<8; i++) 
{ 
    digitalWrite(ledPins[i], (x >> i) & 0x01); 
} 

這裏涉及到兩個操作,按位右移(「>>」)和按位AND(」 & 「)。

舉例來說,假設我們想要得到數量170下面顯示的數量是如何在二元操作的第3位:

(original value of x) 10101010 
(after bitwise shift 3) 00010101 
(after bitwise and 1) 00000001 

欲瞭解更多信息,搜索「按位運算符」或「位面具」。

要弄清楚爲什麼你的方法不起作用,最好的方法是通過選擇x的值並通過像上面那樣在紙上發生的事情來幹運行它。乍一看,我認爲你總是在每個循環的餘數中加4。

當引腳在端口上連續時,您可以直接將x的值直接分配給端口;這正是Bappi所掌握的。這是可行的,因爲引擎蓋下的微控制器將多個引腳值存儲在單個寄存器中。