;***************************************************************************** ; Ce sous-programme est destiné à être utilisé sur la Maquette à PIC16F877. ; ; Fonction : gestion de l'affichage sur un LCD de 2 lignes de 24 caractères ; ; Les 3 bits LSB du Port C et le port B est utilisé pour l'affichage et le clavier ; ;***************************************************************************** ; Déclarations LCD ;***************************************************************************** ;LCD_DATA EQU PORTB ; Lignes de données du LCD ;LCD_DATA_TRIS EQU TRISB ;LCD_CTRL EQU PORTC ; Lignes de Contrôle du LCD ; ;LCD_LINE0 EQU 0x000 ;LCD_LINE1 EQU 0x040 ; ; PORTC bits ;LCD_E EQU 0 ; LCD Enable control line ;LCD_RW EQU 1 ; LCD Read/Write control line ;LCD_RS EQU 2 ; LCD Register-Select control line ; ; misc. ;LCD_TEMP RES 1 ; LCD (variable temporaire) ;LCD_TEMP2 RES 1 ; LCD (variable temporaire bis) ;***************************************************************************** ; Routines : ; LCDINIT : initialisation du module LCD ; LCDBUSY : on garde la main tant que le module LCD est occupé ; LCDCLEAR : Effaçage de l'écran LCD ; LCDHOME : Retour à gauche ; LCDEMODE(W) : mise en mode Entry (W) ; LCDDMODE(W) : mise en mode DISPLAY (W) ; LCDPUTCHAR(W) : Ecriture d'un caratère ; LCDPUTCMD(W) : Ecriture d'une commande ;***************************************************************************** ; Programme LCD.ASM ; mise à jour 31/03/00 ; Auteur WEISS Jacques ; ;***************************************************************************** ;***************************************************************************** ; Sous-Programmes ;***************************************************************************** ;***************************************************************************** ; ;============================================================================= ; LCDINIT ; Initialisation du module LCD ;============================================================================= LCDINIT CLRF LCD_CTRL ; Lignes de contrôle à '0' MOVLW 0x01E ; tempo CALL X_DELAY500 ; 30 * 0.5mS = 15mS MOVLW 0x038 ; interface 8 bits, 2-lignes CALL LCDPUTCMD MOVLW 0x000 ; disp.off, curs.off, no-blink CALL LCDDMODE CALL LCDCLEAR MOVLW 0x004 ; disp.on, curs.off CALL LCDDMODE MOVLW 0x002 ; auto-inc (shift-cursor) CALL LCDEMODE RETURN ;============================================================================= ; LCD_ENABLE ; Envoi d'une impulsion sur la ligne de contrôle LCD_Enable ;============================================================================= LCD_ENABLE BSF LCD_CTRL, LCD_E ; LCD E-line High BCF LCD_CTRL, LCD_E ; LCD E-line Low RETURN ;============================================================================= ; LCDBUSY ; Attente de libération du module LCD (busy-flag à '0') ;============================================================================= LCDBUSY BANKSEL TRISB ; Passage au banc 1 MOVLW 0x0FF ; PORT B en entrée MOVWF LCD_DATA_TRIS BANKSEL PORTB ; Retour au banc 0 BCF LCD_CTRL, LCD_RS ; Module LCD en mode "commande" BSF LCD_CTRL, LCD_RW ; Opération de lecture BSF LCD_CTRL, LCD_E ; LCD Enabled MOVF LCD_DATA, W ; Lecture : busy flag + DDram @ BCF LCD_CTRL, LCD_E ; LCD Disabled ANDLW 0x7F ; Extraction du compteur d'@ DDram XORLW 0x7F ; si 'FF', alors, il n'y a pas de LCD SKPNZ ; on sort alors du sous-programme GOTO LCDNOTBUSY BSF LCD_CTRL, LCD_E ; LCD Enabled (bis) MOVF LCD_DATA, W ; Lecture : busy flag + DDram @ BCF LCD_CTRL, LCD_E ; LCD Disabled ANDLW 0x80 ; Vérification : Busy flag, '1' = Busy SKPZ GOTO LCDBUSY LCDNOTBUSY BCF LCD_CTRL, LCD_RW ; orientation en écriture BANKSEL TRISA ; Passage au banc 1 MOVLW 0x000 MOVWF LCD_DATA_TRIS ; PORT B en sortie BANKSEL PORTA ; Retour au banc 0 RETURN ;============================================================================= ; LCDCLEAR ; Effaçage du LCD et retour du curseur à l'origine ;============================================================================= LCDCLEAR MOVLW 0x001 CALL LCDPUTCMD RETURN ;============================================================================= ; LCDHOME ; Retour du curseur à l'origine ;============================================================================= LCDHOME MOVLW 0x002 CALL LCDPUTCMD RETURN ;============================================================================= ; LCDEMODE ; Place le module LCD en mode "Entry" ; Le mode doit être placé dans W : ; b0 : 0 = pas de décalage de l'affichage 1 = décalage de l'affichage ; b1 : 0 = auto-décrémentation 1 = auto-incrémentation ; b2-7 : x ;============================================================================= LCDEMODE ANDLW 0x003 ; élimination des bits de poids fort IORLW 0x004 ; définition de la fonction CALL LCDPUTCMD RETURN ;============================================================================= ; LCDDMODE ; Contrôle de l'affichage ; Le mode doit être défini dans W ; b0 : 0 = cursor blink off 1 = cursor blink on ; b1 : 0 = cursor off 1 = cursor on ; b2 : 0 = display off 1 = display on (display data remains in DDRAM) ; b3-7 : x ; OK ;============================================================================= LCDDMODE ANDLW 0x007 ; élimination des bits de poids fort IORLW 0x008 ; définition de la fonction CALL LCDPUTCMD RETURN ;============================================================================= ; LCDSCGA ; Définition de l'adresse Character-Generator-RAM ; les données CGRAM sont lues après cette opération ; L'adresse CGRAM doit se trouver dans W : ; b0-5 : required CGRAM address ; b6-7 : don't care ;============================================================================= LCDSCGA ANDLW 0x03F ; élimination des bits de poids fort IORLW 0x040 ; définition de la fonction CALL LCDPUTCMD RETURN ;============================================================================= ; LCDSDDA ; Définition de l'adresse Display-Data-RAM ; les données DDRAM sont lues après cette opération ; L'adresse DDRAM doit se trouver dans W : ; b0-6 : adresse DDRAM ; b7 : x ;============================================================================= LCDSDDA IORLW 0x080 ; définition de la fonction CALL LCDPUTCMD RETURN ;============================================================================= ; LCDGADDR ; Renvoi la valeur du compteur d'adresses (utilisé par DDRAM et CGRAM) ; L'adresse est renvoyée dans W ;============================================================================= LCDGADDR BANKSEL TRISB ; Passage au banc 1 MOVLW 0x0FF ; PORT B en entrée MOVWF LCD_DATA_TRIS BANKSEL PORTB ; Retour au banc 0 BCF LCD_CTRL, LCD_RS ; Module LCD en mode "commande" BSF LCD_CTRL, LCD_RW ; Setup to read busy flag BSF LCD_CTRL, LCD_E ; LCD Enabled MOVF LCD_DATA, W ; Read busy flag + RAM address BCF LCD_CTRL, LCD_E ; LCD Disabled ANDLW 0x07F ; Strip upper bit BCF LCD_CTRL, LCD_RW BANKSEL TRISB ; Passage au banc 1 MOVLW 0x000 MOVWF LCD_DATA_TRIS ; PORT B en sortie BANKSEL PORTB ; Retour au banc 0 RETURN ;============================================================================= ; LCDPUTCHAR ; Affichage d'un caractère sur le LCD ; Le caractère doit se trouver dans W ;============================================================================= LCDPUTCHAR MOVWF LCD_TEMP ; Stockage du caractère MOVWF TXREG ; envoi sur la ligne RS232 MOVLW 0x05 CALL X_DELAY500 CALL LCDBUSY ; Attente de disponibilité du module LCD BCF LCD_CTRL, LCD_RW ; Opération de lecture BSF LCD_CTRL, LCD_RS ; Module LCD en mode "data" BSF LCD_CTRL, LCD_E ; LCD Enabled MOVF LCD_TEMP, W MOVWF LCD_DATA ; Envoi de la donnée au module LCD BCF LCD_CTRL, LCD_E ; LCD Disabled RETURN ;============================================================================= ; LCDPUTCMD ; Envoi d'une commande au module LCD ; La commande doit se trouver dans W ;============================================================================= LCDPUTCMD MOVWF LCD_TEMP ; stockage de la commande CALL LCDBUSY ; Attente de disponibilité du module LCD BCF LCD_CTRL, LCD_RW ; Opération de lecture BCF LCD_CTRL, LCD_RS ; Module LCD en mode "commande" BSF LCD_CTRL, LCD_E ; LCD Enabled MOVF LCD_TEMP, W MOVWF LCD_DATA ; envoi de la donnée au module LCD BCF LCD_CTRL, LCD_E ; LCD Disabled RETURN