2010-09-08 25 views
0

Cela fait partie d'un projet sur lequel je travaille en utilisant un avr. J'interface via Twi avec un CI d'horloge en temps réel DS1307. Il rapporte des informations comme une série de 8 caractères. Il retourne dans le format:C Lire char comme binaire

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

Ce que je voudrais faire est de prendre chaque partie du temps et lire peu à peu. Je ne peux pas penser à un moyen de le faire. Fondamentalement allumer une led si le bit est un 1, mais pas si c'est un 0.

J'imagine qu'il y a une manière plutôt simple de le faire par bitshifting, mais je ne peux pas mettre le doigt sur le logique pour le faire.

Répondre

3

Vérifier si le bit N est fixé peut être fait avec une expression simple comme:

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

où bitmap est la valeur entière (par exemple 64 bits dans le cas présent) contenant les bits.

Trouver les secondes:

(bitmap & 0xFF) 

Trouver la minute:

(bitmap & 0xFF00) >> 8 

Trouver l'heure:

(bitmap & 0xFF0000) >> 16 
1

Si je vous interpréter correctement, les itère suivants sur tout les bits du plus bas au plus haut. Autrement dit, les 8 bits de secondes, puis les 8 bits du procès-verbal, etc.

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

Cela semble fonctionner. Je pense que j'ai un problème avec mon implémentation I2C. – Bocochoco

1

Oui - vous pouvez utiliser >> pour décaler les bits d'un droit, et & 1 pour obtenir la valeur du moins importante bit:

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); 

(qui examinera les bits du moins au plus important Par ailleurs, votre tableau d'exemple, a seulement 7 octets, et non 8 ....)

0

essentiellement, si les 6 LEDs montre les secondes en format binaire sont connectés à PORTA2-PORTA7, vous pouvez PORTA = ds1307[0] pour que les secondes s'allument automatiquement correctement.

+0

20 LED sont utilisées pour l'affichage. Je les ai charlieplexés, donc ce n'est pas si simple. – Bocochoco

+0

merci de me montrer/m'enseigner charlieplexing :) – lImbus