0

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

4 回答 4

3

检查是否设置了位 N 可以使用一个简单的表达式来完成,例如:

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

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

寻找秒数:

(bitmap & 0xFF)

寻找分钟:

(bitmap & 0xFF00) >> 8

寻找小时:

(bitmap & 0xFF0000) >> 16
于 2010-09-08T04:45:06.530 回答
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;
  }
}
于 2010-09-08T04:49:57.400 回答
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 个......)

于 2010-09-08T04:54:49.367 回答
0

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

于 2010-09-08T12:19:33.990 回答