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

ここで、bitmapは、ビットを含む整数値(たとえば、この場合は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つ右にシフトし、& 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);

(これにより、ビットが最下位から最上位まで調べられます。ちなみに、例の配列には8バイトではなく、7バイトしかありません...)

于 2010-09-08T04:54:49.367 に答える
0

基本的に、秒をバイナリ形式で表示する6つのLEDがPORTA2-PORTA7に接続されPORTA = ds1307[0]ている場合、秒を自動的に正しく点灯させることができます。

于 2010-09-08T12:19:33.990 に答える