C读取char为二进制

时间:2010-09-08 04:40:15

标签: c bit-manipulation avr

这实际上是我正在使用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则不亮。

我认为有一种相当简单的方法可以通过位移来实现,但是我不能把手指放在逻辑上去做。

4 个答案:

答案 0 :(得分:3)

检查是否设置了位N可以使用如下的简单表达式完成:

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

其中bitmap是包含位的整数值(例如,在您的情况下为64位)。

找到秒:

(bitmap & 0xFF)

找到分钟:

(bitmap & 0xFF00) >> 8

找到小时:

(bitmap & 0xFF0000) >> 16

答案 1 :(得分: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;
  }
}

答案 2 :(得分:1)

是 - 您可以使用>>将位右移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个......)

答案 3 :(得分:0)

基本上,如果以二进制格式显示秒数的6个LED连接到PORTA2-PORTA7,您可以PORTA = ds1307[0]让秒自动点亮。