2013-01-24 134 views
1

如何通過循環更改對象名稱?如何通過C lang中的循環更改對象名稱?

我想創造一個像騎士一樣的燈光效果。與一個PIC

我認爲,而不是手動打開和關閉使用循環更改RB行號。

我想改變這個端口線路名的最後一個數字:像RB01 RB02這樣

我的代碼是這樣的

for(int i = 0; i>6 ; i++){ 

PORTB = 0X00; 
RB+i = 1; 

} 

有什麼樣的方法做這樣的事情?謝謝

+2

大多數MCU的I/O與位運算完成。你不能用C做這個。我對AVR Win32 C庫比較熟悉,但是我相信PIC是相似的。在一個頭文件中應該有#defines,你可以看看它。 – OldProgrammer

+0

@LeorA這些陳述是真實的,但不協調。你可以通過按位操作來完成他所要求的。你不能通過在'for'循環中重命名標識符來實現,但這並不重要,因爲按位操作很容易。 (爲了爭辯,你可以通過在*預處理器*循環中重命名標識符來實現。) – Potatoswatter

+0

Knight Rider的+1。簡單的工程,營銷天才。 – Potatoswatter

回答

4

假設RB01RB02等只是方便#define S表示在PORTB訪問位,你可以寫按位運算的循環,而不是使用RB0*在所有。

for (int i = 0; i != 6; ++ i) { 
    PORTB = 1 << i; /* one light at a time */ 
    /* or */ 
    PORTB = (1 << i + 1) - 1; /* light all in sequence */ 
} 
0

不,沒有辦法以這種方式「生成」符號名稱。您可以使用位掩碼來操作相關端口的鎖存寄存器。

2

這不是很優雅,但一個辦法是做這樣的:

PORTB = 0x00; 
for (i = 0; i < 6; ++i) 
{ 
    RB00 = (i == 0); 
    RB01 = (i == 1); 
    RB02 = (i == 2); 
    RB03 = (i == 3); 
    RB04 = (i == 4); 
    RB05 = (i == 5); 
    // note: you probably want to put a delay in here, e.g. 200 ms 
} 

如果你想保持每次打開一個新的時間比上LED的,那麼你可以是這樣做的:

PORTB = 0x00; 
for (i = 0; i < 6; ++i) 
{ 
    RB00 = (i >= 0); 
    RB01 = (i >= 1); 
    RB02 = (i >= 2); 
    RB03 = (i >= 3); 
    RB04 = (i >= 4); 
    RB05 = (i >= 5); 
    // note: you probably want to put a delay in here, e.g. 200 ms 
} 
+0

@anonymous down-voter:請發表評論... –

+1

這看起來是正確的,有沒有錯嗎? – Douglas

+0

我可以想象downvote發生了,因爲這樣的代碼不會幫助提問者提高他的微控制器編程技能。這只不過是很多寫作而已。正如Potatoswatter在他上面的評論中所說的那樣,按位操作是實現它的方法。僅僅因爲它有效,它並不一定是正確的。 ;-) – junix

0

我可能會使用一個表:

struct portbits 
{ 
    sometype bit; // Not quite sure what "RB0..RB5" actually translate to. 
}; 

struct portbits bits[] = 
{ 
    RB00, 
    RB01, 
    RB02, 
    RB03, 
    RB04, 
    RB05, 
    RB06, 
    RB07, 
}; 

for(i = 0; i < 7; i++) 
{ 
    bits[i] = 1; 
} 
+0

'RB0 *'幾乎可以肯定預處理器宏解決位域訪問表達式。沒辦法下標,拿一個指針等等 – Potatoswatter

+0

沒錯,可能是這樣的。在這種情況下,人們必須明白它實際上是這樣做的,然後將某種形式存儲在表中 - 或者做一些其他的事情...... –