Bonjours à tous, je réalise actuellement mon projet de BTS Système électronique et j'ai comme qui dirai un souci au niveau de mon programme en source assembleur. Mon objectif étant, d'écrire Bienvenue au lycee Baggio sur un afficheur LCD 2*16 en mode 8 bits avec un PIC16F877a et un quartz de 4 Mhz. Je vous laisse regarder mon programme en ésperant que vous trouverez d'ou vien le problème. Pour ce qui est du câblage entre le PIC et le LCD tout est indiqué au début du programme. Je vous remercis d'avance et bon courage

.
;*****************************************************************************************************
;
; Test LCD sur un 16F877A - 4 Mhz
;
;*****************************************************************************************************
;
; Files required: p16F877a.inc
;
;*****************************************************************************************************
list p=16F877a ;list directive to define processor
#include <p16F877a.inc> ;processor specific variable definitions
CBLOCK 0x020
LECTURE : 1
ECRITURE : 1
ENDC
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
;Pas de code protege, pas de watch hdog timer, delai de demarrage, horloge HS.
; Brochage du PIC sur la carte :
;
; Port | Broche | E/S | Nom | Description
; RA2 | 4 | S | E | Sortie broche Enable du LCD
; RA1 | 3 | S | R/W | Sortie Broche Read/write du LCD
; RA0 | 2 | S | RS | Sortie Broche RS du LCD
; RD0 | 19 | S | D0 | Sortie bit 0 du LCD
; RD1 | 20 | S | D1 | Sortie bit 1 du LCD
; RD2 | 21 | S | D2 | Sortie bit 2 du LCD
; RD3 | 22 | S | D3 | Sortie bit 3 du LCD
; RD4 | 27 | S | D4 | Sortie bit 4 du LCD
; RD5 | 28 | S | D5 | Sortie bit 5 du LCD
; RD6 | 29 | S | D6 | Sortie bit 6 du LCD
; RD7 | 30 | S | D7 | Sortie bit 7 du LCD
;**************************************************************************************************
;
; Constantes
;
;**************************************************************************************************
LCD_DATA ; LCD: Port ou est branche le bus de donnee ( bits 0 à 7 )
LCD_E ; LCD: Ligne de commande de controle de l'afficheur
LCD_RW ; LCD: Ligne de Lecture/Ecriture de l'afficheur
LCD_RS ; LCD: Ligne de selection de l'afficheur
;**************************************************************************************************
;
; Variables
;
;**************************************************************************************************
;***** Variable de temporisation
tempo50micro EQU 0x20 ;Variable tempo 50 µs
tempo10ms EQU 0x21 ;Variable tempo 10 ms
tempo1s EQU 0x22 ;Variable tempo 1s
;***** LCD Var
LCD_TEMP EQU 0x23 ;Variable temporaire pour le LCD
LCD_l0 macro A
movlw A
iorlw B'10000000'
call LCD_send
endm
LCD_l1 macro A
movlw A
iorlw B'11000000'
call LCD_send
endm
;********************************************************************************************** DEBUT
ORG 0x000 ;processor reset vector
GOTO main ;go to beginning of program
;****************************************************************************************************
;
; Programme Main
;
;****************************************************************************************************
main
;initialisation des ports
movlw B'00000101' ;Write, RS a 1, Enable a 1
movwf LECTURE
movlw B'00000100' ;Write, RS a 0, Enable a 1
movwf ECRITURE
bcf STATUS,RP0 ;pointer en BANK0
bcf STATUS,RP1
clrf PORTD ;mettre les futures sorties à l'état bas
clrf PORTA
bsf STATUS,RP0 ;pointer en BANK1
clrf PORTD ;PORTD en sortie
clrf PORTA ;PORTB en sortie
bcf STATUS,RP0 ;pointer en BANK0
nop ;un peu de temps laisser au PIC
;initialisation du LCD
movlw B'00111100' ;0 0 1 DL N F x x : DL=0(4ports)/1(8ports), N=0(1ligne)/1(2lignes), F=font
call LCD_send
movlw B'00001110' ;0 0 0 0 1 D C B : D=Display=1(on)/0(off) C=curseur B=blinking
call LCD_send
movlw B'00000001' ;effacer l'écran et retour du curseur à la position 0
call LCD_send
movlw B'00000110' ;0 0 0 0 0 1 1/D S : 1/D=(1)incrémente le curseur après écriture S=(1)display is shifted
call LCD_send
boucle
LCD_l0 D'2' ;pointer au caractère 2 de la première ligne
movlw "B" ;écrire "B"
call LCD_sendRS
movlw "i"
call LCD_sendRS
movlw "e"
call LCD_sendRS
movlw "n"
call LCD_sendRS
movlw "v"
call LCD_sendRS
movlw "e"
call LCD_sendRS
movlw "n"
call LCD_sendRS
movlw "u"
call LCD_sendRS
movlw "e"
call LCD_sendRS
movlw " "
call LCD_sendRS
movlw "a"
call LCD_sendRS
movlw "u"
call LCD_sendRS
CALL Wait1s
LCD_l1 D'2' ;pointer au caractère 2 de la deuxieme ligne
movlw "l" ;écrire "l"
call LCD_sendRS
movlw "y"
call LCD_sendRS
movlw "c"
call LCD_sendRS
movlw "e"
call LCD_sendRS
movlw "e"
call LCD_sendRS
movlw " "
call LCD_sendRS
movlw "B"
call LCD_sendRS
movlw "a"
call LCD_sendRS
movlw "g"
call LCD_sendRS
movlw "g"
call LCD_sendRS
movlw "i"
call LCD_sendRS
movlw "o"
call LCD_sendRS
CALL Wait1s
GOTO boucle ;boucle
;*****************************************************************************************************
;
; Les pauses a 4Mhz
;
;*****************************************************************************************************
;***** Attente de 1 s (exactement 1.00204 s)
Wait1s
MOVLW D'99' ; 99 fois
MOVWF tempo1s ;stockage dans la variable tempo1s
T1sboucle CALL Wait10ms
DECFSZ tempo1s,1 ;décremente et test
GOTO T1sboucle ;on boucle tant que <>0
RETURN
;***** Attente de 15 ms (exactement 14.99 ms)
Wait15ms
MOVLW D'149' ; 149 fois
MOVWF tempo10ms ;stockage dans la variable tempo10ms
T15msboucle CALL Wait100micros
DECFSZ tempo10ms,1 ;décremente et test
GOTO T15msboucle ;on boucle tant que <>0
RETURN
;***** Attente de 10 ms (exactement 10.02 ms)
Wait10ms
MOVLW D'198' ; 198 fois
MOVWF tempo10ms ;stockage dans la variable tempo10ms
T10msboucle CALL Wait50micros
DECFSZ tempo10ms,1 ;décremente et test
GOTO T10msboucle ;on boucle tant que <>0
RETURN
;***** Attente de 1.5 ms (exactement ? ms)
Wait1.5ms
MOVLW D'29' ; 29 fois
MOVWF tempo10ms ;stockage dans la variable tempo10ms
T1.5msboucle CALL Wait50micros
DECFSZ tempo10ms,1 ;décremente et test
GOTO T1.5msboucle ;on boucle tant que <>0
RETURN
;***** Attente de 100 µs (exactement, en comptant le temps d'appel)
Wait100micros
MOVLW D'165' ; 165 fois
MOVWF tempo50micro ;stockage dans la variable tempo50µ
T100microsboucle DECFSZ tempo50micro,1 ;décremente et test
GOTO T100microsboucle ;on boucle tant que <>0 0.2*3=0.6 µs en tout
RETURN
;***** Attente de 50 µs (exactement, en comptant le temps d'appel)
Wait50micros NOP
NOP
MOVLW D'81' ; 81 fois
MOVWF tempo50micro ;stockage dans la variable tempo50µ
T50microsboucle DECFSZ tempo50micro,1 ;décremente et test
GOTO T50microsboucle ;on boucle tant que <>0 0.2*3=0.6 µs en tout
RETURN
;***** Attente de 1 µs (exactement, en comptant le temps d'appel)
Wait1micros NOP
RETURN
;*****************************************************************************************************
;
; Sous Programmes
;
;*****************************************************************************************************
;ce programme émet un octet avec RS=0
LCD_send
movf LECTURE, PORTA ;Write, RS a 1, Enable a 1
movwf LCD_DATA ;Copie W sur le bus DATA
clrf LCD_E ;Enable a 0
CALL Wait50micros
return
;ce programme émet un octet avec RS=1
LCD_sendRS
movf ECRITURE, PORTA ;Write, RS a 0, Enable a 1
movwf LCD_DATA ;Copie W sur le bus DATA
clrf LCD_E ;Enable a 0
CALL Wait50micros
return
END ;directive 'end of program'