Vous êtes sur la page 1sur 8

Gestion d'un afficheur LCD et d'un clavier avec le PIC16F84 ou le 16F876

Gestion d'un afficheur LCD l'aide d'un PIC


PICLCD5

Mr COTTET

Prsentation: On dsire mettre en oeuvre l'afficheur LCD puis un clavier 16 touches, sur une carte comportant un PIC16F84 conformment au schma structurel fourni, ou raliser un cablage quivalent sur la carte millnnium avec les PIC 16F876 ou 877, afin de dvelopper avec l'mulateur ICD. L'afficheur LCD est du type afficheur LCD intelligent LTN 211 (rfrence PHILIPS), comportant 2 lignes de 16 caractres et utilisant le contrleur Hitachi HD44780, utilis pour les afficheurs de 1 4 lignes de 16 40 caractres . Sur la carte Clavier LCD, la gestion du clavier est assure par un circuit spcialis encodeur de clavier (MM74C922 ou MM54C922), alors que sur la carte MILLENNIUM les lignes et les colonnes du clavier sont directement accessibles et doivent tre gres logiciellement.

- Travail a faire a la maison:


I) Etude structurelle:

(Avant d'arriver en Manip).

1) En vous aidant du schma structurel fourni, compltez les tableaux d'affectation des broches du PIC feuille rponse N1, en indiquant l'affectation des ports A et B du PIC 16F84. On utilisera les labels D0 D7 pour les donnes de l'afficheur LCD, RS, R/W et EN pour rite puis ENable de l'afficheur LCD, et A, B, C, D pour respectivement Register Select, Read/W les donnes fournies par le MM74C922 (OA OD), DA (Data Available) lorsqu'une touche est enfonce. Rem: On supposera dans tout l'exercice qu'un cavalier est positionn sur le connecteur J5 entre les broches 2 et 3. Indiquez sur la deuxime ligne le sens de chaque information pour le micro (E= entre, S= sortie). On notera "NU" lorsqu'un fil de port est non utilis. On notera "-" si un bit de port n'existe pas sur le microcontrleur utilis (PIC16F84). 2) En dduire les valeurs des registres de direction des ports A et B (TRISA et TRISB). Rem: On rappelle que pour les PIC, un "1" => Input, et un "0" => Output. Pour les bits non utiliss on prfre les laisser en entre pour viter qu'un court-circuit ventuel avec d'autres broches en sortie provoque une dtrioration des ports. 3) L'afficheur LCD dispose des broches Vss, Vdd, Vo, RS, R/W, EN, D0 D7, indiquez leur rle en vous aidant de la documentation sur l'afficheur LCD. Conclure sur le cblage de la broche R/W (Prsence ou absence du cavalier sur J5 reliant J5.2 et J5.3, et rle de la rsistance R9). Attention R9 = 4.7K et non 47K. 4) L'afficheur LCD (Contrleur HD44780) peut tre command en mode 8 bits (D7 D0) ou en mode 4 bits (Seuls D7 D4 sont utiliss pour transmettre en deux quartets l'octet de commande, ou le caractre ASCII transmettre). Rem: En mode 4 bits, il faut transmettre le quartet de poids fort sur D7 D4, puis transmettre le quartet de poids faible galement sur D7 D4. Chaque
PICLCD5

Page N1

Gestion d'un afficheur LCD et d'un clavier avec le PIC16F84 ou le 16F876 transmission d'un caractre ou d'une commande (Voir le rle de RS dans le tableau: instruction set), est valid par une impulsion sur EN. Dduire de l'tude prcdente si l'on doit utiliser ici le mode 8 bits ou le mode 4 bits. 5) En analysant les chronogrammes (fig.5) de la documentation de l'afficheur LCD (partie suprieure correspondant une criture d'un caractre ou d'une commande en mode 8 bits, proposez un algorithme permettant d'crire une donne (caractre = data) sur l'afficheur LCD, en prcisant dans l'ordre chronologique, les tats ncessaires sur les broches RS, R/W, EN et D7 D4, pour exploiter le mode 4 bits. 6) La lecture de la broche DA du MM74C922 (DA= Data Available, indique si une touche est enfonce). Est-il possible de provoquer une interruption sur le PIC lors de l'appui sur une touche du clavier ? II) Etude logicielle: 1) L'afficheur LCD ncessite souvent une initialisation logicielle. Voir organigramme RESET de mise sous tension: initialisation par instruction, quand l'interface est en mode 4 bits de donnes (Sur le document fourni: HOBBYTRONIC N30 Page 13). Compltez l'ordinogramme page rponse N2 et l'extrait de programme en langage C pour le PIC 16F84 en mode 4 bits (Valeurs et commentaires). Ajoutez en italique soulign, les noms des sous programmes, fonctions ou procdures utiliss. 2) Expliquez le rle des deux sous programmes "Aff_Cmd4" et "Aff_Cmde" dans les lignes "Aff_Cmd4(0x20)" et "Aff_Cmde(0x0C)". 3) On souhaite crire un programme permettant l'criture d'un message appel Mesg1 sur la premire ligne de l'afficheur. En vous aidant des extraits suivants, des sous programmes Aff_Car, Aff_Cmde, Aff_Cmd4, Init_LCD, Tempo et de l'ordinogramme du programme principal, proposez un programme complet permettant l'affichage du message (Mesg1). On utilisera un sous programme Affiche_ligne et un pointeur sur Mesg1.
#include <pic.h> /***************************************************************** * En tte remplir avec nom du projet, nom du fichier, date * branchement des ports.... *****************************************************************/ typedef unsigned char byte; // byte en remplacement de unsigned char #define E RB2 A complter #define RS RB #define DA RB #define #define #define #define #define #define #define D100us 7 D10us D40us D1_6ms D4ms LIGNE_1 1 LIGNE_2 2 //7*16us //16us //3*16us = 48us //100*16us = 1.6ms //250*16us = 4ms

//********* Dclaration des constantes ********************************* const char Mesg1[]="Afficheur LCD"; //******** Declaration fonctions & procedures ************************* void InitPort(void); void InitLCD(void); void Affiche_ligne(const byte *, byte); void Place_curseur(byte, byte);
PICLCD5

Page N2

Gestion d'un afficheur LCD et d'un clavier avec le PIC16F84 ou le 16F876


void Aff_Car(register char); void Aff_Cmde(byte); void Aff_Cmd4(byte); void Tempo(byte); //******************** PROGRAMME PRINCIPAL *************************** void main (void) { A complter } //********************* Fonctions (Sous programmes) ******************* void Affiche_ligne(const byte* Pointeur_caract, byte Ligne) { A complter } //******************** Affiche un caractre sur le LCD **************** void Aff_Car (byte caractere) { PORTB = caractere & 0xf0; RS = 1; A complter pour passer E 1 pendant la dure D10us dfinie au dbut, puis repasser E 0 PORTB = (caractere<<4) & 0xf0; RS=1; A complter comme ci dessus (impulsion sur E) RS = 0 ; Tempo(D40us); } //*************** Positionne curseur ********************************** void Place_curseur(byte Position, byte Ligne) { if (Ligne==1) Aff_Cmde(0x80 + Position); A complter si Ligne = 2 } //******************** Affiche commande LCD *************************** void Aff_Cmde(byte Valeur) { PORTB = Valeur & 0xf0; A complter (impulsion sur E) PORTB = (Valeur<<4) & 0xf0; A complter (impulsion sur E) Tempo(D40us); } //******************** Affiche commande 4 BITS uniquement ************* void Aff_Cmd4(byte Valeur) { PORTB = Valeur & 0xf0; A complter (impulsion sur E) Tempo(D40us); } //************************ Initialisation des Ports ******************* void InitPort(void) { TRISB = 0b ; // RB7 RB1 donnes RS, EN, RW en sortie TRISA = ; // PORTA en entre pour clavier PORTB=0; } //************************ Initialisation du LCD ********************** void InitLCD(void) { Tempo(D4ms); // Tempo(D4ms); Tempo(D4ms); Tempo(D4ms);
PICLCD5

Page N3

Gestion d'un afficheur LCD et d'un clavier avec le PIC16F84 ou le 16F876


Aff_Cmd4(0x30); Tempo(D4ms); Aff_Cmd4(0x30); Tempo(D100us); Aff_Cmd4(0x30); Tempo(D100us); Aff_Cmd4(0x20); Aff_Cmde(0x28); Aff_Cmde(0x0C); Aff_Cmde(0x ); Tempo(D4ms); Aff_Cmde(0x06); } //********************** Tempo **************************************** // CE: duree donne la valeur de la temporisation effectue void Tempo(byte duree) { byte i, j ; for (i=0; i<duree; i++) { for (j=2;j--;) continue;// tempo 16us } }

// Fin du Reset logiciel du LCD // Commande en mode 4 Bits // N=1 => 1/16, F=0 =>5x7 points // D=1 => Display on, sans curseur // Display clear => tempo longue > 1.64ms // Autoincrmentation DDRAM adresse

Ordinogramme du programme de Gestion de l'afficheur LCD Dbut Programme principal Initialisations direction des ports
Initialisation afficheur
Init_Port

Init_LCD

positionnement cuseur au dbut (1re ligne)


Pointeur sur texte1 afficher Mesg1 Affichage d'un texte fin (Attente ou boucle sur Affiche ligne ou gestion du clavier)
Affiche_ligne(Mesg1,LIGNE_1)

4) Indiquez l'intrt des passages de paramtres: " Affiche_ligne (Mesg1,LIGNE_1); ". 5) Modifiez le programme principal, afin d'afficher un message "Mesg2" sur la deuxime ligne. 6) Modifiez le programme principal, en vous aidant de la documentation du circuit MM74C922 ou en grant directement un multiplexage complet dans le cas de la carte MILLENNIUM, afin d'afficher un endroit fixe de l'afficheur LCD, le caractre correspondant la touche enfonce sur le clavier. On utilisera un tableau "Table_ASCII" donnant les caractres ASCII correspondant aux codes fournis par le clavier. ALGORITHME respecter dans le cas du 74C922:
PICLCD5

Page N4

Gestion d'un afficheur LCD et d'un clavier avec le PIC16F84 ou le 16F876 - Si DA =1 => Lecture du clavier et rsultat dans code (valeur de 0 15, car 16 touches). - Si DA = 0 => imposer code 16. Rem: Le tableau "Table_ASCII" se terminera par l'espace afin d'effacer le caractre lorsqu'aucune touche n'est enfonce. - Prendre caractre ASCII correspondant code dans le tableau "Table_ASCII". - Placer le curseur un emplacement libre de l'afficheur. - Afficher le caractre correspondant la touche. Dans le cas de la carte MILLENIUM, il faut remplacer les deux lignes "Si DA..." par une scrutation complte du clavier (Sous programme crire).

- Travail a faire en classe:


1) Procdez la cration d'un projet "LCD4-F84" ou "LCD4-F87" sur MPLAB en utilisant le compilateur HI-TECH PIC C, et la saisie du programme en C, permettant l'affichage du message "Mesg1" sur la premire ligne de l'afficheur. 2) Vrifiez le fonctionnement sur la carte PIC-LCD-Clavier, ou la carte MILLENNIUM en tablissant le cblage de la partie afficheur LCD sur lq carte " PIC Millenium Board". 3) Compltez le programme principal, afin d'afficher un message "Mesg2" sur la deuxime ligne de l'afficheur LCD. 4) Vrifiez le fonctionnement du programme en langage C. 5) Vrifiez le fonctionnement du programme avec l'afficheur et le clavier sur la carte PIC-LCD-Clavier ou la carte MILLENNIUM.

PICLCD5

Page N5

Gestion d'un afficheur LCD et d'un clavier avec le PIC16F84 ou le 16F876

- Feuille RPONSE N1:


I.) Etude structurelle. 1.) Tableau N1:
RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0

Nom:

RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

2.) Valeur des registres TRISA et TRISB: TRISA = = (en hxa)

TRISB =

(en hexa)

3.) Rle des broches Vss, Vdd, Vo, RS, R/W, EN, D0 D7 de l'afficheur LCD.

Cblage de la broche R/W et rle de la rsistance R9.

4.) Mode de fonctionnement de l'afficheur LCD: (Justifiez rapidement).

5.) Algorithme d'criture d'un caractre (Data = 1 octet) en mode 4 bits.

6.) Gestion de la broche DA par interruption: (Expliquez).

PICLCD5

Page N6

Gestion d'un afficheur LCD et d'un clavier avec le PIC16F84 ou le 16F876

- Feuille rponse N2:


II.) Analyse et synthse logicielle.
Dbut Sous Programme InitLCD Temporisation de plus de 15ms
Ecrit commande Quartet 0x3
Tempo(duree)

Nom:

1.) Initialisation logicielle de l'afficheur LCD en mode 4 bits.

Aff_Cmd4(Octet) transmet le quartet de poids fort uniquement

Temporisation de plus de
Ecrit commande Quartet

Temporisation de plus de
Ecrit commande Quartet 0x3 Ecrit commande Quartet 0x2 Ecrit commande Octets de configuration fin SP

//************ Initialisation du LCD ******** void InitLCD(void) { Tempo(D4ms); Tempo(D4ms); Tempo(D4ms); Tempo(D4ms); A complter Aff_Cmd4(0x30); Tempo(D4ms); Aff_Cmd4(0x30); Tempo(D100us); Aff_Cmd4(0x30); // Fin du Reset logiciel du LCD Tempo(D100us); Aff_Cmd4(0x20); // Commande en mode 4 Bits Aff_Cmde(0x28); // N=1 => 1/16, F=0 =>5x7 points Aff_Cmde(0x0C); // Aff_Cmde // Display clear => tempo longue > 1.64ms Tempo(D4ms); Aff_Cmde(0x06); // Autoincrmentation DDRAM adresse }

2) Rle des deux sous programmes "Aff_Cmd4" et "Aff_Cmde" et explication des lignes "Aff_Cmd4(0x20)" et "Aff_Cmde(0x0C)".

PICLCD5

Page N7

5V C1 C2 100nF J1 3 5V 2 1 R3 Jack 3.5mm D1 1N4001 2 1 Baterrie INTER1 On / Off 12V C4 REG1 IN OUT J2 GND 7805 C5 22uF 16V C6 100nF LED1 Led rouge C7 5V 330 18pF 5V R2 10k RA0 RA1 RA2 RA3 RA4 17 18 1 2 3 C3 18pF Q1 4MHz R1 10M 16 15 4 U1

Gestion d'un afficheur LCD et d'un clavier avec le PIC16F84 ou 16F87X

PICLCD5 Page N10


Cavalier

14

100uF 50V

Vdd OSC1 / CLKIN OSC2 / CLKOUT MCLR / Vpp RB0 / INT RB1 RA0 RB2 RA1 RB3 RA2 RB4 RA3 RB5 RA4 RB6 RB7 Vss PIC16F84 5

6 7 8 9 10 11 12 13

RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7

10nF

0
5V

R4 330 5V LED2 Led verte J3 1 2 3 HE14 1x3 J4 1 2 3 4 5 6 HE14 1x6 J5 1 2 3 HE14 1x3 RB1 RA4 5V 5V 12V 5V R5 18k C9 RV1 RB3 2.2k RB2 R7 47k JP1 HE1 Y4 Y3 Y2 Y1 X4 X3 X2 X1 8 7 6 5 4 3 2 1 Y4 Y3 Y2 Y1 X4 X3 X2 X1 Y[1..4] Y1 Y2 Y3 Y4 X1 X2 X3 X4 1 2 3 4 11 10 8 7 U2 VCC ROWY1 ROWY2 ROWY3 ROWY4 CLMX1 CLMX2 CLMX3 CLMX4 GND MM74C922 9 OA OB OC OD DA OE KB OSC 17 16 15 14 12 13 6 5 RA0 RA1 RA2 RA3 RB0 R6 330 C10 100nF C11 LED3 1uF Led Jaune 18 C8 100nF

0
5V T1 BC547

100nF

0
R9 47k

R8 47k R10 47k R11 47k RB4 RB5 RB6 RB7

1 2 3 4 5 6 7 8 9 10 11 12 13 14

Vss Vdd V0 RS R/W EN D0 D1 D2 D3 D4 D5 D6 D7 LCD2x16

X[1..4]

HE14 1x8

JP2 X4 X3 X2 X1 Y1 Y2 Y3 Y4 1 2 3 4 5 6 7 8 X4 X3 1 X2 X1 4 Y1 Y2 7 Y3 Y4 *

0
2 5 8 0 3 6 9 A B C D
BTS Electronique Lycee M. GENEVOIX Title Size A4 Date: Document Number 1

CLAVIER16_T

Auteur Mr ROHMER

Carte PIC_LCD_clavier (PicLCD.dsn)


Rev 2.0 Sheet 1 of 1

Monday, September 30, 2002

Vous aimerez peut-être aussi