Comprendre la notation binaire

Sur un PIC, les registres sont des blocs de bits. Chaque bit contrôle (ou représente) une broche. Sur le PIC16F877A, on manipule principalement :

💡 Notation binaire en C

Le préfixe 0b suivi de bits (0/1) représente une valeur en binaire.

Exemple : 0b00000001

  • À droite = bit 0, puis bit 1, bit 2…
  • TRISx : 1 = entrée, 0 = sortie
  • PORTx : 1 = niveau haut (HIGH), 0 = niveau bas (LOW)

📌 Visualisation : activer RB0

Exemple : mettre RB0 à 1, et laisser les autres bits à 0.

0
RB7
0
RB6
0
RB5
0
RB4
0
RB3
0
RB2
0
RB1
1
RB0

0b00000001 = seul RB0 est à 1

⚠️ Note sur PORTA

Sur le PIC16F877A, plusieurs broches de PORTA sont analogiques par défaut. Il faut souvent configurer ADCON1 pour les utiliser en numérique.

🎓 Configurations courantes pour TRISB

Code binaireHexDescription
0b000000000x00Toutes les broches de PORTB en sortie
0b000000010x01RB0 en entrée, le reste en sortie
0b000011110x0FRB0 à RB3 en entrée, RB4 à RB7 en sortie
0b111100000xF0RB4 à RB7 en entrée, RB0 à RB3 en sortie
0b111111110xFFToutes les broches de PORTB en entrée

💡 Rappel simple

TRISx : 1 = entrée / 0 = sortie.

PORTx : 1 = HIGH / 0 = LOW.

💡 Allumer/Éteindre une LED (PIC16F877A)

Exemple : LED sur RB0

C (XC8)
#include <xc.h>
#define _XTAL_FREQ 4000000

// 1) Configuration des broches analogiques en numérique
ADCON1 = 0b00000110;

// 2) Direction : RB0 en sortie (ici tout PORTB en sortie)
TRISB = 0b00000000;

// 3) État initial
PORTB = 0b00000000;

Allumer la LED (RB0 = 1)

PORTB
PORTB |= 0b00000001;   // met RB0 à 1 sans toucher aux autres
// ou
PORTBbits.RB0 = 1;

Éteindre la LED (RB0 = 0)

PORTB
PORTB &= 0b11111110;   // met RB0 à 0 sans toucher aux autres
// ou
PORTBbits.RB0 = 0;

🎯 Opérations bit à bit (OR / AND / XOR)

Les opérations bit à bit permettent de modifier une seule broche sans casser les autres sorties. C’est indispensable en vrai projet.

Masques & opérations
// OR  (|=) : force un bit à 1
PORTB |= 0b00000001;    // RB0 = 1

// AND (&=) : force un bit à 0 (avec un masque)
PORTB &= 0b11111110;    // RB0 = 0

// XOR (^=) : inverse un bit (toggle)
PORTB ^= 0b00000001;    // toggle RB0

// Exemple : allumer RB0 + RB1 + RB2
PORTB |= 0b00000111;

⚠️ Attention aux écritures complètes

Si tu fais PORTB = 0bxxxxxxxx, tu écrases tout le registre. Pour modifier une seule broche, préfère PORTBbits.RBx ou des masques (|=, &=, ^=).

📊 Tableau de correspondance (RB0–RB7)

BinaireHexDécimalBroches actives
0b000000000x000Aucune
0b000000010x011RB0
0b000000100x022RB1
0b000001000x044RB2
0b000010000x088RB3
0b000100000x1016RB4
0b001000000x2032RB5
0b010000000x4064RB6
0b100000000x80128RB7
0b111111110xFF255RB0 à RB7

🧠 Exemple avec PORTA

Le PIC16F877A possède plusieurs ports. Pour PORTA, il faut souvent désactiver le mode analogique avant d’utiliser les broches en numérique.

Exemple PORTA
// Désactive les fonctions analogiques sur PORTA / PORTE
ADCON1 = 0b00000110;

// RA0 en sortie, le reste en entrée
TRISA = 0b11111110;

// Allumer RA0
PORTA |= 0b00000001;

// Éteindre RA0
PORTA &= 0b11111110;