2013-10-11 65 views
1

我有以下代碼:#定義的二進制值的

#define phase_1 0b00011000 
#define phase_2 0b00101000 
#define phase_3 0b00001010 
#define phase_4 0b00001100 

哪些實際上對應於需要被設置爲高爲步進電機的給定階段的插針。它工作得很好,但不清楚哪些位對應哪根線。

什麼我試圖acheive是類似的東西

#define Yellow PORTB5 
#define Orange PORTB4 
#define Enable PORTB3 
#define Blue PORTB2 
#define White PORTB1 

,然後有類似的東西把我的方式是很容易有點明白

#define phase_1 (1 << Yellow) | (1 << Enable) 
#define phase_2 (1 << Blue) | (1 << Enable) 

有沒有一種方法可以用類似的方式進行定義,這樣當我在一段時間內查看我的代碼時,我會準確知道每根導線的位置以及它的含義。

+0

您的微控制器應該已經爲'PORTB3'提供了'#define'的頭文件。請檢查製造商的網站。 – Potatoswatter

+0

也許'PORTB1'等全部準備好被定義爲某個十六進制值。通過掩蓋較低的3位,您可以獲得所需的索引。也許'#define黃色(PORTB5&7)'。 – chux

+0

您應該在#define表達式(((1 << Yellow)|(1 << Enable)))周圍放置另一組圓括號。如果在表達式中曾經使用過phase_1,這將防止不需要的結果做到不考慮運算符的優先級。 – kkrambo

回答

2

如果我正確理解你的問題,我想你幾乎已經擁有了。你只需要PORTB對應一個與pin相對應的數值,這就是你需要移動的數量。所以你可以添加這樣的東西:

#define PORTB5 5 
#define PORTB4 4 
#define PORTB3 3 
#define PORTB2 2 
#define PORTB1 1 

這假設了引腳映射到移位值。您可能必須根據需要調整此訂單。當然,添加評論對於這類事情也有很大的幫助。

+0

您所寫的#定義已經由製造商定義。代碼也完全評論,但爲了簡潔起見,我將其刪除 –