voila le programme avec le pic16f84.
mais j'ai quelques erreurs, si vous pouviez m'aider, les erreurs se trouve a priorit au niveau "des étiquettes"

merci pour le temps que vous me consacrerez




LIST p=16f84
#include<p16f84.inc>
;***************************** ****************************** *****
; declaration de variable *
;***************************** ****************************** *****
int_suivante equ H'0c'
INT_RB0 equ H'0d'
cmpt_TIMER_0 equ H'0e'
int_end equ H'0f'
compteur_dcf77_59bits equ H'10'
bit_synchro_dcf77_ok equ H'11'
synchro_ok equ H'13'
compteur_dcf77 equ H'14'
VERIF_PULSE_1_Seconde equ H'15'
HEURES_DCF equ H'16'
MINUTES_DCF equ H'17'
RESET_DU_COMPTEUR equ H'18'
BITS_20_TEST equ H'19'
Envoie_mise_heure equ H'1a'
BITS_28_TEST equ H'1b'
DELAY_150ms equ H'1c'
BITS_35_TEST equ H'1d'
TEST_PARITE equ H'1e'
FLAG_PARITE equ H'1f'
BITS_0_19 equ H'20'
BITS_36_59 equ H'21'
capture_bit_dcf77 equ H'22'
BITS_21_27 equ H'23'
DCF_HEURES equ H'24'
DCF_MINUTES equ H'25'
zero_DCF_minute equ H'26'
un_DCF_minute equ H'27'
zero_DCF_heure equ H'28'
un_DCF_heure equ H'29'
parite_paire equ H'2a'
parite_impaire equ H'2b'
FLAG_DCF equ H'2c'



;***************************** ****************************** ****
; demarrage sur reset

;***************************** ****************************** ****

org 0h


;***************************** ***************************
; interrup RB0
;*************
INT_RB0
bcf STATUS , RP0 ; sélectionner banque0
bcf STATUS , RP1

btfsc INTCON,INTE ; bit4 tester si interrupt RB0 autorisée
btfss INTCON,INTF ; oui, tester si interrupt RB0 en cours
; signale une transition sur la pin RB0 dans le sens déterminé par
; INTEDG du registre OPTION (b6)

goto int_suivante ; non sauter

call INT_RB0 ; oui, traiter interrupt RB0
clrf cmpt_TIMER_0 ;clrf nb d'interruptions effectuées
clrf TMR0 ;reset du timer0
bcf INTCON,INTF ; effacer flag interupt RB0

goto int_end ;fin interruption


INT_RBO
;interruption rb0 portB RECEPTION DCF 77


bcf STATUS,RP0
bcf STATUS,RP1 ;en bank 0

bsf INTCON,T0IE ;autorise le timer 0 des la 1ere interruption rb0

btfss bit_synchro_dcf77_ok,0 ;la synchro a été détectée ou pas ?.....
goto $+2 ; non pas encore
goto compteur_dcf77_59bits ; oui alors prgm normal

; DETECTION du START-BIT
;˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜
;detection_startbit
movfw cmpt_TIMER_0 ;charge nb interruptions tmr0
addlw -d'115' ; ;detection_start_bit-d'117'
;TMR0 cmpt doit etre au minimum à cette valeur pour le start-bit
btfsc STATUS,C
goto synchro_ok
clrf cmpt_TIMER_0 ;clrf nb d'interruptions effectuées
clrf TMR0 ;reset du timer0
return

synchro_ok ;on a détecté le bit de synchro, init du compteur

clrf compteur_dcf77 ; init à 0

bsf bit_synchro_dcf77_ok,0 ;c'est le bit de synchro, je signale sa prise en compte par ce flag
bcf STATUS,RP0 ;en bank 0
return

compteur_dcf77_59bits
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
bcf STATUS,RP0
bsf PORTA,5 ;synchro ok led ON
incf compteur_dcf77,f ; init à 0

VERIF_PULSE_2_Seconde
;*********************
movfw compteur_dcf77 ;compteur à 59 ?
xorlw d'59' ; 3C en hexa
btfss STATUS,Z
goto VERIF_PULSE_1_Seconde

movfw cmpt_TIMER_0
;charge nb interruptions tmr0 (2s-150ms)/256/66.56= 108.5 je mets 100
addlw -d'100' ; ;detection_start_bit-d'117' ;
btfsc STATUS,C
goto VERIF_PULSE_1_Seconde

clrf cmpt_TIMER_0 ;clrf nb d'interruptions effectuées
clrf TMR0 ;reset du timer0

clrf compteur_dcf77 ;pas glop! ...on reset tout
bcf PORTA,5
clrf HEURES_DCF ; on reset les variables DCF
clrf MINUTES_DCF
clrf bit_synchro_dcf77_ok ;on reset le bit_synchro_dcf
return

VERIF_PULSE_1_Seconde
;***************************** ********
movfw cmpt_TIMER_0
;charge nb interruptions tmr0 (1s-150ms)/256/66.56= 58.6 je mets 45
addlw -d'45' ; soit 760 ms minimum entre 2 pulses
btfsc STATUS,C ;si inférieure à d45 C=1
goto RESET_DU_COMPTEUR

clrf compteur_dcf77 ;pas glop! ...on reset tout
bcf PORTA,5
clrf HEURES_DCF ; on reset les variables DCF
clrf MINUTES_DCF
clrf bit_synchro_dcf77_ok ;on reset le bit_synchro_dcf
return

RESET_DU_COMPTEUR
;***************************
bcf STATUS,RP0
movfw compteur_dcf77 ;compteur à 60 ?
xorlw d'59' ; 3C en hexa
btfss STATUS,Z
goto $+2
clrf compteur_dcf77 ;remets compteur à 0

ENVOIE_MISE_A_HEURE
;***************************
movfw compteur_dcf77 ;compteur à 0 ?
btfss STATUS,Z ;test si Z=1
goto BITS_20_TEST ;non on continu
call Envoie_mise_heure ; vers affichage lcd
return ;et on sort

BITS_20_TEST
;****************
movfw compteur_dcf77 ;test si bit 20 = 1 comme il se doit
xorlw d'20'
btfss STATUS,Z ;compteur à 20 ? alors bit C =1
goto BITS_28_TEST
call DELAY_150ms ; 153.755 exactement
btfsc PORTB,0 ;tester si = 1 200ms =1 100ms = 0
goto BITS_28_TEST
bcf bit_synchro_dcf77_ok,0 ;alors erreur reception
return

BITS_28_TEST
;*****************
bcf STATUS,RP0
btfss bit_synchro_dcf77_ok,0 ;la synchro a été détectée ou pas ?.....
goto BITS_35_TEST

bcf STATUS,RP0
movfw compteur_dcf77 ;teste la PARITEE PAIRE des bits 21 à 27 ==> bit 28
xorlw d'28'
btfss STATUS,Z ;compteur à 28 ? alors bit Z =1
goto BITS_35_TEST
call TEST_PARITE ;flag =0 ?...
clrf FLAG_PARITE ;reset flag
return

BITS_35_TEST
;*****************
bcf STATUS,RP0
btfss bit_synchro_dcf77_ok,0 ;la synchro a été détectée ou pas ?.....
goto BITS_0_19

bcf STATUS,RP0
movfw compteur_dcf77
xorlw d'35' ;teste la PARITEE PAIRE des bits 29 a 34 ==> bit 35
btfss STATUS,Z
goto BITS_0_19
call TEST_PARITE ;flag =0 ?...
clrf FLAG_PARITE ;reset flag
return

BITS_0_19
;************
movfw compteur_dcf77 ;compteur de 0 à 20 (hexa=14) ,on passe
sublw d'19'
btfss STATUS,C ;compteur à 21 ? alors bit C =0
goto BITS_36_59
return

BITS_36_59
;*************
movfw compteur_dcf77 ;compteur de 36(hexa=24) à 59(hexa=3B) ,on passe
sublw d'35'
btfsc STATUS,C ;compteur sup à 37(hexa=25)
goto capture_bit_dcf77
return

capture_bit_dcf77
;***********************
bcf STATUS,RP0 ;en bank 0
bcf STATUS,Z ;clear bit Z

BITS_29_34
;*************
movfw compteur_dcf77 ;29 - 34 : Heures codées en BCD, bit de poids faible en premier
sublw d'28'
btfsc STATUS,C ;compteur à 29 ? alors bit C =0
goto BITS_21_27
goto DCF_HEURES

BITS_21_27
;***************
movfw compteur_dcf77 ;21 - 27 : Minutes codées en BCD, bit de poids faible en premier
sublw d'20'
btfsc STATUS,C ;compteur à 21 ? alors bit C =0
goto $+2
goto DCF_MINUTES
return

;36 - 41 : Jour codé en BCD, bit de poids faible en premier.
;42 - 44 : Jour de la semaine codé en BCD, bit de poids faible en premier.
;45 - 49 : Mois codé en BCD, bit de poids faible en premier.
;50 - 57 : Année (sur deux chiffres) codées en BCD, bit de poids faible en premier.
;59 : Pas d'impulsion

DCF_MINUTES
;**************
bcf STATUS,RP0 ;en bank0
call DELAY_150ms ; 153.755 exactement

test1_valeur_bit_Parite
;**************************** ;calcul de la PARITE
;------------------------
movfw PORTB ;charge valeur du portB
andlw 0x01 ;garde seulemnt le bit 0
xorwf FLAG_PARITE,f ;inverse le bit0 du flag ,doit etre à 0 pour une "PARITE PAIRE"

;test de la valeur retenue sur RB0
;---------------------------------------
btfss PORTB,0 ;teste état du port si = 1
goto zero_DCF_minute ;non a 0
goto un_DCF_minute ;oui a 1

zero_DCF_minute
bcf STATUS,C ; force un 0 => Carry = 0
rrf MINUTES_DCF,f ;décalage vers la droite ; faire entrer le bit par la gauche
return

un_DCF_minute
bsf STATUS,C ; force un 1 => Carry = 1
rrf MINUTES_DCF,f ;décalage vers la droite faire entrer le bit par la gauche
return

DCF_HEURES
;*************
bcf STATUS,RP0 ;en bank0
call DELAY_150ms ; 153.755 exactement

test2_valeur_bit_Parite
;**************************** ;calcul de la PARITE
;------------------------
movfw PORTB ;charge valeur du portB
andlw 0x01 ;garde seulemnt le bit 0
xorwf FLAG_PARITE,f ;inverse le bit4 du flag ,doit etre à 0 pour une "PARITE PAIRE"

;test de la valeur re‡ue sur RB0
;---------------------------------------
btfss PORTB,0 ;teste état du port si = 1
goto zero_DCF_heure ;non a 0
goto un_DCF_heure ;oui a 1

zero_DCF_heure
bcf STATUS,C ; force un 0 Carry = 0
rrf HEURES_DCF,f ;décalage vers la droite ; faire entrer le bit par la gauche
return

un_DCF_heure
bsf STATUS,C ; force un 1 Carry = 1
rrf HEURES_DCF,f ;décalage vers la droite ; faire entrer le bit par la gauche
return

TEST_PARITE
;¤¤¤¤¤¤¤¤¤¤¤¤¤

; on va vérifier que le bit de parité re‡u est identique au bit de parité calculé
bcf STATUS,RP0 ;en bank0
call DELAY_150ms ; 153.755 exactement


movfw PORTB ;charge valeur PORTB
andlw 0x01 ;sur RB0
xorwf FLAG_PARITE,f ; xor avec la valeur calculée

btfss FLAG_PARITE,0 ; si flag,0 = 0, alors nombre de "1" re‡us = pair, sinon impair.
goto parite_paire
goto parite_impaire

parite_paire
return
;parite_impaire
bcf bit_synchro_dcf77_ok,0 ;traitement de l'erreur à écrire
bcf PORTA,5 ;synchro nok led OFF
clrf compteur_dcf77
return

Envoie_mise_heure
;**************************
bcf STATUS,RP0 ;en bank 0

bsf FLAG_DCF,1 ;autorise ecriture heure DCF vers le DS1307
return
end