🎯 Objectif du projet

Faire clignoter une LED connectée sur la broche RB0 du PIC16F877A :

C’est le « Hello World » des microcontrôleurs PIC : idéal pour valider ton programmateur, ta config MPLAB X/XC8 et comprendre la direction des broches (TRISB) et l’écriture sur le port (PORTB).

🔌 Schéma de connexion (PIC16F877A DIP-40)

Composants nécessaires :

  • 1× PIC16F877A (boîtier DIP-40)
  • 1× LED (couleur au choix)
  • 1× Résistance 220Ω à 470Ω (330Ω recommandé)
  • 1× Alimentation 5V
  • 1× Quartz 4 MHz + 2 condensateurs 22 pF (si oscillateur externe)
  • 1× Résistance 10kΩ pour MCLR
  • 1× Breadboard + fils

Connexions :

  • VDD (broches 11 et 32) → +5V
  • VSS (broches 12 et 31) → GND
  • RB0 (broche 33) → Résistance → Anode LED (+)
  • Cathode LED (–) → GND
  • MCLR (broche 1) → +5V via résistance 10kΩ
  • OSC1/OSC2 (broches 13/14) → Quartz 4 MHz (si mode HS/XT)

💡 Astuce : pour un vrai montage stable, pense aussi à ajouter un condensateur de découplage de 100 nF entre VDD et VSS.

📝 Code source complet (XC8) — LED sur RB0

C (XC8 Compiler)
/*
 * Projet : LED Clignotante sur PIC16F877A (DIP-40)
 * Auteur : JLQDeveloppement
 * Microcontrôleur : PIC16F877A
 * Compilateur : XC8
 * Sortie LED : RB0
 */

// Configuration des fuses (PIC16F877A)
#pragma config FOSC = HS        // Oscillateur externe haute vitesse
#pragma config WDTE = OFF      // Watchdog désactivé
#pragma config PWRTE = ON      // Power-up Timer activé
#pragma config BOREN = ON      // Brown-out Reset ON
#pragma config LVP = OFF       // Low Voltage Programming OFF
#pragma config CPD = OFF       // Protection EEPROM OFF
#pragma config WRT = OFF       // Write protection OFF
#pragma config CP = OFF        // Protection code OFF

#include <xc.h>
#include <stdint.h>

#define _XTAL_FREQ 4000000  // 4 MHz

void main(void) {

    // ÉTAPE 1 : Configurer les broches analogiques en numérique
    ADCON1 = 0b00000110;

    // ÉTAPE 2 : RB0 en sortie (0), le reste en entrée (1)
    TRISB = 0b11111110;

    // ÉTAPE 3 : État initial du port
    PORTB = 0b00000000;

    // Boucle infinie
    while(1) {
        PORTBbits.RB0 = 1;     // LED ON
        __delay_ms(1000);

        PORTBbits.RB0 = 0;     // LED OFF
        __delay_ms(1000);
    }
}

🔧 Variantes du code (PIC16F877A / RB0)

Variante 1 : Toggle simple (bascule)

Toggle RB0
while(1) {
    PORTBbits.RB0 = !PORTBbits.RB0;
    __delay_ms(1000);
}

Variante 2 : Opérations bit à bit (OR/AND)

Bitwise sur PORTB
// Masque RB0 = 0b00000001
while(1) {
    PORTB |= 0b00000001;   // RB0 = 1
    __delay_ms(1000);

    PORTB &= 0b11111110;   // RB0 = 0
    __delay_ms(1000);
}

Variante 3 : XOR (toggle élégant)

XOR toggle
while(1) {
    PORTB ^= 0b00000001;   // Toggle RB0
    __delay_ms(500);
}

⚠️ Erreurs fréquentes (PIC16F877A)

  • Oublier le quartz si tu utilises FOSC = HS : le PIC ne démarre pas sans oscillateur externe.
  • TRISB incorrect : si RB0 reste en entrée, la LED ne s’allumera pas.
  • MCLR non tiré au +5V : si la broche 1 flotte, le PIC peut reset en boucle.
  • _XTAL_FREQ doit correspondre à la fréquence réelle, sinon __delay_ms sera faux.
  • LVP = ON peut perturber certaines broches, il vaut mieux souvent le mettre à OFF.