Bonjour,
Actuellement en train de développer un projet à l'aide d'un PIC16F877, j'ai besoin de piloter un afficheur LCD 128X64, ce que je n'ai jamais fait auparavant !
Il embarque un contrôleur ST7920 et je le commande par liaison série SPI.
Cette dernière fonctionne car je peux envoyer mes instructions d'initialisation ou de placement de mon curseur.
Dans un premier temps, j'essaie d'apprendre à utiliser les caractères présents dans la GROOM avant de passer à l'affichage graphique mais même ça je n'y arrive pas !
Je suppose que je m'y prends mal et c'est pourquoi je joint un extrait de mon programme en assembleur (dsl j'ai appris comme ça et je connais pas le C) qui comporte notamment l'initialisation de l'afficheur et la sous-routine d'envoie de l'octet à l'afficheur en liaison SPI.
Je ne dois pas écrire dans la RAM comme il faut pour afficher mes caractères car le curseur reste à sa place et rien ne bouge.
Si quelqu'un qui aurait déjà piloter ce type d'afficheur pouvait m'aider, ce serait super !
En vous remerciant...
Code:;***************************************************************************** ; VARIABLES BANQUE 0 * ;***************************************************************************** ; Zone de 80 bytes ; ---------------- CBLOCK 0x20 ; Début de la zone (0x20 à 0x6F) CFCHaut : 1 ; Flag Capteur fin de course Haut CFCBas : 1 ; Flag Capteur fin de course Bas FlTempo250 : 1 CmptTempo1 : 1 CmptTempo2 : 1 BclLED : 1 ; Boucle temps allumage LED DonAff1 : 1 ; Octet à envoyer n°1 ;***************************************************************************** ; DEMARRAGE SUR RESET * ;***************************************************************************** org 0x000 ; Adresse de départ après reset clrf PCLATH ; Effacer sélecteur de pages goto init ; Initialiser ; //////////////////////////////////////////////////////////////////////////// ; P R O G R A M M E ; //////////////////////////////////////////////////////////////////////////// ;***************************************************************************** ; INITIALISATIONS * ;***************************************************************************** init ; initialisation PORTS (banque 0 et 1) ; ------------------------------------ BANK0 ; sélectionner banque0 clrf PORTA ; Sorties PORTA à 0 clrf PORTB ; sorties PORTB à 0 clrf PORTC ; sorties PORTC à 0 clrf PORTD ; sorties PORTD à 0 bsf STATUS,RP0 ; passer en banque1 movlw ADCON1VAL ; PORTA en mode digital/analogique movwf ADCON1 ; écriture dans contrôle A/D movlw DIRPORTA ; Direction PORTA movwf TRISA ; écriture dans registre direction movlw DIRPORTB ; Direction PORTB movwf TRISB ; écriture dans registre direction movlw DIRPORTC ; Direction PORTC movwf TRISC ; écriture dans registre direction movlw DIRPORTD ; Direction PORTD movwf TRISD ; écriture dans registre direction movlw DIRPORTE ; Direction PORTE movwf TRISE ; écriture dans registre direction ; Registre d'options (banque 1) ; ----------------------------- movlw OPTIONVAL ; charger masque movwf OPTION_REG ; initialiser registre option ; registres interruptions (banque 1) ; ---------------------------------- movlw INTCONVAL ; charger valeur registre interruption movwf INTCON ; initialiser interruptions movlw PIE1VAL ; Initialiser registre movwf PIE1 ; interruptions périphériques 1 movlw PIE2VAL ; initialiser registre movwf PIE2 ; interruptions périphériques 2 movlw CVRCONVAL ; charger la valeur du registre pour VREF movwf CVRCON ; initialiser le registre movlw CMCONVAL ; charger la valeur du registre des comparateurs movwf CMCON ; initialiser le registre ; Effacer RAM banque 0 ; --------------------- bcf STATUS,RP0 ; sélectionner banque 0 movlw 0x20 ; initialisation pointeur movwf FSR ; d'adressage indirect init1 clrf INDF ; effacer ram incf FSR,f ; pointer sur suivant btfss FSR,7 ; tester si fin zone atteinte (>7F) goto init1 ; non, boucler ; autoriser interruptions (banque 0) ; ---------------------------------- clrf PIR1 ; effacer flags 1 clrf PIR2 ; effacer flags 2 bsf INTCON,GIE ; valider interruptions ; goto start ; programme principal ; Initialisation Liaison série pour Afficheur ; ------------------------------------------- BANK1 movlw B'10000000' ; CKE=0 movwf SSPSTAT ; BANK0 movlw B'00110010' ; Liaison MSSP en service - movwf SSPCON ; CKP=1 Fquartz/64 call Tempo250ms ; Tempo nécessaire à l'initialisation movlw B'11111000' ; movwf DonAff1 ; call Send ; movlw B'00110000' ; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits movwf DonAff1 ; call Send ; movlw B'00000000' ; movwf DonAff1 ; call Send ; call Tempo100us ; movlw B'11111000' ; movwf DonAff1 ; call Send ; movlw B'00000000' ; Dispay ON - Cursor OFF - Character BLINK OFF movwf DonAff1 ; call Send ; movlw B'11110000' ; movwf DonAff1 ; call Send ; call Tempo100us ; movlw B'11111000' ; movwf DonAff1 ; call Send ; movlw B'00000000' ; Clear Display movwf DonAff1 ; call Send ; movlw B'00010000' ; movwf DonAff1 ; call Send ; call Tempo250ms ; movlw B'11111000' ; movwf DonAff1 ; call Send ; movlw B'00000000' ; movwf DonAff1 ; Entry Mode Set call Send ; movlw B'01100000' ; movwf DonAff1 ; call Send ; call Tempo100us ; movlw B'11111000' ; movwf DonAff1 ; call Send ; movlw B'00000000' ; movwf DonAff1 ; Return Home call Send ; movlw B'00100000' ; movwf DonAff1 ; call Send ; call Tempo100us ; goto aff ;********************************************************************* ; SOUS-ROUTINE TEMPO 1 de 250ms (249,564ms) * ;********************************************************************* Tempo250ms BANK0 movlw 0xF3 movwf CmptTempo2 ; ajuster à 249,564 ms BclTempo2 clrf CmptTempo1 ; effacer compteur 2 BclTempo1 nop decfsz CmptTempo1,f ; décrémenter compteur1 goto BclTempo1 ; si pas 0, boucler decfsz CmptTempo2,f ; si 0, décrémenter compteur 2 goto BclTempo2 ; si cmpt2 pas 0, recommencer boucle1 return ;********************************************************************* ; SOUS-ROUTINE TEMPO 1 de 100us * ;********************************************************************* Tempo100us BANK0 movlw 0x20 movwf CmptTempo1 ; ajuster à 249,564 ms BclTempo3 decfsz CmptTempo1,f ; décrémenter compteur1 goto BclTempo3 ; si pas 0, boucler return ;***************************************************************************** ; SOUS-ROUTINE Envoyer octet sur afficheur * ;***************************************************************************** Send BANK0 bsf CSAFF ; sélectionner l'esclave call Tempo100us bcf PIR1,SSPIF ; effacer flag fin de transmission movf DonAff1,w ; charger octet à envoyer à l'afficheur movwf SSPBUF ; lancer le transfert sendloop1 btfss PIR1,SSPIF ; tester si transfert terminé goto sendloop1 ; non, attendre call Tempo100us bcf CSAFF ; désélectionner l'esclave return ; et retour ;***************************************************************************** ; PROGRAMME PRINCIPAL * ;***************************************************************************** aff movlw B'11111000' ; movwf DonAff1 ; call Send ; movlw B'10000000' ; movwf DonAff1 ; DDRAM Adress call Send ; movlw B'00000000' ; movwf DonAff1 ; call Send ; call Tempo100us ; movlw B'11111100' ; movwf DonAff1 ; call Send ; movlw B'10100000' ; movwf DonAff1 ; Write Data call Send ; movlw B'00100000' ; movwf DonAff1 ; call Send ; call Tempo100us ; movlw B'11111100' ; movwf DonAff1 ; call Send ; movlw B'01000000' ; movwf DonAff1 ; Write Data call Send ; movlw B'00100000' ; movwf DonAff1 ; call Send ; call Tempo100us ; goto aff END
-----