Programme afficheur LCD à 4bits

Signaler
-
Bonjour!
je suis étudiante et j'ai besoin d'aide pour réaliser un programme qui permet d'afficher une chaine de caractère dans un afficheur LCD.
veuillez me corriger le programme que j'ai fais et merci.


LIST p=16F84 ; Définition de processeur
#include ; Définitions de variables

__CONFIG _CP_ON & _WDT_ON & _PWRTE_ON & _HS_OS
;-----------------------------------------------------------------------------------------
; Temporisation 350ms, 500ms, 1s
;-----------------------------------------------------------------------------------------

Tempo_1s:
movlw d'100' ;1 cycle
movwf temp3 ;1 cycle
goto tempo2 ;2 cycles

Tempo_500ms:
movlw d'50' ;1 cycle
movwf temp3 ;1 cycle
goto tempo2 ;2 cycles

Tempo_350ms:
movlw d'35' ;1 cycle
movwf temp3 ;1 cycle
goto tempo2 ;2 cycles

tempo2:
call Tempo_10ms ;
decfsz temp3,1 ;2 cycles si temp1=0 sinon 1 cycle
goto tempo2 ;2 cycles
return

;-----------------------------------------------------------------------------------------
; Temporisation 10ms, 30ms, 100ms, 150ms, 200ms
;-----------------------------------------------------------------------------------------

Tempo_200ms:
movlw d'200' ;1 cycle
movwf temp2 ;1 cycle
goto tempo1 ;2 cycles

Tempo_150ms:
movlw d'150' ;1 cycle
movwf temp2 ;1 cycle
goto tempo1 ;2 cycles

Tempo_100ms:
movlw d'100' ;1 cycle
movwf temp2 ;1 cycle
goto tempo1 ;2 cycles

Tempo_30ms:
movlw d'30' ;1 cycle
movwf temp2 ;1 cycle
goto tempo1 ;2 cycles

Tempo_10ms:
movlw d'10' ;1 cycle
movwf temp2 ;1 cycle

tempo1:
call Tempo_1ms ;
decfsz temp2,1 ;2 cycles si temp1=0 sinon 1 cycle
goto tempo1 ;2 cycles
return

;-----------------------------------------------------------------------------------------
; Temporisation 1530us
;-----------------------------------------------------------------------------------------

Tempo_1530us: ;1530us soit 1530 cycles (temp1*4)+4
call Tempo_1ms
call Tempo_530us

return

;-----------------------------------------------------------------------------------------
; Temporisation 1ms, 530us, 250us
;-----------------------------------------------------------------------------------------

Tempo_1ms: ;1ms soit 1000 cycles (temp1*4)+4
movlw d'249' ;1 cycle
movwf temp1 ;1 cycle
goto tempo ;2 cycles

Tempo_530us: ;532us soit 532 cycles (temp1*4)+4
movlw d'132' ;1 cycle
movwf temp1 ;1 cycle
goto tempo ;2 cycles

Tempo_250us: ;532us soit 532 cycles (temp1*4)+4
movlw d'62' ;1 cycle
movwf temp1 ;1 cycle
goto tempo ;2 cycles

tempo:
nop ;1 cycle
decfsz temp1,1 ;2 cycles si temp1=0 sinon 1 cycle
goto tempo ;2 cycles
return

;-----------------------------------------------------------------------------------------
; Temporisation 11us, 39us, 43us
;-----------------------------------------------------------------------------------------

Tempo_43us: ;43us soit 43 cycles (temp1*3)+2
movlw d'14' ;1 cycle
movwf temp1 ;1 cycle
Tempo_43:
decfsz temp1,1 ;2 cycles si temp1=0 sinon 1 cycle
goto Tempo_43 ;2 cycles
return

Tempo_39us: ;39us soit 39 cycles (temp1*3)+2
movlw d'12' ;1 cycle
movwf temp1 ;1 cycle
Tempo_39:
decfsz temp1,1 ;2 cycles si temp1=0 sinon 1 cycle
goto Tempo_39 ;2 cycles
return

Tempo_12us: ;11us soit 11 cycles (temp1*3)+3
movlw d'3' ;1 cycle
movwf temp1 ;1 cycle
nop
Tempo_12:
decfsz temp1,1 ;2 cycles si temp1=0 sinon 1 cycle
goto Tempo_11 ;2 cycles
return

Tempo_11us: ;11us soit 11 cycles (temp1*3)+2
movlw d'3' ;1 cycle
movwf temp1 ;1 cycle
Tempo_11:
decfsz temp1,1 ;2 cycles si temp1=0 sinon 1 cycle
goto Tempo_11 ;2 cycles
return


;*********************************************************************
; DEFINE *
;*********************************************************************

; exemples
; ---------
#DEFINE D3 PORTB,7 ; LED de sortie 1
#DEFINE D2 PORTB,6 ; LED de témoin de réception
#DEFINE D1 PORTB,5 ; entrée RS485
#DEFINE D0 PORTB,4

;*********************************************************************
; MACRO *
;*********************************************************************

;Exemple
;-------
LIREIN macro
comf PORTB,0
andlw 1
endm
;

;*********************************************************************
; DECLARATIONS DE VARIABLES *
;*********************************************************************

;exemples
;---------
CBLOCK 0x00C ; début de la zone variables
w_temp :1 ; Zone de 1 byte
status_temp : 1 ; zone de 1 byte
INT : 1 ; je déclare ma variable
ENDC ; Fin de la zone

;**********************************************************************
; DEMARRAGE SUR RESET *
;**********************************************************************

org 0x000 ; Adresse de départ après reset
goto start ; Adresse 0: démarrer

;*********************************************************************
; INITIALISATIONS *
;*********************************************************************

init
clrf PORTA ; Sorties portA à 0
clrf PORTB ; sorties portB à 0
bsf STATUS,RP0 ; sélectionner banque 1
clrf EEADR ; permet de diminuer la consommation
movlw OPTIONVAL ; charger masque
movwf OPTION_REG ; initialiser registre option

; Effacer RAM
; ------------
movlw 0x0c ; initialisation pointeur
movwf FSR ; pointeur d'adressage indirec
init1
clrf INDF ; effacer ram
incf FSR,f ; pointer sur suivant
btfss FSR,6 ; tester si fin zone atteinte (>=40)
goto init1 ; non, boucler
btfss FSR,4 ; tester si fin zone atteinte (>=50)
goto init1 ; non, boucler



bcf TRISA,0 ; Bit PORTA.0 en sortie (exemple)

bcf STATUS,RP0 ; Sélectionner banque 0
movlw INTERMASK ; masque interruption
movwf INTCON ; charger interrupt control


;*********************************************************************
; PROGRAMME PRINCIPAL *
;*********************************************************************

start
LCD_CONVERT_HEX_DEC_CAR: ;Conversion d'un nombre hexa en décimal 00-FF -> 0 - 255

movwf DATA_TMP
movlw h'30'
movwf J ;J="0"
movlw d'100'

next_cent:
subwf DATA_TMP,w
btfss carry ;test si <
goto write_cent
incf J,f
movlw d'100'
subwf DATA_TMP,f
goto next_cent

write_cent:
movf J,w
call LCD_WRITE_RAM_W
goto next_diz_

LCD_CONVERT_HEX_DEC_2CAR: ;Conversion d'un nombre hexa en décimal 00-63 -> 0 - 99
movwf DATA_TMP

next_diz_:
movlw h'30'
movwf J ;J="0"
movlw d'10'

next_diz:
subwf DATA_TMP,w
btfss carry ;test si<
goto write_diz
incf J,f
movlw d'10'
subwf DATA_TMP,f
goto next_diz

write_diz:
movf J,w
call LCD_WRITE_RAM_W
movlw h'30'
movwf J ;J="0"
movlw d'1'

next_un:
subwf DATA_TMP,w
btfss carry ;test si <
goto write_un
incf J,f
movlw d'1'
subwf DATA_TMP,f
goto next_un

write_un:
movf J,w
call LCD_WRITE_RAM_W

return

LCD_CONVERT_DEC_CAR:

movlw d'16'
subwf DATA_TMP,w
btfss carry ;test si < 16
goto write_err

movlw d'10'
subwf DATA_TMP,w
btfss carry ;test si < 16
goto write_car

movf DATA_TMP,w
sublw d'10'
addlw _0
goto write

write_car:
movf DATA_TMP,w
sublw d'10'
addlw _A
goto write

write_err:
movlw _full
goto write

write:
call LCD_WRITE_RAM_W

return


;-------------------------------------------------------------------

LCD_INIT: ;Initialisation de l'afficheur

CALL Tempo_30ms
movlw h'20' ;Function set
call LCD_WRITE_CONTROL_W_1 ;Ecriture

movlw LCD_FUNCTION_SET ;Function set
movwf LCD_func_set ;Sauvegarde des paramètres
call LCD_WRITE_CONTROL_W ;Ecriture
;Tempo de 39us

movlw LCD_DISPLAY_CONTROL ;Display ON/OFF
movwf LCD_disp_cont ;Sauvegarde des paramètres
call LCD_WRITE_CONTROL_W ;Ecriture
;Tempo de 39us

call LCD_CLEAR_DISPLAY

movlw LCD_ENTRY_MODE_SET ;Entry mode set
movwf LCD_mode_set ;Sauvegarde des paramètres
call LCD_WRITE_CONTROL_W ;Ecriture
CALL Tempo_43us

movlw LCD_CURSOR_DISPLAY_SHIFT
movwf LCD_curs_disp_shift ;Sauvegarde des paramètres

return ;Init end

LCD_WRITE_CONTROL_W_1:
andlw b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
movwf PORT_SAVE
bcf LCD_RW ;Write
bcf LCD_RS ;RS a 0
bsf LCD_E ;Enable a 1
movf LCD_DATA,w
andlw b'00001111' ;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
iorwf PORT_SAVE,w
movwf LCD_DATA ;Copie W sur le bus DATA
bcf LCD_E ;Enable a 0
CALL Tempo_43us

return

LCD_WRITE_CONTROL_W:
movwf DATA_SWAP
andlw b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
movwf PORT_SAVE
bcf LCD_RW ;Write
bcf LCD_RS ;RS a 0
bsf LCD_E ;Enable a 1
movf LCD_DATA,w
andlw b'00001111' ;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
iorwf PORT_SAVE,w
movwf LCD_DATA ;Copie W sur le bus DATA
bcf LCD_E ;Enable a 0
CALL Tempo_43us

swapf DATA_SWAP,w
andlw b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
movwf PORT_SAVE
bcf LCD_RW ;Write
bcf LCD_RS ;RS a 0
bsf LCD_E ;Enable a 1
movf LCD_DATA,w
andlw b'00001111' ;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
iorwf PORT_SAVE,w
movwf LCD_DATA ;Copie W sur le bus DATA
bcf LCD_E ;Enable a 0
CALL Tempo_43us

return

LCD_WRITE_RAM_W:
movwf DATA_SWAP
andlw b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
movwf PORT_SAVE
bcf LCD_RW ;Write
bsf LCD_RS ;RS a 1
bsf LCD_E ;Enable a 1
movf LCD_DATA,w
andlw b'00001111' ;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
iorwf PORT_SAVE,w
movwf LCD_DATA ;Copie W sur le bus DATA
bcf LCD_E ;Enable a 0
CALL Tempo_43us

swapf DATA_SWAP,w
andlw b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
movwf PORT_SAVE
bcf LCD_RW ;Write
bsf LCD_RS ;RS a 1
bsf LCD_E ;Enable a 1
movf LCD_DATA,w
andlw b'00001111' ;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
iorwf PORT_SAVE,w
movwf LCD_DATA ;Copie W sur le bus DATA
bcf LCD_E ;Enable a 0
CALL Tempo_43us

return

LCD_LIGNE1:
movlw h'20'
CALL LCD_WRITE_CONTROL_W ; Température:202054656D701F726174757265
movlw h'20'
CALL LCD_WRITE_CONTROL_W
movlw h'54'
CALL LCD_WRITE_CONTROL_W
movlw h'65'
CALL LCD_WRITE_CONTROL_W
movlw h'6D'
CALL LCD_WRITE_CONTROL_W
movlw h'70'
CALL LCD_WRITE_CONTROL_W
movlw h'1F'
CALL LCD_WRITE_CONTROL_W
movlw h'72'
CALL LCD_WRITE_CONTROL_W
movlw h'61'
CALL LCD_WRITE_CONTROL_W
movlw h'74'
CALL LCD_WRITE_CONTROL_W
movlw h'75'
CALL LCD_WRITE_CONTROL_W
movlw h'72'
CALL LCD_WRITE_CONTROL_W
movlw h'65'
CALL LCD_WRITE_CONTROL_W
return

LCD_LIGNE2:
movlw h'20'
CALL LCD_WRITE_CONTROL_W ; égale à 1°C:20201F67616C65201F20311F43
movlw h'20'
CALL LCD_WRITE_CONTROL_W
movlw h'1F'
CALL LCD_WRITE_CONTROL_W
movlw h'67'
CALL LCD_WRITE_CONTROL_W
movlw h'61'
CALL LCD_WRITE_CONTROL_W
movlw h'6C'
CALL LCD_WRITE_CONTROL_W
movlw h'65'
CALL LCD_WRITE_CONTROL_W
movlw h'20'
CALL LCD_WRITE_CONTROL_W
movlw h'1F'
CALL LCD_WRITE_CONTROL_W
movlw h'20'
CALL LCD_WRITE_CONTROL_W
movlw h'31'
CALL LCD_WRITE_CONTROL_W
movlw h'1F'
CALL LCD_WRITE_CONTROL_W
movlw h'43'
CALL LCD_WRITE_CONTROL_W
return

LCD_CLEAR_DISPLAY:
movlw h'01'
CALL LCD_WRITE_CONTROL_W
CALL Tempo_1530us
return

LCD_RETURN_HOME:
movlw h'02'
CALL LCD_WRITE_CONTROL_W
CALL Tempo_1530us
return

LCD_ON:
bsf LCD_disp_cont,2
movf LCD_disp_cont,0
CALL LCD_WRITE_CONTROL_W
return

LCD_OFF:
bcf LCD_disp_cont,2
movf LCD_disp_cont,0
CALL LCD_WRITE_CONTROL_W
return

LCD_CURSOR_ON:
bsf LCD_disp_cont,1
movf LCD_disp_cont,0
CALL LCD_WRITE_CONTROL_W
return

LCD_CURSOR_OFF:
bcf LCD_disp_cont,1
movf LCD_disp_cont,0
CALL LCD_WRITE_CONTROL_W
return

LCD_BLINK_ON:
bsf LCD_disp_cont,0
movf LCD_disp_cont,0
CALL LCD_WRITE_CONTROL_W
return

LCD_BLINK_OFF:
bcf LCD_disp_cont,0
movf LCD_disp_cont,0
CALL LCD_WRITE_CONTROL_W
return

LCD_DIR_LEFT:
bcf LCD_mode_set,1
movf LCD_mode_set,0
CALL LCD_WRITE_CONTROL_W
return

LCD_DIR_RIGHT:
bsf LCD_mode_set,1
movf LCD_mode_set,0
CALL LCD_WRITE_CONTROL_W
return

LCD_SH_ON:
bsf LCD_mode_set,2
movf LCD_mode_set,0
CALL LCD_WRITE_CONTROL_W
return

LCD_SH_OFF:
bcf LCD_mode_set,2
movf LCD_mode_set,0
CALL LCD_WRITE_CONTROL_W
return

END ; directive fin de programme