Cours/TD d informatique embarquée Utilisation d un microcontrôleur MBED Partie 3 Sorties parallèles - LCD Parallel data & Liquid Crystal Display Plan du cours 3.1. Utilisation de sorties parallèles, notion de bus 3.2. Utilisation d'un LCD -Décomposition d'un projet en plusieurs fichiers 3.3. Utilisation de la bibliothèque TextLCD CV C/TD INFO2 - Partie 3 page 1
3.1. Utilisation de sorties parallèles, notion de bus Un bus est un ensemble de fils permettant le dialogue entre un/des composant(s) et un/des contrôleur(s), il peut être du type série ou du type parallèle. Les bus PCI, ATA, PCMCIA sont des bus. Les bus. Sur MBED, BusOut et BusIn permettent et de les traiter comme. L écriture et la lecture sont possibles. Sur le LPC1768, les quatre LEDs présentes sur la carte peuvent donc être manipulées simultanément. De même les 26 E/S numériques peuvent être configurées comme des BusIn ou des BusOut. Les méthodes associées à BusOut sont dans le tableau ci-dessous : BusOut / Fonctions Utilisation BusOut Crée une variable de type BusOut associée à plusieurs broches write Permet l écriture paramètre entier en décimal, binaire (0b...) ou hexa (0x...) read Renvoie la valeur actuellement écrite variable_busout= = est un raccourci de la fonction write() =variable_busout = est un raccourci de la fonction read() Le programme ci-dessous va faire clignoter les LEDs 0000 0101 => allumées pendant 200 ms, puis => allumées pendant 200ms #include "mbed.h" BusOut myleds(led4, LED3, LED2, LED1); int main() { char x; while(1) { x=5; // ou x=0b101; ou x=0x5; myleds.write(x); wait(0.2); x=10; myleds.write(x); wait(0.2); Les noms LED1, LED2 sont des alias équivalents au noms des broches CV C/TD INFO2 - Partie 3 page 2
Exercice 1 : a) Réaliser et tester le programme ci-dessus. b) Réaliser un programme permettant de déplacer la LED allumée de droite à gauche, puis de gauche à droite, puis de droite à gauche... 3.2. Utilisation d'un LCD Nous allons utiliser un LCD 2x16 caractères Circuit driver du type Brochage du LCD : La documentation du circuit driver nous donne le brochage ci-contre. Les broches 15 et 16 existent si le circuit a un rétroéclairage, nous ne nous y intéressons pas. Le circuit doit être alimenté en 5 V (sinon l'afficheur ne s'allume pas) mais les données (théoriquement '0' > 0V et '1' > 5V) peuvent être en 0 / 3.3V L'initialisation se fait en envoyant les instructions aux du LCD. Il faut mettre au niveau bas RS, R/W et E et envoyer alors les instructions sur les bits DB0-DB7. Nous utiliserons le LCD en mode de communication 4 bits (DB4-DB7) afin de limiter le nombre de fils. Après l envoi de chaque instruction, E doit être mis à 1 puis 0 pour valider l envoi de l instruction. Lorsque le LCD a été initialisé, les données à afficher peuvent être envoyées en utilisant DB4-DB7 (RS au niveau ), enfin E doit encore être mis à 1 puis 0 pour valider l envoi des données. CV C/TD INFO2 - Partie 3 page 3
Nous devons associer des sorties numériques du LPC1768 au LCD. Il faut : un bus de bits de données/instructions 2 sorties numériques pour RS et E LCD uniquement en écriture => R/W = 0V (pin 1 du mbed) NB : le brochage sur le mbed n'est pas figé, il a été choisi de façon arbitraire. Câblage et code ASCII des caractères MSB = = ; ex : pour 'T' = 0x54 le MSB vaut Quel programme faut-il réaliser pour piloter le LCD et afficher "HELLO"? Fichier d'en-tête de nos fonctions : LCD.h // LCD.h file #ifndef LCD_H #define LCD_H #include "mbed.h" void display_to_lcd(char value); //fonction d'affichage des carac. void toggle_enable(void); //fonction d'inversion du bit enable void LCD_init(void); // fonction d'initialisation du LCD #endif Fonctions : LCD.cpp // LCD.cpp file #include LCD.h" DigitalOut RS(p19); DigitalOut E(p20); BusOut data(p21, p22, p23, p24); void toggle_enable(void){ E.write(1); wait(0.001); E.write(0); wait(0.001); void LCD_init(void){ wait(0.02); RS.write(0); E.write(0); CV C/TD INFO2 - Partie 3 page 4
//function mode data.write(0x2); data.write(0x8); //display mode data.write(0x0); data.write(0xf); //clear display data.write(0x0); data.write(0x1); //display function void display_to_lcd(char value ){ RS.write(1); data.write(value>>4); data.write(value&0x0f); Progamme principal : main.cpp #include LCD.h" int main() { LCD_init(); display_to_lcd(0x48); // H display_to_lcd(0x45); // E display_to_lcd(0x4c); // L display_to_lcd(0x4c); // L display_to_lcd(0x4f); // O Exercice 2 : a) Réaliser et tester le projet ci-dessus (3 fichiers). b) Ajouter à ce projet une fonction permettant d'afficher sur le LCD une chaine de caractères passée en paramètre. Tester en écrivant le nom de votre professeur(e) préféré(e). c) En utilisant la documentation en annexe (doc. complète disponible sur le réseau), expliquer la succession des codes envoyés dans la fonction LCD_init(). Entourer sur la doc. les instructions de configurations utilisées et donner la valeur des différentes lettres ('0' ou '1'). d) A quoi correspond la mise à 0 ou à 1 de RS? e) Repérer sur le schéma synoptique le registre de données et le registre d'instruction. Par quel composant est réalisé un registre? CV C/TD INFO2 - Partie 3 page 5
3.3. Utilisation de la bibliothèque TextLCD.h Evidemment, il existe une beaucoup plus complète permettant d utiliser le LCD :. Il faut définir la variable MonLCD de type et son brochage simultanément : #include "TextLCD.h" TextLCD MonLCD(p19,p20,p21,p22,p23,p24) //broches associées à //rs,e,d4,d5,d6,d7 NB : le brochage sur le mbed n'est pas figé, il a été choisi de façon arbitraire. La méthode permettant d écrire est printf MonLCD.printf("Hello World!"); Les méthodes locate et cls permettent respectivement de déplacer le curseur et d effacer l écran MonLCD.cls(); // efface l écran MonLCD.locate(3,1); // déplace le curseur ligne 2, 4ème caractère Exercice 3 : Réaliser un programme permettant d'afficher sur deux lignes : "Hello " "World! " CV C/TD INFO2 - Partie 3 page 6
Exercice 4 : #include "mbed.h #include "TextLCD.h TextLCD lcd(p19, p20, p21, p22, p23, p24); // rs,e,d4,d5,d6,d7 int x=0; int main() { lcd.printf("lcd Counter"); while (1) { lcd.locate(5,1); lcd.printf("%i",x); wait(1); x++; Réaliser et tester le programme ci-dessus. Exercice 5 : Réaliser un programme permettant de lire la valeur d'un potentiomètre branché sur la broche 17 et d'afficher la valeur de la tension du potentiomètre en volts sur le LCD (avec 1 chiffre après la virgule). Vérifier la mesure avec un multimètre. CV C/TD INFO2 - Partie 3 page 7
Extrait de la datasheet du circuit driver de LCD HD44780U Schéma synoptique : Instructions de configuration (>> instruction register) : CV C/TD INFO2 - Partie 3 page 8