Bonjour,
J'essai de programmer un ecran LCD 16 caractères * 2 lignes philips ltn214r-10 avec un pic 16f877a mais sans succès
J'ai fait le tour des forums que j'ai pu trouver avec google et j'ai meme essayé d'adapter les programmes donnés sur mon pic mais ca n'a pas marché non plus
Voici le code assembleur :
LIST p=16F877 ; Définition de processeur
#include <p16F877.inc> ; fichier include
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
;***************************** ****************************** ******************
; ASSIGNATIONS SYSTEME *
;***************************** ****************************** ******************
; REGISTRE OPTION_REG (configuration)
; -----------------------------------
OPTIONVAL EQU B'10000000' ;pour la led
; RBPU b7 : 1= Résistance rappel +5V hors service
; INTEDG b6 : 1= Interrupt sur flanc montant de RB0
; 0= Interrupt sur flanc descend. de RB0
; TOCS b5 : 1= source clock = transition sur RA4
; 0= horloge interne
; TOSE b4 : 1= Sélection flanc montant RA4(si B5=1)
; 0= Sélection flanc descendant RA4
; PSA b3 : 1= Assignation prédiviseur sur Watchdog
; 0= Assignation prédiviseur sur Tmr0
; PS2/PS0 b2/b0 valeur du prédiviseur
; 000 = 1/1 (watchdog) ou 1/2 (tmr0)
; 001 = 1/2 1/4
; 010 = 1/4 1/8
; 011 = 1/8 1/16
; 100 = 1/16 1/32
; 101 = 1/32 1/64
; 110 = 1/64 1/128
; 111 = 1/128 1/256
;***************************** ****************************** ******************
; DEFINE *
;***************************** ****************************** ******************
#DEFINE LCD_D0 PORTB,0 ; Données LCD sur Port B
#DEFINE LCD_D1 PORTB,1 ; Données LCD sur Port B
#DEFINE LCD_D2 PORTB,2 ; Données LCD sur Port B
#DEFINE LCD_D3 PORTB,3 ; Données LCD sur Port B
#DEFINE LCD_D4 PORTB,4 ; Données LCD sur Port B
#DEFINE LCD_D5 PORTB,5 ; Données LCD sur Port B
#DEFINE LCD_D6 PORTB,6 ; Données LCD sur Port B
#DEFINE LCD_D7 PORTB,7 ; Données LCD sur Port B
#DEFINE LCD_EN PORTC,0 ; LCD Enable sur RB0
#DEFINE LCD_RW PORTC,1 ; LCD Read/Write sur RC1
#DEFINE LCD_RS PORTC,2 ; LCD Register-Select sur RC2
;***************************** ****************************** ******************
; MACRO *
;***************************** ****************************** ******************
BANK0 macro ; passer en banque0
bcf STATUS,RP0
bcf STATUS,RP1
endm
BANK1 macro ; passer en banque1
bsf STATUS,RP0
bcf STATUS,RP1
endm
BANK2 macro ; passer en banque2
bcf STATUS,RP0
bsf STATUS,RP1
endm
BANK3 macro ; passer en banque3
bsf STATUS,RP0
bsf STATUS,RP1
endm
;***************************** ****************************** ******************
; VARIABLES BANQUE 0 *
;***************************** ****************************** ******************
; Zone de 80 bytes
; ----------------
CBLOCK 0x20 ; Début de la zone (0x20 à 0x6F)
TEMP0 : 1 ;variables temporaires
TEMP1 : 1
TEMP2 : 1
TEMP3 : 1
ENDC ; Fin de la zone
;***************************** ****************************** ******************
; 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
clrf PCLATH ; Effacer sélecteur de pages
; 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
clrf PORTE ; sorties PORTE à 0
bsf STATUS,RP0 ; passer en banque1
movlw 0x000 ; Direction PORTB
movwf TRISB ; écriture dans registre direction
movlw 0x000 ; Direction PORTC
movwf TRISC ; écriture dans registre direction
movlw 0x000 ; Direction PORTD
movwf TRISD ; écriture dans registre direction
movlw 0x000 ; Direction PORTE
movwf TRISE ; écriture dans registre direction
; Registre d'options (banque 1)
; -----------------------------
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option
goto start ; programme principal
;***************************** ****************************** **********
; SOUS PROGRAMME
;***************************** ****************************** **********
;============================= ============================== ==================
; Delay_100µs:
; Ce programme permet de temporiser le programme en fonction de W
; le délai obtenu est environ de 100 µs/unité (de W)
; Registre modifié : TEMP0
;le pic exécute 1 MIPS, ma première boucle compte 4 cycles, pour perdre 100µs je dois la faire 25 fois
;============================= ============================== ==================
Delay_100µs
movwf TEMP0 ; +1 1 cycle
MOVLW d'24' ; +1 1 cycle
ADDLW -1 ; +1 1 cycle
BTFSS STATUS, Z ; +1 1 cycle
GOTO $ - 2 ; +2 2 cycles
decfsz TEMP0, f ; +1 1 cycle
goto $ - 5 ; +2 2 cycles
return ; +1 1 cycle
;============================= ============================== ==================
; LCD_Init
; Initialisation du module LCD
; appel des procédures : Delay, LCD_Send, LCD_Clear
; registre modifié : TEMP0
;============================= ============================== ==================
LCD_Init
;Debut de la première phase========================= ==========================
bcf LCD_RS ; Choix des registres LCD
bcf LCD_RW
movlw d'150' ; Attendre au moins 15 ms
call Delay_100µs
movlw b'00110000' ; Function set
call LCD_Send
movlw d'41' ; Attendre au moins 4,1 ms
call Delay_100µs
movlw b'00110000' ; Function set
call LCD_Send
movlw d'1' ; Attendre au moins 100 µs
call Delay_100µs
movlw b'00110000' ; Function set
call LCD_Send
;Fin de la première phase========================= =====================
movlw b'00111000' ; Sélection de l'interface 8 bits : -- 0 0 1 1 1 0 0 0
call LCD_Send
movlw b'00001000'
call LCD_Send
movlw b'00000001'
call LCD_Send
movlw b'00000111'
call LCD_Send
return
;============================= ============================== ==================
; LCD_Clear
; Effaçage du LCD et retour du curseur à l'origine
; appel de la procédure : LCD_Cmd
; registres modifiés : TEMP0, TEMP1 (LCD_Cmd)
;============================= ============================== ==================
LCD_Clear
MOVLW 0x001
CALL LCD_Send
RETURN
;============================= ============================== ==================
; LCD_Home
; Retour du curseur à l'origine
; appel de la procédure : LCD_Cmd
; registres modifiés : TEMP0, TEMP1 (LCD_Cmd)
;============================= ============================== ==================
LCD_Home
MOVLW 0x002
CALL LCD_Send
RETURN
;***************************** ****************************** ******************
; Deplacement du curseur de 1 vers la droite
;***************************** ****************************** ******************
C_D
movlw b'00010100' ;seul le curseur se deplace vers la droite
call LCD_Send
return
;***************************** ****************************** ******************
;***************************** ****************************** ******************
LCD_Send
BANK1 ;selection de la banque 1
bcf LCD_D7 ; Données du LCD en sortie
bcf LCD_D6
bcf LCD_D5
bcf LCD_D4
bcf LCD_D3 ; Données du LCD en sortie
bcf LCD_D2
bcf LCD_D1
bcf LCD_D0
BANK0 ; sélection du banc 0
bcf LCD_RW ; Ceci est une commande d'écriture
nop
movwf TEMP1
bcf LCD_D0
bcf LCD_D1
bcf LCD_D2
bcf LCD_D3
bcf LCD_D4
bcf LCD_D5
bcf LCD_D6
bcf LCD_D7
bsf LCD_EN ; Validation de la commande
nop
movlw d'1' ; Attendre au moins 100 µs
call Delay_100µs
btfsc TEMP1,0
bsf LCD_D0
btfsc TEMP1,1
bsf LCD_D1
btfsc TEMP1,2
bsf LCD_D2
btfsc TEMP1,3
bsf LCD_D3
btfsc TEMP1,4
bsf LCD_D4
btfsc TEMP1,5
bsf LCD_D5
btfsc TEMP1,6
bsf LCD_D6
btfsc TEMP1,7
bsf LCD_D7
;en ecriture sur le LCD les infos sont prises en comptes sur le front descendant de EN
bcf LCD_EN ; Fin de commande et enregistrement par le LCD
return
;***************************** ****************************** ******************
;***************************** ****************************** ******************
; PROGRAMME PRINCIPAL *
;***************************** ****************************** ******************
start
BANK0
movlw d'150' ; Attendre au moins 15 ms
call Delay_100µs
CALL LCD_Init
movlw d'150' ; Attendre au moins 15 ms
call Delay_100µs
CALL LCD_Clear
movlw d'150' ; Attendre au moins 15 ms
call Delay_100µs
call LCD_Home
movlw d'1' ; Attendre au moins 100 µs
call Delay_100µs
;affichage d'un L
bsf LCD_RS ;selection du registre de données
bcf LCD_RW ;ordre d'ecriture dans le LCD
movlw b'01001100'
CALL LCD_Send
AFF
goto AFF
END ; directive fin de programme
J'utilise un quartz a 4Mhz.
J'espère que quelqu'un pourra m'aider...
-----