簡體   English   中英

C將char讀取為二進制

[英]C Read char as binary

這實際上是我正在使用avr進行的項目的一部分。 我通過twi與DS1307實時時鍾IC接口。 它以一系列8個字符的形式報告信息。 它以以下格式返回:

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

我想做的是花費時間的每一部分,並一點一點地閱讀它。 我想不出辦法。 如果該位為1,則基本上點亮LED,但如果為0,則不點亮。

我以為有一種相當簡單的方法可以通過位移位來做到這一點,但是我無法完全理解這樣做的邏輯。

可以使用一個簡單的表達式來檢查是否設置了N位:

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

其中,位圖是包含位的整數值(例如,您的情況下為64位)。

查找秒:

(bitmap & 0xFF)

查找分鍾:

(bitmap & 0xFF00) >> 8

查找時間:

(bitmap & 0xFF0000) >> 16

如果我正確地解釋了您的內容,則以下內容將對所有位進行從低到高的迭代。 也就是說,每秒的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;
  }
}

是的-您可以使用>>將這些位右移一位,並使用& 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個字節。)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM