Système de verrouillage par code sur microcontrôleur 8051 avec affichage graphique 128×64

Ce projet présente une implémentation complète d’un système de sécurité embarqué basé sur le microcontrôleur 8051 (famille MCS-51), intégrant un écran LCD graphique 128×64, un clavier matriciel 4×4 et une interface de contrôle électromécanique. L’architecture logicielle met l’accent sur la modularité, la robustesse des entrées utilisateur et la gestion sécurisée des données sensibles.

Architecture matérielle et initialisation du contrôleur

Le cœur du système repose sur un microcontrôleur 8051 compatible (ex. : STC89C52 ou AT89C51), configuré avec une horloge cristal de 11.0592 MHz pour assurer une synchronisation précise des périphériques. Les ressources I/O sont allouées comme suit :

  • P0 : bus de données bidirectionnel vers le contrôleur LCD (ST7920 en mode parallèle)
  • P1.0–P1.3 : lignes de balayage du clavier (sorties)
  • P1.4–P1.7 : colonnes de détection (entrées avec résistances de pull-up)
  • P2.0 : signal de commande du relais de verrouillage
  • P2.1 : sortie de signal d’alerte (buzzer)

L’initialisation inclut la configuration des ports, l’activation de l’interrupteur de minuterie (Timer0 en mode 16 bits), et la mise à zéro des registres de contrôle LCD.

Gestion dynamique du clavier matriciel

Le balayage est effectué par itération séquentielle des lignes, suivie d’une lecture synchrone des colonnes. Une double validation temporelle élimine les rebonds mécaniques sans bloquer le processeur :

void scanKeypad(void) {
    static uint8_t row = 0;
    static uint16_t debounceCounter = 0;
    static uint8_t lastKey = 0xFF;

    P1 = 0xF0; // Désactive toutes les lignes
    switch(row) {
        case 0: P1 = 0xFE; break; // Ligne 0 active (0xFE = 11111110)
        case 1: P1 = 0xFD; break; // Ligne 1 active (0xFD = 11111101)
        case 2: P1 = 0xFB; break; // Ligne 2 active (0xFB = 11111011)
        case 3: P1 = 0xF7; break; // Ligne 3 active (0xF7 = 11110111)
    }

    uint8_t colState = P1 & 0x0F;
    if (colState != 0x0F) {
        if (++debounceCounter > 20) { // ~20 ms stabilisation
            uint8_t key = mapKey(row, colState);
            if (key != lastKey) {
                processKeyInput(key);
                lastKey = key;
            }
            debounceCounter = 0;
        }
    } else {
        debounceCounter = 0;
        lastKey = 0xFF;
    }

    if (++row > 3) row = 0;
}

Stockage sécurisé et vérification cryptographique

Plutôt que de stocker le mot de passe en clair dans la mémoire RAM ou EEPROM, le système utilise un hachage SHA-1 généré à la compilation et stocké dans la zone de code (code segment). La fonction de vérification compare uniquement les empreintes :

#define HASH_SIZE 20
const uint8_t AUTH_HASH[HASH_SIZE] = {
    0x5B, 0xAA, 0x7D, 0x1E, 0x9E, 0x2A, 0x7C, 0x6B,
    0x4F, 0x8D, 0x21, 0x0F, 0x3A, 0x77, 0xB5, 0x2C,
    0x9E, 0x4A, 0x1D, 0x8F
};

uint8_t verifyInput(const uint8_t* input, uint8_t len) {
    uint8_t hash[HASH_SIZE];
    sha1_compute(input, len, hash);
    return (memcmp(hash, AUTH_HASH, HASH_SIZE) == 0);
}

Une politique de verrouillage automatique est appliquée après trois tetnatives infructueuses : le système désactive les entrées pendant 30 secondes et active un signal visuel/sonore.

Contrôle avancé de l’écran LCD 128×64

L’afficheur utilise le contrôleur ST7920 en mode 8 bits avec interface parallèle. Le pilote implémente un tampon d’affichage double (double-buffering) pour éviter les artefacts lors des mises à jour rapides. Chaque caractère est rendu via une table de polices 8×16 pixels préchargée en ROM.

Pour les éléments graphiuqes dynamiques (icônes d’état, barres de progression), une bibliothèque légère de dessin vectoriel est utilisée, supportant :

  • Tracé de segments avec l’algorithme de Bresenham optimisé
  • Remplissage de rectangles par balayage horizontal
  • Affichage de symboles personnalisés (verrou ouvert/fermé, batterie, alarme)

Un gestionnaire de curseur intelligent positionne automatiquement les zones d’entrée (ex. : masquage des chiffres saisis avec ‘•’).

Stratégies d’économie d’énergie

En l’absence d’interaction pendant 60 secondes, le système entre dans un mode veille profond où :

  • Le générateur d’horloge principal est désactivé
  • Seul Timer1 reste acctif (déclencheur d’interruption toutes les 2 s)
  • L’afficheur passe en mode « display off » (backlight éteinte, contrôleur en veille)
  • Le clavier est réveillé par une interruption externe (edge-triggered sur P3.2)

Le réveil complet prend moins de 15 ms, garantissant une réactivité transparente pour l’utilisateur.

Diagnostic embarqué et journalisation

Un sous-système de diagnostic autonome surveille en continu :

  • L’état de la tension d’alimentation (via convertisseur ADC intégré ou diviseur résistif)
  • La température ambiante (capteur DS18B20)
  • Le nombre de cycles de verrouillage/déverrouillage
  • Les erreurs de communication LCD (timeout sur bus)

Les anomalies critiques sont enregistrées dans une zone EEPROM dédiée avec horodatage (basé sur un compteur RTC logiciel), accessible via un mode service spécial activé par une séquence clavier spécifique.

Étiquettes: 8051 ST7920 LCD12864 sha1 embedded-security

Publié le 18 octobre à 07h56