Ennoncé Exercice 4 Serie-LCD-Clavier - TERMINAL4_JP --------------------------------------------------- Utilisation de l'écran LCD et de la réception RS232 Ici, nous allons utiliser un protocole de communication. Les commandes sont envoyées par le PC et interprétées par l'AT-Mega16. Définition du protocole : ------------------------- Toutes les lignes envoyées à l'Avr commencent par C ou par T et se terminent par un (CR) Carriage Return (Chr$13). La ligne qui commence par T doit être suivie par un nombre de caractères égal ou inférieur à la longueur d'une ligne de l'afficheur (8, 16, 20 ou 40 suivant le modèle d'afficheur). Cette ligne est alors affichée à la ligne inférieure de l'afficheur et la ligne précédente est décalée vers le haut. Si la ligne est trop longue, elle n'est pas prise en compte. Dans ce cas, un message "Trop long" est envoyé au PC. La ligne qui commence par C doit être suivie par un caractère et un CR. Le caractère peut-être envoyé en majuscule ou en minuscule. Nous définirons trois commandes possibles : - E : pour effacement de l'écran de l'afficheur - F : pour clignotement de la ligne - L : pour effacement de la ligne du bas de l'afficheur La commande "F" est une commande "toggle". La première commande active le clignotement. A partir de ce moment, toutes les lignes envoyées par RS232 seront clignotantes. Une nouvelle commande C,F,CR arrêtera le clignotement. Toute autre entrée ne sera pas interprétée et un message "Erreur" sera envoyé vers le PC via RS232. Principe de fonctionnement du programme : ----------------------------------------- En ce qui concerne l'affichage sur l'écran LCD, nous n'utiliserons pas les fonctions standard. En fait, nous construirons les deux lignes dans des variables, puis nous les afficherons. Description des tâches : ------------------------ - Effacer l'écran. - Afficher un message d'accueil. - Attendre un caractère envoyé sur le port RS232. - Si le premier caractère reçu est autre que T ou C, alors on envoie le message "Erreur" vers le PC. - Cas 1: Si le premier caractère reçu est un T, on construit la ligne inférieure avec les caractères reçus jusqu'à la réception d'un (Chr$13). - Si la contenance maximum de la ligne est dépassée, on envoie un message "Trop long" vers le PC et on peut recommencer la saisie au début de la ligne ou quitter avec CR. - Si de nouveau le caractère T est envoyé, on continue la saisie de la ligne jusqu'au moment ou la ligne est pleine, après avoir reçu , on décale d'une ligne vers le haut et on construit la deuxième ligne en terminant par CR et ainsi de suite... - Cas 2: Si le premier caractère est un C, trois commandes sont possibles. - Voici les commandes acceptées: - C, E, CR : on efface l'écran de l'afficheur - C, F, CR : on fait clignoté les lignes sur l'afficheur jusqu'à la prochaine réception des caractères C,F,. - C, L, CR : on efface la ligne du bas de l'afficheur. - Si on reçois le caractère C suivi de caractères autres que E, F, L, alors on envoie le message "Erreur" vers le PC. NB: Les lettres T, C, E, F, L peuvent être en majuscules ou en minuscules. Programmation structurée : ========================== BEGIN Définition des variables ------------------------ DECLARE i AS Byte ' Variable de travail DECLARE j AS BYTE ' Variable de travail DECLARE k AS BIT ' Variable de travail DECLARE l AS BIT ' Variable de travail DECLARE m AS Byte ' Variable de travail DECLARE Entree AS BYTE ' Valeur lue sur RS232 DECLARE Ligne$ AS ALPHA ' Variable de travail pour la ligne (16 Chars) DECLARE Ligne1$ AS ALPHA ' Première ligne d'affichage du LCD (16 Chars) DECLARE Ligne2$ AS ALPHA ' Deuxième ligne d'affichage du LCD (16 Chars) DECLARE NbreCar AS INTEGER ' Le nombre de caractères par ligne du LCD Initialisation des variables ---------------------------- LET i = 0 LET j = 0 LET k = 0 LET l = 0 LET Entree = 0 LET Ligne$ = "" LET Ligne1$ = " " LET Ligne2$ = " " LET NbreCar = 16 ' LCD de 2 X 16 caractères Inialisation du programme ========================= LET Ligne1$ = " MICRO - INFO " ' Définition de la première ligne LET Ligne2$ = " Terminal 4 " ' Définition de la seconde ligne ' Effacement du LCD GOSUB Affilcd ' Affichage des 2 lignes ' Petite pause LET Ligne1$ = " " ' Première ligne à 16 blancs LET Ligne2$ = " " ' Deuxième ligne à 16 blancs ' Effacement du LCD GOSUB Affilcd ' Affichage des 2 lignes Début du programme principal ============================ DO WHILE i=i ' Début de la boucle infinie LET Entree = ' Réception RS232 IF Entree = CHR$(84) OR CHR$(116) THEN ' Si lettre T ou t GOSUB Texto ' Pour du texte ELSE IF Entree = CHR$(67) OR CHR$(99) THEN ' Si lettre C ou c GOSUB Action ' Pour une commande ELSE "ERREUR" ' Pas la bonne touche ENDIF ENDDO ' Fin de la boucle infinie END ' Fin du programme Sous routines ============= Texto : Affiche les caractères envoyés -------------------------------------- SUB Texto LET Ligne$ = "" ' initialisation de Ligne$ DO LET Entree = ' Réception RS232 IF Entree <> CHR$(13) THEN ' Test si pas Carriage Return IF M < NbreCar THEN ' Test dépassement longueur de ligne LET Ligne$ = Ligne2$ ' Mise à jour de la ligne de travail LET J = M + 1 ' Calcul de l'index de position dans la ligne LET Ligne2$ = LEFT$(ligne$,j) + Entree ' prise des j premiers caractères de ligne2$ ' + le caractère appuyé contenu dans Entree LET j = NbreCar - M ' Calcul des positions restantes ' sur la ligne LET Ligne2$ = Ligne2$ + LEFT$(" ",j) ' Ajout des blancs pour terminer la ligne ' Effacement du LCD GOSUB Affilcd ' Affichage des 2 lignes LET M = M + 1 ' On augmente d'un espace sur la ligne ELSE "Trop long" ' Envoi le message vers le PC LET M = 1 ' Reprise au début de la ligne ENDIF ENDIF UNTIL Entree = CHR$(13) ' Bouclage jusqu'à réception IF M = NbreCar THEN LET Ligne1$ = Ligne2$ ' Décalage de la ligne vers le haut LET Ligne2$ = " " ' et effacement de la ligne du bas LET M = 1 ' Positionne en début de ligne ' Effacement du LCD GOSUB Affilcd ' Affichage des 2 lignes ENDIF ENDSUB Action : Exécute la commande ---------------------------- SUB Action LET Entree = ' Réception RS232 IF Entree = CHR$(69) OR CHR$(101) THEN ' Si caractère E ou e LET Entree = ' Réception RS232 IF Entree = CHR$(13) THEN ' Test si CR envoyé LET Ligne1$ = " " ' On efface les 2 lignes LET Ligne2$ = " " ELSE "ERREUR" ENDIF ELSE IF Entree = CHR$(70) OR CHR$(102) THEN ' Si caractère F ou f LET Entree = ' Réception RS232 IF Entree = CHR$(13) THEN ' Test si CR envoyé TOGGLE K ' Prend la valeur 0 ou 1 IF K = 1 THEN ELSE ENDIF ELSE "ERREUR" ENDIF ENDIF ELSE IF Entree = CHR$(76) OR CHR$(108) THEN ' Si caractère L ou l LET Entree = ' Réception RS232 IF Entree = CHR$(13) THEN ' Test si CR envoyé LET Ligne1$ = "" LET Ligne2$ = " " ' On efface la ligne 2 ELSE "ERREUR" ENDIF ENDIF ENDIF ' Effacement du LCD GOSUB Affilcd ' Affichage des 2 lignes ENDSUB AffiLCD : Affichage de deux lignes ----------------------------------- SUB Affilcd ' Sur ligne 1 du LCD ' Sur ligne 2 du LCD ENDSUB *********[ FIN ]***************************************************************