这实际上是我正在使用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则不亮。
我认为有一种相当简单的方法可以通过位移来实现,但是我不能把手指放在逻辑上去做。
答案 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]
让秒自动点亮。