// PIC18F4520 Configuration Bit Settings
#include <xc.h>
#include <stdio.h> // Pour utiliser sprintf
#define _XTAL_FREQ 4000000 // Fréquence de l'oscillateur
// Définition des broches de contrôle pour l'afficheur LCD
#define RS PORTCbits.RC0 // RS -> Sélection des données (1) ou des commandes (0)
#define RW PORTCbits.RC1 // RW -> Sélection lecture (1) ou écriture (0)
#define EN PORTCbits.RC2 // EN -> Activation de l'horloge LCD
// Fonction pour envoyer une commande au LCD
void lcd_cmd(unsigned char cmd) {
// Envoyer les 4 bits supérieurs
PORTC = (cmd & 0xF0); // Masque pour les bits supérieurs
EN = 1; // Activer l'horloge du LCD
RW = 0; // Mode écriture
RS = 0; // RS=0 pour la commande
__delay_ms(2); // Délai pour que le LCD traite la commande
EN = 0; // Désactiver l'horloge
// Envoyer les 4 bits inférieurs
PORTC = ((cmd << 4) & 0xF0); // Décaler pour les bits inférieurs
EN = 1;
RW = 0;
RS = 0;
__delay_ms(2);
EN = 0;
}
// Fonction pour envoyer des données au LCD
void lcd_data(unsigned char data) {
// Envoyer les 4 bits supérieurs
PORTC = (data & 0xF0); // Masque pour les bits supérieurs
EN = 1;
RW = 0;
RS = 1; // RS=1 pour envoyer des données
__delay_ms(2);
EN = 0;
// Envoyer les 4 bits inférieurs
PORTC = ((data << 4) & 0xF0); // Décaler pour les bits inférieurs
EN = 1;
RW = 0;
RS = 1;
__delay_ms(2);
EN = 0;
}
// Fonction pour initialiser le LCD
void lcd_init() {
lcd_cmd(0x02); // Initialiser en mode 4 bits
lcd_cmd(0x28); // Configurer : 4 bits, 2 lignes, 5x7 matrice
lcd_cmd(0x0C); // Activer l'affichage, désactiver le curseur
lcd_cmd(0x06); // Mode d'incrément automatique du curseur
lcd_cmd(0x01); // Effacer l'affichage
__delay_ms(2); // Petit délai pour stabiliser le LCD
}
// Fonction pour afficher une chaîne de caractères sur le LCD
void lcd_string(const char* str) {
unsigned char i = 0;
while (str[i] != '\0') { // Boucle jusqu'à la fin de la chaîne
lcd_data(str[i]); // Envoyer chaque caractère au LCD
i++;
}
}
// Fonction principale
void main() {
int a = 1; // Variable à afficher sur le LCD
char buffer[16]; // Tampon pour convertir l'entier en chaîne de caractères
TRISC = 0x00; // Configurer le PORTC comme sortie pour le LCD
lcd_init(); // Initialiser l'afficheur LCD
while (1) {
lcd_cmd(0x80); // Positionner le curseur sur la première ligne, première
position
lcd_string("bonjour"); // Afficher "bonjour" sur la première ligne
// Convertir l'entier 'a' en chaîne de caractères et l'afficher
lcd_cmd(0xC0); // Positionner le curseur sur la deuxième ligne, première
position
sprintf(buffer, "%d", a); // Convertir 'a' en chaîne de caractères
lcd_string(buffer); // Afficher la valeur de 'a'
__delay_ms(1000); // Délai de 1 seconde pour la stabilité (facultatif)
a++; // Incrémenter 'a' pour le test
}
}