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 PIC12F683, 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…
  • TRISIO : 1 = entrée, 0 = sortie
  • GPIO : 1 = niveau haut (HIGH), 0 = niveau bas (LOW)

📌 Visualisation : activer GP0

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

0
GP5
0
GP4
0
GP3*
0
GP2
0
GP1
1
GP0

0b00000001 = seul GP0 est à 1

⚠️ Note sur GP3

Sur PIC12F683, GP3 est souvent une entrée uniquement (et peut être MCLR selon la configuration). On l’utilise rarement comme sortie dans les exemples débutants.

🎓 Configurations courantes pour TRISIO

Code binaireHexDescription
0b000000000x00Toutes les broches en SORTIE (si autorisées)
0b001010000x28Exemple typique : GP3 entrée + autres selon besoin
0b000000010x01GP0 en entrée, le reste en sortie
0b000010000x08GP3 en entrée (courant si MCLR/entrée)
0b001111110x3FToutes les broches GP0–GP5 en entrée

💡 Rappel simple

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

GPIO : 1 = HIGH / 0 = LOW.

💡 Allumer/Éteindre une LED (PIC12F683)

Exemple : LED sur GP0

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

// 1) Désactiver l'analogique (sinon certaines broches restent en mode ADC)
ANSEL = 0b00000000;

// 2) Désactiver les comparateurs (recommandé)
CMCON0 = 0b00000111;

// 3) Direction : GP0 en sortie, GP3 en entrée (souvent), le reste au choix
TRISIO = 0b00001000;

// 4) État initial
GPIO = 0b00000000;

Allumer la LED (GP0 = 1)

GPIO
GPIO |= 0b00000001;   // met GP0 à 1 sans toucher aux autres
// ou
GPIObits.GP0 = 1;

Éteindre la LED (GP0 = 0)

GPIO
GPIO &= 0b11111110;   // met GP0 à 0 sans toucher aux autres
// ou
GPIObits.GP0 = 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
GPIO |= 0b00000001;    // GP0 = 1

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

// XOR (^=) : inverse un bit (toggle)
GPIO ^= 0b00000001;    // toggle GP0

// Exemple : allumer GP0 + GP1 + GP2
GPIO |= 0b00000111;

⚠️ Attention aux écritures complètes

Si tu fais GPIO = 0bxxxxxx, tu écrases tout le registre. Pour modifier une seule broche, préfère GPIObits.GPx ou des masques (|=, &=, ^=).

📊 Tableau de correspondance (GP0–GP5)

BinaireHexDécimalBroches actives
0b000000000x000Aucune
0b000000010x011GP0
0b000000100x022GP1
0b000001000x044GP2
0b000010000x088GP3
0b000100000x1016GP4
0b001000000x2032GP5
0b001111110x3F63GP0 à GP5