Ennoncé Exercice 5 Serie-LCD-Clavier - TERMINAL5_JP --------------------------------------------------- Utilisation du clavier matriciel, de l'écran LCD, du port série, du clavier PC et d'un hyperterminal TeraTerm Pro sur le PC. Ici, nous allons utiliser un protocole de communication. Les commandes sont envoyées à l'AT-Mega16 soit par le clavier matriciel, soit le clavier PC. Définition du protocole : ------------------------- Etablissement d'une communication bidirectionnelle entre l'AT-Mega16 et le PC. Sur le PC, nous utiliserons le programme hyperterminal comme dans l'exercice précédent, mais ici, l'option "local echo" sera désactivée. Le principe est d'utiliser le clavier du PC et le clavier matriciel 16 touches. Les touches du PC seront prises en compte dans la limite des tables du LCD. Les touches 0 à 9 ainsi que la touche # (Chr32) = Espace (sur clavier matriciel) et la touche * (Chr44) = Virgule (sur clavier matriciel) appuyées seront ensuite décodées par l'AT-Mega16 et affichées sur le LCD. Les touches du clavier matriciel se trouvant dans le tableau suivant seront prises en compte comme des commandes: Touche A (Chr65) = Envoi du contenu de l'EEprom vers TeraTerm Pro Touche B (Chr66) = Envoi du contenu de l'affichage du LCD vers TeraTerm Pro Touche C (Chr67) = Effacement des datas affichés sur le LCD Touche D (Chr68) = Ecriture des datas affichés sur le LCD vers l'EEprom AVR Quand la deuxième ligne est remplie, on copie la deuxième ligne à la place de la première ligne et ainsi de suite. X Si tout se passe bien, nous pouvons sauvegarder les données affichées dans TeraTerm Pro en fichier avec l'extension .CSV (Comma Separated Value) et en français (valeur séparée par une virgule ) et les exploiter dans un tableur. Attention: la durée de vie de l'EEprom est de 100.000 écritures. Remarques de Jean-Pol: - Là ou il y a une croix dans la marge, cela signifie un changement par rapport au texte original. - X: Dans la pratique, cela ne pose aucun problème. Voici comment faire: Dans Teraterm Pro, il suffit d'ouvrir: File / Log..., ensuite nommer le fichier Log avec l'extention .CSV et cocher les options voulues. Puis, cliquer sur: Enregistrer et une nouvelle fenêtre s'ouvre. A partir de ce moment, tous ce qui apparaît dans le terminal est copié dans le fichier .CSV jusqu'au moment ou l'on appuye sur CLOSE et voilà, c'est tout. A la place, j'ai préféré documenter, à l'aide de PRINT, les commandes apparaissant ainsi dans la fenêtre de l'hyperterminal TeraTerm Pro. Description du matériel utilisé : --------------------------------- Pour cet exercice, nous utilisons la carte alimentation, la carte AT-Mega16 et la petite carte RS232-LCD-Clavier sur laquelle seront raccordés l'écran LCD, le clavier matriciel et un câble série DB9 qui sera relié au PC. Le clavier est lu par un polling ligne/colonne qui renvoie un code compris entre 0 et 15. Il sera nécessaire de faire un test pour vérifier la correspondance entre les touches et le code envoyé par le polling. 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é soit du PC sur le port RS232 ou lu sur le clavier matriciel à 16 touches. - Si le caractère lu à partir du clavier matriciel est A, B, C ou D, alors il s'agit d'une commande. - Cas 1: Si le caractère reçu est un A, on envoie un message sur TeraTerm Pro < A = Lit les 2 lignes dans l'EEprom > et suivi par les datas (Ligne1 & Ligne2) précédement écris dans l'EEprom. - Cas 2: Si le caractère reçu est un B, on envoie un message sur TeraTerm Pro < B = Affiche les 2 lignes sur Terminal > et suivi par le contenu de l'affichage du LCD vers TeraTerm Pro. - Cas 3: Si le caractère reçu est un C, on envoie un message sur TeraTerm Pro < C = Efface les 2 lignes sur LCD > et dans ce cas, on efface les datas affichés sur le LCD. - Cas 4: Si le caractère reçu est un D, on envoie un message sur TeraTerm Pro < D = Ecrit les 2 lignes dans l'EEprom > et on écrit dans l'EEprom de l'AVR, les datas affichés sur le LCD. - Cas 5: Sinon, on affiche le caractère reçu sur le LCD. Pour cela, les caractères reçus du clavier matriciel peuvent être de 0 à 9 ainsi que Espace (# sur clavier) et Virgule (* sur clavier), par contre, les caractères venant du PC seront tous acceptés. Les caractères seront décodés par l'AT-Mega16 et affichés sur le LCD. Quand la ligne 2 est remplie, on copie la deuxième ligne à la place de la première et ainsi de suite. ****************************************** Programmation structurée : ========================== BEGIN Définition des variables ------------------------ DECLARE i AS Byte ' Variable de travail DECLARE j AS BYTE ' Variable de travail DECLARE Entree1 AS BYTE ' Valeur lue sur RS232 DECLARE Entree2 AS BYTE ' Valeur lue sur le clavier matriciel DECLARE Entreec$ AS ALPHA ' Valeur ascii de l'entrée (1 Char) 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 L1Prom$ AS ALPHA ' Première ligne dans EEprom (16 Chars) DECLARE L2Prom$ AS ALPHA ' Deuxième ligne dans EEprom (16 Chars) DECLARE Key$(16) AS ALPHA ' Matrice contenant les codes du clavier Initialisation des variables ---------------------------- LET i=1 LET j=0 LET Entree1=0 LET Entree2=16 ' Pas de touche appuyée LET Entreec="" LET Ligne$=" " LET Ligne1$=" " LET Ligne2$=" " LET L1Prom$="" LET L2Prom$="" LET Key$(0) = "0" ' Code à vérifier avec le hardware utilisé LET Key$(1) = "1" ' Idem LET Key$(2) = "2" ' Idem LET Key$(3) = "3" ' Idem LET Key$(4) = "4" ' Idem LET Key$(5) = "5" ' Idem LET Key$(6) = "6" ' Idem LET Key$(7) = "7" ' Idem LET Key$(8) = "8" ' Idem LET Key$(9) = "9" ' Idem LET Key$(10) = "A" ' Idem LET Key$(11) = "B" ' Idem LET Key$(12) = "C" ' Idem LET Key$(13) = "D" ' Idem LET Key$(14) = " " ' Idem LET Key$(15) = "," ' Idem Inialisation du programme ========================= LET Ligne1$ = " MICRO - INFO " ' Définition de la première ligne LET Ligne2$ = " Terminal 5 " ' Définition de la seconde ligne ' Effacement de l'écran GOSUB Affilcd ' Affichage des 2 lignes ' Petite pause LET Ligne1$ = " " ' Première ligne à 16 blancs LET Ligne2$ = " " ' Deuxième ligne à 16 blancs ' Effacement de l'écran GOSUB Affilcd ' Affichage des 2 lignes Début du programme principal ============================ DO WHILE i=i ' Début de la boucle infinie DO ' Bouclage de la lecture du clavier LET Entree2 = ' Lecture du clavier IF Entree2<> LET Entreec$ = Key$(Entree2) ' Définition du charactère de la touche ENDIF LET Entree1 = ' Réception RS232 IF Entree1<> THEN LET Entreec$ = CHR$(Entree1) ' Conversion Byte en ASCII ENDIF UNTIL Entree1<> OR Entree2<> ' Bouclage jusqu'à réception IF Key$(Entree2) = CHR$(68) THEN ' Si lettre A "A = Lit les 2 lignes dans l'EEprom" ENDIF IF Key$(Entree2) = CHR$(66) THEN ' Si lettre B "B = Affiche les 2 lignes sur Terminal" ENDIF IF Key$(Entree2) = CHR$(67) THEN ' Si lettre C "C = Efface les 2 lignes sur LCD" LET Ligne1$ = " " ' On met de espaces dans les 2 lignes LET Ligne2$ = " " ENDIF IF Key$(Entree2) = CHR$(68) THEN ' Si lettre D "D = Ecrit les 2 lignes dans l'EEprom" ELSE GOSUB Texto ENDIF ENDDO ' Fin de la boucle infinie END Sous routines ============= Texto : Affiche les caractères envoyés -------------------------------------- SUB Texto IF I < 16 THEN ' Test dépassement longueur de ligne LET Ligne$ = Ligne2$ ' Mise à jour de la ligne de travail LET J = I + 1 ' Calcul l'index de position dans la ligne LET Ligne2$ = LEFT$(ligne$,j) + Entreec$ ' prise des j premiers caractères de ligne$ ' + le nouveau caractère LET j = 16 - I ' Calcul des positions restantes ' sur la ligne LET Ligne2$ = Ligne2$ + LEFT$(" ",j) ' Ajout des blancs pour terminer la ligne ' Effacement de l'écran GOSUB Affilcd ' Affichage des 2 lignes LET I = I + 1 ' On augmente d'un espace sur la ligne ELSE LET Ligne1$ = Ligne2$ ' Décalage de la ligne vers le haut LET Ligne2$ = " " ' et effacement de la ligne du bas Gosub Affilcd ' Affichage des 2 lignes ENDIF ENDSUB AffiLCD : Affichage de deux lignes ----------------------------------- SUB Affilcd ' Sur ligne 1 du LCD ' Sur ligne 2 du LCD ENDSUB *********[ FIN ]***************************************************************