Bonjour,
Je tente d'initialiser un LCD GDM 1601C (datasheet: http://www.xmocular.com/upload_img/2007110149304469.pdf) via l'utilisation d'un PIC16F819 (datasheet: http://oap.sourceforge.net/datasheets/PIC16F819.pdf) câblé en mode 4bits (R/W à 0V fixe) en langage assembleur.
Le câblage est réalisé comme suit :
- D4 à D7 sur RB4 à RB7
- RS sur RB1
- E sur RB2
J'ai écris une routine (inspiré de celle-ci : http://meteosat.pessac.free.fr/Cd_el...Pic/cramer.zip) permettant théoriquement l'initialisation du LCD mode 4bits jusqu'à l'effacement de l'affichage, cependant, rien ne se passe. Seul la moitié de la ligne de l'afficheur est grisée (par défaut à l'allumage), rien de plus.
J'aimerais savoir si ma routine est correcte, et digne de fonctionner. Normalement, toute la partie configuration du PIC est correcte mais reste cependant à être confirmée.
Je vous joins entièrement mon fichier .asm :
Je vous remercie d'avance,Code:LIST p=16F819 #INCLUDE <p16F819.inc> __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _BODEN_OFF & _MCLR_OFF & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_IO ;- - - - - - - - - - - -; ; ASSIGNATIONS ; ;- - - - - - - - - - - -; OPTIONVAL EQU B'00000000' ; valeur registre option, Resistance pull-up ON, Interrupt flanc descendant RB0 OSCCONVAL EQU B'01100100' ; F=4MHZ stable ADCON1VAL EQU B'00000110' ; config A/D PortA = toutes en digitales DIRPORTA EQU B'11111011' ; config I/O PortA = RA2 en sortie, reste en entrées DIRPORTB EQU B'00001001' ; config I/O PortB = RB7 à 4 + RB1 et RB2 en sorties, reste en entrées LCD_DATA EQU PORTB ;- - - - - - - - - -; ; DEFINES ; ;- - - - - - - - - -; #DEFINE E PORTB,2 #DEFINE RS PORTB,1 ;- - - - - - - - - -; ; MACROS ; ;- - - - - - - - - -; BANK0 macro ; passer en banque 0 bcf STATUS,RP0 bcf STATUS,RP1 endm BANK1 macro ; passer en banque 1 bsf STATUS,RP0 bcf STATUS,RP1 endm ;- - - - - - - - - - -; ; VARIABLES ; ;- - - - - - - - - - -; CBLOCK 0x020 ; début de la zone variables Char, temp1, temp2, temp3, Temp ENDC ; fin de la zone ;- - - - - - - - - - - - - - - - -; ; DEMARRAGE RESET ; ;- - - - - - - - - - - - - - - - -; org 0x000 ; adresse de départ après reset goto INIT ;- - - - - - - - - - - - -; ; INITIALISATIONS ; ;- - - - - - - - - - - - -; INIT clrf PORTA ; sorties portA à 0 clrf PORTB ; sorties portB à 0 BANK1 ; sélectionne la banque 1 movlw OPTIONVAL ; charge masque OPTIONVAL movwf OPTION_REG ; initialiser registre OPTION_REG movlw OSCCONVAL ; charge masque OSCCONVAL movwf OSCCON ; initialise registre OSCCON clrf OSCTUNE ; center frequency (a verif) movlw ADCON1VAL ; charge masque ADCON1VAL movwf ADCON1 ; initialise registre ADCON1 movlw DIRPORTA ; charge masque DIRPORTA movwf TRISA ; initialise registre TRISA movlw DIRPORTB ; charge masque DIRPORTB movwf TRISB ; initialise registre TRISB ; Boucle0 effacement RAM BANK1 (32octets) movlw 0xA0 ; initialisation pointeur movwf FSR ; pointeur d'adressage indirect DEL_RAM1 clrf INDF ; effacer ram banque 1 incf FSR,f ; pointer sur adresse suivante btfss FSR,7 ; tester si fin zone atteinte (>=80) goto DEL_RAM1 ; non, boucler btfss FSR,6 ; tester si fin zone atteinte (>=C0) goto DEL_RAM1 ; non, boucler BANK0 ; repasser banque 0 ; Boucle1 effacement RAM BANK0 (96octets) movlw 0x20 ; initialisation pointeur movwf FSR ; pointeur d'adressage indirect DEL_RAM0 clrf INDF ; effacer ram banque 0 incf FSR,f ; pointer sur adresse suivante btfss FSR,7 ; tester si fin zone atteinte (>=80) goto DEL_RAM0 ; non, boucler goto START ; sauter au programme principal ;- - - - - - - - - - - - - - - - - - -; ; PROGRAMME PRINCIPAL ; ;- - - - - - - - - - - - - - - - - - -; START call LCD_INIT bsf RS ; mode *envoi caractères* movlw 0x41 ; envoi du caractère 'A' call SEND_Data boucle: bsf PORTA,2 goto boucle ;- - - - - - - - - - - - - - - - - - -; ; INITIALISATION LCD ; ;- - - - - - - - - - - - - - - - - - -; LCD_INIT: bcf E ; efface toutes lignes de contrôles bcf RS call Temp40ms call Temp40ms movlw 0x0f andwf LCD_DATA,f ; efface emplacement donnée movlw 0x30 ; initialisation LCD en mode 8-bits (obligatoire) iorwf LCD_DATA,f ; envoi quartet au LCD call E_PULSE ; valide la commande plusieurs fois call Temp40ms call E_PULSE call Temp40ms call E_PULSE movlw 0x0f andwf LCD_DATA,f ; efface emplacement donnée movlw 0x20 ; initialisation LCD en mode *4-bits* iorwf LCD_DATA,f ; envoi quartet au LCD call E_PULSE ; valide la commande call Temp41µs call Temp40ms movlw 0x20 ; mode *4-bits* au LCD, 1 ligne, caractère 5*8 call SEND_Data ; routine d'envoi de donnée par mode 4-bits (maintenant utilisable, car LCD en mode 4-bits) call Temp41µs call Temp40ms movlw 0x08 ; affichage *ON*, curseur *ON*, clignotement du curseur *ON* call SEND_Data call Temp41µs call Temp40ms movlw 0x18 ; déplacement du *curseur* vers la *droite* call SEND_Data call Temp41µs call Temp40ms movlw 0x01 ; effacement du LCD call SEND_Data call Temp1640µs call Temp40ms return ;- - - - - - - - - - - - - - - - - - -; ; SOUS-ROUTINES ; ;- - - - - - - - - - - - - - - - - - -; E_PULSE: nop ; est-ce nécessaire ? à tester nop bsf E nop ; tempo de 0.5µs (supérieur à 450ns) nop nop bcf E nop nop return SEND_Data: movwf Char ; stocke caractère de W à Char pour traitement call Temp1640µs call Temp1640µs call Temp1640µs movlw 0x0f andwf LCD_DATA,f ; efface emplacement donnée (nécessaire car utilisation d'un 'ior' après) movf Char,w andlw 0xF0 ; masque quartet faible iorwf LCD_DATA,f ; envoi quartet au LCD (sans toucher au sorties utilisées par d'autres éventuels périphériques) call E_PULSE ; valide la (demi) donnée movlw 0x0f andwf LCD_DATA,f ; efface emplacement donnée swapf Char,w ; inverse les quartets andlw 0xF0 ; masque quartet fort (précédemment inversé avec le faible, donc toujours même masque) iorwf LCD_DATA,f ; envoi quartet au LCD call E_PULSE ; valide la (demi) donnée return Temp41µs: ; tempo de 164 cycles movlw d'53' ; nb cycles = 3*var + 5 movwf temp1 loop: decfsz temp1,f goto loop return Temp1640µs: ; tempo de 6685 cycles (idéal = 6560) movlw d'40' ; nb cycles = var(164+3) + 5 ; (le call est déjà compté dans le 164 cycles) movwf temp2 loop1: call Temp41µs decfsz temp2,f goto loop1 return Temp40ms: movlw d'24' movwf temp3 loop2: call Temp1640µs decfsz temp3,f goto loop2 return END ; directive fin de programme
GearsGL
-----