C Читайте char как двоичный файл - PullRequest
0 голосов
/ 08 сентября 2010

На самом деле это часть проекта, над которым я работаю с использованием AVR.Я через интерфейс twi с микросхемой часов реального времени DS1307.Он сообщает информацию в виде серии из 8 символов.Он возвращается в формате:

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

Что я хотел бы сделать, это взять каждую часть времени и прочитать его по крупицам.Я не могу придумать, как это сделать.В основном, загорается светодиод, если бит равен 1, но не если он равен 0.

Я мог бы представить, что есть довольно простой способ сделать это с помощью сдвига битов, но я не могу положить палецпо логике это сделать.

Ответы [ 4 ]

3 голосов
/ 08 сентября 2010

Проверить, установлен ли бит N, можно с помощью простого выражения, например:

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

, где bitmap - это целочисленное значение (например, 64-битное в вашем случае), содержащее биты.

Нахождение секунд:

(bitmap & 0xFF)

Нахождение минут:

(bitmap & 0xFF00) >> 8

Нахождение часов:

(bitmap & 0xFF0000) >> 16
1 голос
/ 08 сентября 2010

Да - вы можете использовать >>, чтобы сдвинуть биты вправо на единицу, и & 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 ...)

1 голос
/ 08 сентября 2010

Если я правильно вас интерпретирую, следующее перебирает все биты от младшего к старшему.То есть 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;
  }
}
0 голосов
/ 08 сентября 2010

, по сути, если 6 светодиодов для отображения секунд в двоичном формате подключены к PORTA2-PORTA7, вы можете PORTA = ds1307[0], чтобы секунды автоматически горели правильно.

...