Oui tu peux te servir des équations booléennes comme tu le proposes mais attention à la syntaxe :
LED1 = PORTAbits.RA0 & PORTAbits.RA1 & !PORTAbits.RA2;
Le code que je t'ai proposé ne fait qu'une lecture en début de boucle des différentes entrées. La ligne
temp = PORTA | ( (PORTB & 0x01) << 8); // lecture des ports et isolation des entrée interrupteurs
permet en fait de positionner la valeur de tes entrées "côte à côte" dans une seule variable. Par exemple :
1 2
| unsigned char valeur1 = 0xCC;
unsigned char valeur2 = 0x3B; |
Si ici je fais un simple , les deux variables vont se mélanger. Pour éviter ça, j'utilise l'opérateur << de décalage qui permet comme son nom l'indique de décaler les bits de la variable sur laquelle il s'applique dans le sens des flèches et du nombre de bit indiqué.
1 2 3
| unsigned char test = 0x01; //00000001b
test = test << 2;
// ici test = 00000100 |
Si maintenant on reprend
temp = PORTA | ( (PORTB & 0x01) << 8)
Dans l'ordre : permet de ne garder que la valeur qui nous intéresse, le bit de poids faible.
permet de décaler ce bit de poids faible de 8 bits vers la gauche. Le résultat temporaire de ce calcul contient 100000000b soit 0x0100 (pas temp attention).
PORTA | ( (PORTB & 0x01) << 8)
fait l'opération du OU logique entre PORTA et le résultat obtenu juste au dessus. ça y est, la valeur des ports sont côte à côte dans une même variable (temp).
Ensuite
LED1 = ((temp & MASQUE_LED1) == MASQUE_LED1);
ici on fait l'opération ET bit à bit pour masquer les bits qui ne nous intéressent pas (qui correspondent aux interrupteurs) et on peut vérifier si nos différents interrupteurs sont allumés ou éteints.
Essayes de refaire ces différentes opérations sur papier et tu verras que ce n'est pas si compliqué que ça ^^
Partager