C_VARV_SecSecondesV_MinMinutesV_HourHeuresV_TensDizainesV_UnitsUnitsV_FlagBannireV_YearAnnesV_MonthMoisV_DayJoursV_NbrDmNombre de jours du moisV_AdrHMSB Adresse FlashV_AdrLLSB Adresse FlashV_BissVrif si anne bissextileV_tmpV_tmpLVariable systmeV_tmpHVariable systmeV_StoreVariable temporaireV_DWJour de la semaineV_MvalValeur du mois en coursV_LoopCompteur de boucle CListeCModuleOscillateur #1 20 MHz Oscillateur #2 32.768 KHz Interruption sur Timer1 Horloge prvue pour la priode 2000 2099 Passage l'heure d't/hiver par simple pression sur un poussoir (Poussoir en C6 en mode Clock, poussoir C5 en mode Set) Passe en mode Set par pression sur le poussoir en C4 Rglage en cascade des Minutes, Heures, Annes, Mois, Jours et Et/Hiver en C5 (Rouge en mode t, Bleu en mode hiver) Tient compte du nombre de jours dans chaque mois ainsi que des annes bissextilesCSaut CStRout InitPic InitVar Intro,  InitClockCTest Bouton Set4PORTC!Passe t/hiver 6PORTCy!4PORTC   CRegistre_  Timer1 OFFTMR1ONT1CONSCSTATUS3CLcd 1Texte( 1mCCpt  11D'0'1V_Sec=+1V_Sec1D'10'81V_Tens/+11V_tmp1V_Units=(1Texte  Display_Ascii!4PORTC!5PORTCp! 4PORTC( 1wTexte( 1h! 4PORTC! 5PORTCf ! 4PORTC( 1wTexte(  1A! ! 4PORTC#!!" 5PORTC]"  !#%4PORTC$$#(%&1wTexte(&'1M!'(4PORTC*!()5PORTCP) '!*14PORTC++ *(23!1Texte(34"1J!45#4PORTC7!56$5PORTCH6%4!7.$4PORTC88%7(9:&1Texte(:;'1*!;<(4PORTC>!<=)5PORTCE=*;!>@)4PORTC??*>(AB,1Texte(BC-1 D0CCodeEQ* MOVLW B'00000110' XORWF PORTA,FCTempoFG,T_200mS200000G-;+HI%11V_Day1V_DayICCptTestIJ&1V_Day1V_NbrDm>(JK'1Texte+KL(1V_Day1D'10'1V_Tens/+LM)11V_tmp1V_Units=M-*  Display_Ascii^NO,T_200mS200000O-4+PU 11V_Month1V_MonthIbUV!1V_Month1D'13'=(VX"1Texte W#V+XY#1V_Month1D'10'1V_Tens/+YZ$11V_tmp1V_Units=Z/%  Display_Ascii^[\'T_200mS200000\('+]^11V_Year1V_YearIb^_1V_Year1D'100'=(_a1Texte`_+ab1V_Year1D'10'1V_Tens/+bc 11V_tmp1V_Units=c0!  Display_Ascii^de#T_200mS200000e$ +fg 11V_Hour1V_HourIbgh 1V_Hour1D'24'=i(hk 1Texte+ij 11D'0'1V_Hour=j h+kl 1V_Hour1D'10'1V_Tens/+lm 11V_tmp1V_Units=mn  Display_Ascii^no T_200mS200000o +pq11V_Min1V_MinIbqr1V_Min1D'60'=(rt1Texte s r+tu1V_Min1D'10'1V_Tens/+uv11V_tmp1V_Units=vw  Display_Ascii^wxT_200mS200000x!y{ 6PORTCzz y&{|  Timer1 OFFTMR1ONT1CONSCSTATUS3\|} aInversion du bit0 de V_Flag Equivalent de l'inversion d'une sortie mais applique une variable!MOVLW B'00000001' XORWF V_Flag,FCRegTest}~ Test si heure d't ou d'hiver0V_FlagCSTATUS+~ On passe l'heure d'hiver11V_Hour1V_HourDbTeste si on passe de 1H 0H1V_Hour1D'255'=R(1Texte+ On passe l'heure d't1~1V_Hour1V_HourIbTeste si on passe de 23H 0H1V_Hour,1D'24'a=S+1V_Hour1D'10'1V_Tens/+11V_tmp1V_Units=  Display_Ascii^T_50mS50000\Inversion Port A1 et A2  MOVLW B'00000110' XORWF PORTA,F& Timer1 ONTMR1ONT1CONnCSTATUS +'11D'1'1V_Day=(J&@* Mise en route du Timer1TMR1ONT1CONmCSTATUSo^C.T_200mS200000^A+@Un petit dlais est ncessaire ici pour stabiliser l'oscillateurT_1mS1000&D/ 0PORTArCSTATUS&  0PORTACSTATUS+s 11D'0'1V_Min=+`11D'0'1V_Year=+W"11D'1'1V_Month =,  NbrOfDays-N+  DayOfWeek.9%  DayOfWeek/[&  DayOfWeek0d"  DayOfWeek12   NbrOfDays\QF+aInversion du bit0 de V_Flag Equivalent de l'inversion d'une sortie mais applique une variable!MOVLW B'00000001' XORWF V_Flag,F+ROn restaure les heures11V_Hour1V_HourI+SOn restaure les heures11V_Hour1V_HourDT Beep\TOn restaure V_Flag!MOVLW B'00000001' XORWF V_Flag,F Start 16F870 EEprom    (1/Texte(1 -- PIC CLOCK --(1Texte(1M.LECLERE V1.10^T_3S3000000& UInterrompt le Timer1 en cas de Reset manuel Ncessaire en mode compteur asynchrone TMR1ONT1CONSCSTATUS3   Beep^ T_50mS50000CBoucle  1Intro1V_M (1 Texte(!Dmarrage sur le 1er janvier 20001 Sa 01/01/2000(1Texte(Dmarrage sur 00:00:001 00 : 00 : 00 InitClock +BAdresse haute mmoire Flash (Sera toujours 0 dans ce programme)11D'0'1V_AdrH=+Adresse basse mmoire Flash11D'0'1V_AdrL=+,Variable de vrification si anne bissextile11D'0'1V_Biss=+Anne11D'0'1V_Year=+Mois11D'1'1V_Month=+Jour11D'1'1V_Day=+ Heure11D'0'1V_Hour=+ Minute11D'0'1V_Min=+ Seconde11D'0'1V_Sec=+ JVariable temporaire de la valeur des dizaines (Utilise pour l'affichage)11D'0'1V_Tens=+ HVariable temporaire de la valeur des units (Utilise pour l'affichage)11D'0'1V_Units=+  +Bit 0 : Ete/Hiver Bit 1 : Beep Horaire11D'0'1V_Flag=+$Nombre de jour dans le mois en cours11D'0'1V_NbrDm=InitVar +Port A en sortie11 B'00000000'1TRISA=+Port B en sortie11 B'00000000'1TRISB=+bPort C en entre (C0 et C1 utilis par le 2me oscillateur) C0 T1OSI C1 T1OSO C3 en sortie11 B'11110111'1TRISC=+bit 7-6 Unimplemented: Read as '0' bit 5-4 T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits 11 = 1:8 Prescale value 10 = 1:4 Prescale value 01 = 1:2 Prescale value 00 = 1:1 Prescale value bit 3 T1OSCEN: Timer1 Oscillator Enable Control bit 1 = Oscillator is enabled 0 = Oscillator is shut-off (the oscillator inverter is turned off to eliminate power drain) bit 2 T1SYNC: Timer1 External Clock Input Synchronization Control bit When TMR1CS = 1: 1 = Do not synchronize external clock input 0 = Synchronize external clock input When TMR1CS = 0: This bit is ignored. Timer1 uses the internal clock when TMR1CS = 0. bit 1 TMR1CS: Timer1 Clock Source Select bit 1 = External clock from pin RC0/T1OSO/T1CKI (on the rising edge) 0 = Internal clock (FOSC/4) bit 0 TMR1ON: Timer1 On bit 1 = Enables Timer1 0 = Stops Timer111 B'00001110'1T1CON=+1.1 B'00000010'1PORTA|=InitPic# |[: \On place la variable des dizaines dans W On ajoute 48 pour obtenir le code Ascii Appel de la routine d'affichage Ascii Idem pour les units Y MOVF V_Tens,W ADDLW D'48' CALL LCDchar MOVF V_Units,W ADDLW D'48' CALL LCDchar Display_AsciiTk:?nRoutine d'interruption du Timer1 Oscillateur 32,768 KHz Prescaler=1 TMR1H=128 TMR1L=0 Dure : 1 sec+11D'128'1TMR1H=+11D'0'1TMR1L=+11V_Sec1V_SecICInverse 0PORTAb1V_Sec1D'60'= (1Texte+ 1V_Sec1D'10'1V_Tens/+ 11V_tmp1V_Units= ;   Display_Ascii^ T_50mS50000   0PORTA+ 11D'0'1V_Sec=+121V_Min1V_MinIb 1V_Min1D'60'=( 1Texte + 1V_Min1D'10'1V_Tens/+ 11V_tmp1V_Units=   Display_Ascii+ 11D'0'1V_Min=+ 11V_Hour1V_HourIb 1V_Hour1D'24'=( 1Texte+1V_Hour1D'10'1V_Tens/+11V_tmp1V_Units=7  Display_Ascii+ 11D'0'1V_Hour=+11V_Day1V_DayIb 1V_Day1V_NbrDm>%( !1Texte+!"1V_Day1D'10'1V_Tens/+"#11V_tmp1V_Units=#8  Display_Ascii$+%&11D'1'1V_Day=+&'11V_Month1V_MonthIb'(1V_Month1D'13'=-(()1Texte +)*1V_Month1D'10'1V_Tens/+*+11V_tmp1V_Units=+9  Display_Ascii, +-.11D'1'1V_Month=+./11V_Year1V_YearIb/01V_Year1D'100'=5(011Texte+121V_Year1D'10'1V_Tens/+2311V_tmp1V_Units=3:  Display_Ascii4(+5611D'0'1V_Year=608$  DayOfWeek:4  DayOfWeek9,  DayOfWeek; 1V_FlagCSTATUS<<=  Beep&7 1V_FlagCSTATUS&=>  1V_FlagCSTATUS> TIMER1     & CSTATUSZCSTATUSx+1V_Year1D'4'1V_Biss/b1V_NbrDm 1D'28' =b1V_tmp1D'0'=+ 11V_NbrDm1V_NbrDmI  + 1G1D'0'x1V_AdrH=+ 1V_Month1D'1'1V_AdrL- CMemFlash 1V_AdrL1V_AdrH 1V_NbrDm NbrOfDaysb:4:, + 1V_Year1D'4'T1V_Store/+1V_Store1V_Year1V_Store++ 1V_Store1V_Day1V_Store++ 1 1D'0'=1V_AdrH=+ 1V_Month1D'11'd1V_AdrL+7 1V_AdrL1V_AdrH1V_Mval+ 1V_Store1V_Mval1V_Store+b 1V_tmp+1D'0'+=b 1V_Month1D'1'=b 1V_Month1D'2'= +  11D'1'T1V_Biss=    +11D'0'1V_Biss=+1V_Store1D'6'1V_Store++1V_Store1D'7'1V_Store/++11V_tmp1V_DW=b1V_DW1D'0'=b1V_DW1D'1'=b1V_DW1D'2'=b1V_DW1D'3'= b1V_DW1D'4'=!b1V_DW1D'5'="b1V_DW1D'6'=#($1Sa(%1Di(&1Lu( '1Ma(!(1Me(")1Je(#*1Ve$%&'()*(+1Texte+ 1V_Store1V_Biss1V_Store-& CSTATUSCSTATUS DayOfWeek:0:  +11D'100'1V_Loop=& CBuzzerCSTATUS^T_1mS1000& CBuzzerCSTATUS+11V_Loop1V_Loop Db1V_Loop1D'0'= BeepC_TEMPO3000000T_3Sp200000T_200mSp50000T_50mSp15000WAIT_4msDlais Gest. LCDp4500 WAIT_1500sDlais Gest. LCDp100 WAIT_100sDlais Gest. LCDp1000T_1mSC_DEFBuzzerPORTC/PIC CLOCK M.LECLERE V1.20 (c) MLSoft 2011 16F870j_CP_OFF & _BODEN_OFF & _WRT_ENABLE_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _HS_OSC & _DEBUG_OFF & _CPD_OFFAPORTB,1PORTB,2PORTB,4PORTB,5PORTB,6PORTB,70x200z0x1F,0x1C,0x1F,0x1E,0x1F,0x1E 0x1F,0x1F,0x1E,0x1F,0x1E,0x1F 0x01,0x04,0x04,0x00,0x02,0x05 0x00,0x03,0x06,0x01,0x04,0x06