Bonjours, j'ai fais l’acquisition d'un écran LCD 2X16 model 1602A eone-1602a1.pdf et je galère depuis plus de 4 jours à essayer de le faire fonctionné. J'ai trouver sur les forum de futura un fichier inc fait par Gilles Chevalerias et modifier par Frank pour s'adapter a différente fréquence d'oscillation. J'ai tout essayer, j'ais l'impression d'avoir épuiser les ressource du net. J'ai eu une lueur d'espoir en appuyant plusieurs fois sur mon bouton reset quand j'ais vue le curseur clignoter.
J'utilise l'oscillateur interne d'un pic 16F88. Est-ce qu'il y a quelque chose qui cloche dans mon code? Je ne comprend plus rien... J'ai penser à une mauvaise fréquence, des sortie mal configuré etc... mon code à changer plusieurs fois.
Le voici.
#include <p16f88.inc>
__CONFIG _CONFIG1, _WDT_OFF & _PWRTE_ON & _INTRC_IO & _MCLR_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF
__CONFIG _CONFIG2, _FCMEN_OFF & _IESO_OFF
INT_VAR UDATA_SHR
LCDtmp res 1
LCDtmp2 res 1
LCDt1 res 1
LCDt2 res 1
LCDt3 res 1
LCDt4 res 1
D0 RES 1
D1 RES 1
STARTUP CODE 0x000
bsf STATUS,RP0
movlw B'01100000' ;4 mHz oscillateur
movwf OSCCON
call Tempo15ms.8MHz ;60 ms pour la stabilisation de l'oscillateur.
call Tempo15ms.8MHz
bcf STATUS,RP0
banksel OPTION_REG
movlw b'10000000';1 pullups off
movwf OPTION_REG
banksel ANSEL
movlw b'00000000' ;tout digital
movwf ANSEL
banksel CMCON
movlw b'00000111' ;comparateur off
movwf CMCON
goto start
start
call LCDinit
tst
goto tst
goto start
; routines en mode 4 Bits avec afficheur à base de HD77480
; ecrite par Gilles Chevalerias
; E.mail:gilles.chevalerias@Ifra nce.com
;
; Pour utiliser cette routine ecrire #include LCD.asm je vous conseillle
; de placer cette ligne juste avant la directive END du programme principal
; la routine s'occupe de mettre en sortie les pins utilisées
; pour les pics 12XXX et 16xxx
; si vous n'avez pas besoin de lire dans l'afficheur, pour lire la position du curseur,
; par exemple, vous pouvez vous passer de LCD_RW qu'il suffit de relier à la masse,
; et de ne pas definir LCD_RW, le cas et prevue
;
; Les commandes:
; LCDinit : initialisation de l'afficheur
; LCDchar : envoi un caractere ( contenu dans w ) sur l'afficheur
; LCDins : envoi une commande ( contenue dans w) à l'afficheur
; LCDcls : efface l'afficheur
; LCDcls2 : efface la deuxieme ligne de l'afficheur
; LCDhome : renvoi le curseur en haut a gauche
; LCDlin1 : renvoi le curseur au debut de la ligne 1
; LCDlin2 : renvoi le curseur au debut de la ligne 2
;
; pour positionner le curseur sur la ligne 1 : movlw 0x80+offset
; call LCDins
;
; pour positionner le curseur sur la ligne 2 : movlw 0xC0+offset
; call LCDins
;
; variables à definir dans le programme principal:
;
; LCDtmp,LCDtmp2 ; LCD
; LCDt1,LCDt2,LCDt3,LCDt4 ; LCD
; D0, D1 ; Tempos
;
; à definir dans le programme principal:
; on peut choisir n'importe quelle E/S du pic
; pour les datas, (D7,D6,D5,D4), il nest pas necessaire que toutes les pins
; soient sur le meme port, ni quelles se suivent, idem pour E,RW,RS
; LEURS AFFECTATIONS SONT TOTALEMENT LIBRES
; attention à RA4 qui est en drain ouvert et que les pins choisies
; soient configurées en E/S numériques
#DEFINE LCD_pin_D7 PORTB,7 ; E/S du pic ou est connectée la pin D7 de l'afficheur
#DEFINE LCD_pin_D6 PORTB,6 ; " " " " D6 " " "
#DEFINE LCD_pin_D5 PORTB,5 ; " " " " D5 " " "
#DEFINE LCD_pin_D4 PORTB,4 ; " " " " D4 " " "
#DEFINE LCD_E PORTB,3 ; " " " " E " " "
#DEFINE LCD_RS PORTB,1 ; " " " " RS " " "
#DEFINE LCD_RW PORTA,2 ; ne pas déclarer LCD_RW si vous ne voulez pas
; l'utiliser, le cas est prevue
; ****************************** ***
; * INSTRUCTIONS PROGRAMMEES *
; ****************************** ***
LCDcls ; effacement de l'ecran
movlw D'01'
call LCDins
call Tempo1.5ms.4MHz ; Tempo 1.5ms @4MHz
; call Tempo1.5ms.8MHz ; Tempo 1.5ms @8MHz
retlw 0
LCDcls2 ; effacement de la deuxieme ligne
movlw D'16'
movwf LCDtmp2
movlw 0xC0
call LCDins
call Tempo1.5ms.4MHz ; Tempo 1.5ms @4MHz
; call Tempo1.5ms.8MHz ; Tempo 1.5ms @8MHz
movlw ' '
call LCDchar
decfsz LCDtmp2,f
goto $-3
retlw 0
LCDhome ; Positionne le curseur an haut a gauche du LCD
movlw D'02'
call LCDins
call Tempo1.5ms.4MHz ; Tempo 1.5ms @4MHz
; call Tempo1.5ms.8MHz ; Tempo 1.5ms @8MHz
retlw 0
LCDlin1 ; positionne le curseur en debut de ligne 1
movlw 0x80
call LCDins
call Tempo1.5ms.4MHz ; Tempo 1.5ms @4MHz
; call Tempo1.5ms.8MHz ; Tempo 1.5ms @8MHz
retlw 0
LCDlin2 ; Positionne le curseur en debut de ligne 2
movlw 0xC0
call LCDins
call Tempo1.5ms.4MHz ; Tempo 1.5ms @4MHz
; call Tempo1.5ms.8MHz ; Tempo 1.5ms @8MHz
retlw 0
LCDchar ; Envoi caractere
movwf LCDtmp
call TEST_BF ; tempo 100µs ou teste de Busy Flag
IFDEF LCD_RW
bcf LCD_RW
ENDIF
bsf LCD_RS
call LCD_envoie_octet
retlw 0
LCDins ; envoi instruction
movwf LCDtmp
call TEST_BF ; tempo 100µs ou teste de Busy Flag
IFDEF LCD_RW
bcf LCD_RW
ENDIF
bcf LCD_RS
call LCD_envoie_octet
retlw 0
; ****************************** ***
; * INITIALISATION DE L'AFFICHEUR *
; ****************************** ***
LCDinit
banksel H'85' ; on passe en bank1 valable pour les pics 16XXX et 12XXX
bcf LCD_E ; on met en sortie toutes les pins utilisées
bcf LCD_RS
IFDEF LCD_RW
bcf LCD_RW
ENDIF
bcf LCD_pin_D7
bcf LCD_pin_D6
bcf LCD_pin_D5
bcf LCD_pin_D4
banksel H'05' ; on revient en bank0
bcf LCD_pin_D7
bcf LCD_pin_D6
bsf LCD_pin_D5
bsf LCD_pin_D4
bcf LCD_E
bcf LCD_RS
IFDEF LCD_RW
bcf LCD_RW
ENDIF
call Tempo15ms.4MHz ; Tempo 15ms @4MHz
; call Tempo15ms.8MHz ; Tempo 15ms @8MHz
bsf LCD_E
; nop ; NOP 500ns en mode8MHz pour arriver a 1µs en tout
bcf LCD_E ; validation valeur H'3'
movlw d'252'
movwf LCDt1
movlw D'04'
call Tempo4ms.4MHz ; Tempo 4ms @4MHz
; call Tempo4ms.8MHz ; Tempo 4ms @8MHz
bsf LCD_E
; nop ; NOP 500ns en mode8MHz pour arriver a 1µs en tout
bcf LCD_E ; validation valeur H'3'
call TEST_BF ; tempo 100µs ou teste de Busy Flag
bsf LCD_E
; nop ; NOP 500ns en mode8MHz pour arriver a 1µs en tout
bcf LCD_E ; validation valeur H'3'
call TEST_BF ; tempo 100µs ou teste de Busy Flag
bcf LCD_pin_D4
bsf LCD_E
; nop ; NOP 500ns en mode8MHz pour arriver a 1µs en tout
bcf LCD_E ; validation valeur H'2'
movlw 0x028 ; Envoi de la commande Fonction 4-bit , Font, Nombre de lignes 0x028 original
call LCDins
movlw 0x008 ; display off
call LCDins
; movlw 0x00C ; display on / Curseur off
; movlw 0x00E ; display on / Cursor on
movlw 0x00F ; display on / curseur clignotant
call LCDins
movlw 0x006
call LCDins
retlw 0
; ****************************** ***
; * ROUTINE ENVOI OCTET *
; ****************************** ***
LCD_envoie_octet
bcf LCD_pin_D7 ; on met à 0 les sorties
bcf LCD_pin_D6
bcf LCD_pin_D5
bcf LCD_pin_D4
btfsc LCDtmp,7 ; on teste le bit 7 du caractere
bsf LCD_pin_D7 ; il est à 1 donc sortie correspondante à 1
btfsc LCDtmp,6
bsf LCD_pin_D6
btfsc LCDtmp,5
bsf LCD_pin_D5
btfsc LCDtmp,4
bsf LCD_pin_D4
bsf LCD_E
; nop ; Nop pour 1µs de duree de validation pour 8MHz
bcf LCD_E ; validation du premier quartet
bcf LCD_pin_D7 ; on remet à 0 les sorties
bcf LCD_pin_D6
bcf LCD_pin_D5
bcf LCD_pin_D4
btfsc LCDtmp,3
bsf LCD_pin_D7
btfsc LCDtmp,2
bsf LCD_pin_D6
btfsc LCDtmp,1
bsf LCD_pin_D5
btfsc LCDtmp,0
bsf LCD_pin_D4
bsf LCD_E
; nop ; Nop pour 1µs de duree de validation pour 8MHz
bcf LCD_E ; validation du second quartet
retLW 0
; ****************************** ***
; * TEMPORISATIONS *
; ****************************** ***
Tempo100us.4MHz
movlw D'33'
movwf D0
decfsz D0, f
goto $-1
retlw 0
Tempo100us.8MHz
movlw D'66'
movwf D0
decfsz D0, f
goto $-1
nop
retlw 0
Tempo1.5ms.4MHz
movlw D'43'
movwf D0
movlw D'2'
movwf D1
decfsz D0, f
goto $+2
decfsz D1, f
goto $-3
nop
nop
retlw 0
Tempo1.5ms.8MHz
movlw D'87'
movwf D0
movlw D'3'
movwf D1
decfsz D0, f
goto $+2
decfsz D1, f
goto $-3
nop
nop
retlw 0
Tempo4ms.4MHz
movlw D'31'
movwf D0
movlw D'4'
movwf D1
decfsz D0, f
goto $+2
decfsz D1, f
goto $-3
nop
nop
retlw 0
Tempo4ms.8MHz
movlw D'63'
movwf D0
movlw D'7'
movwf D1
decfsz D0, f
goto $+2
decfsz D1, f
goto $-3
nop
nop
retlw 0
Tempo15ms.4MHz
movlw D'183'
movwf D0
movlw D'12'
movwf D1
decfsz D0, f
goto $+2
decfsz D1, f
goto $-3
nop
nop
retlw 0
Tempo15ms.8MHz
movlw D'111'
movwf D0
movlw D'24'
movwf D1
decfsz D0, f
goto $+2
decfsz D1, f
goto $-3
nop
nop
retlw 0
; ****************************** ***
; * TEST BUSY FLAG *
; ****************************** ***
TEST_BF ; sous routine de test de Busy Flag
IFDEF LCD_RW
banksel H'85'
bsf LCD_pin_D7
bsf LCD_pin_D6
bsf LCD_pin_D5
bsf LCD_pin_D4
banksel H'05'
bcf LCD_RS
bsf LCD_RW
bsf LCD_E ; pour lire BF et 3 bits MSB de l'adresse
nop
btfsc LCD_pin_D7
bcf LCD_E
nop
bsf LCD_E ; pour lire 4 bits LSB de l'adresse
nop
bcf LCD_E
goto $-7
bcf LCD_RW
banksel H'85'
bcf LCD_pin_D7
bcf LCD_pin_D6
bcf LCD_pin_D5
bcf LCD_pin_D4
banksel H'05'
ELSE
call Tempo100us.4MHz ; Tempo 100µs @4MHz
; call Tempo100us.8MHz ; Tempo 100µs @8MHz
ENDIF
return
END
-----