2010-09-08 81 views
0

這實際上是我正在使用avr的一個項目的一部分。我通過twi與DS1307實時時鐘IC連接。它將信息報告爲一系列8個字符。它返回的格式如下:C將字符讀爲二進制

// Second : ds1307[0] 
// Minute : ds1307[1] 
// Hour : ds1307[2] 
// Day : ds1307[3] 
// Date : ds1307[4] 
// Month : ds1307[5] 
// Year : ds1307[6] 

我想要做的是將時間的每個部分都讀取一點點。我想不出有辦法做到這一點。基本上如果這個位是1就點亮一個led,但如果是0則不會點亮。

我想象有一種相當簡單的方式可以通過位移來實現,但我不能把手指放在邏輯來做到這一點。

回答

3

檢查N是否被設置的比特可以利用簡單的表達等來完成:

(bitmap & (0x1 << N)) != 0 

其中位圖是包含比特整數值(在你的情況下例如64位)。

尋找秒:

(bitmap & 0xFF) 

尋找分鐘:

(bitmap & 0xFF00) >> 8 

查找小時:

(bitmap & 0xFF0000) >> 16 
1

如果我解釋你正確,以下遍歷所有從最低到最高的位。也就是說,秒的8位,然後是分鐘的8位等

unsigned char i, j; 
for (i = 0; i < sizeof(ds1307); i++) 
{ 
    unsigned char value = ds1307[i]; // seconds, minutes, hours etc 
    for (j = 0; j < 8; j++) 
    { 
    if (value & 0x01) 
    { 
     // bit is 1 
    } 
    else 
    { 
     // bit is 0 
    } 
    value >>= 1; 
    } 
} 
+0

看起來像它會工作。我認爲我的I2C實施存在問題。 – Bocochoco 2010-09-08 13:25:24

1

是 - 你可以使用>>權由一到比特移位,& 1獲得至少顯著的價值位:

unsigned char ds1307[7]; 
int i, j; 

for (i = 0; i < 7; i++) 
    for (j = 0; j < 8; j++) 
     printf("byte %d, bit %d = %u\n", i, j, (ds1307[i] >> j) & 1U); 

(這將位檢查從最低到最高顯著順便說一句,你的例子陣列只有7個字節,而不是8 ...。)

0

基本上,如果6個LED,以顯示二進制格式的秒數連接到PORTA2-PORTA7,你可以PORTA = ds1307[0]使秒數自動正確點亮。

+0

有20個LED用於顯示。我把他們搞混了,所以它不那麼簡單。 – Bocochoco 2010-09-08 13:23:52

+0

感謝您的演示/教我charlieplexing :) – lImbus 2010-09-08 16:42:05