; Horloge / Calendrier temps réel ; Utilisation du circuit Dallas DS1307 (RTC avec bus I2C) ; Affichage sur afficheur LCD 2x16 lignes (interface parallèle 4 bits) ; (C) Fabrice Sincère, avril 2008 ; IUT de Nancy-Brabois ; http://pagesperso-orange.fr/fabrice.sincere ; Version 1.0.8 ; Microcontrôleur PIC 16F876A ; Microchip MPLAB IDE 7.41 ; Langage : assembleur Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct" List p=16F876A ; processeur utilisé #include __config _HS_OSC & _WDT_ON & _PWRTE_ON & _BODEN_ON & _LVP_OFF & _WRT_OFF & _CPD_OFF & _CP_OFF & _DEBUG_OFF ;Bits de configuration : ; -> Oscillateur HS (quartz 20 MHz) ; -> Watchdog timer ON : watchdog activé (2,3 secondes environ, supérieur à 1 seconde) ; -> Power up timer ON (72 ms : cela permet l'auto-initialisation de l'afficheur LCD) ; -> Brown out detect ON ; -> Low voltage program OFF ; -> Flash program write protection OFF ; -> Data EE read protect OFF ; -> Code protect OFF ; -> In-Circuit Debugger OFF ;xxxxxxxxxxxxxxx ; Macro ;xxxxxxxxxxxxxxx bank1 macro ; passage en banque 1 bsf STATUS,RP0 bcf STATUS,RP1 endm bank0 macro ; passage en banque 0 bcf STATUS,RP0 bcf STATUS,RP1 endm ;xxxxxxxxxxxxxxxxxxxxxxxxxx ; Déclaration des variables ;xxxxxxxxxxxxxxxxxxxxxxxxxx CBLOCK 0x070 ; début de la zone des registres d'usage général du 16F876A ; (banque quelconque : 0,1,2 ou 3) ; 0x070 - 0x07F : 16 variables STATUS_TEMP : 1 ; sauvegarde du registre STATUS (routine d'interruption) W_TEMP : 1 ; sauvegarde du registre W (routine d'interruption) data1 : 1 ; contient le niveau des bits RS et R/W (module LCD): ; (000000 RS R/W) data2 : 1 ; contient le niveau des bits DB7-DB0 (module LCD): ; (DB7 ... DB0) busy_flag : 1 ; seul le bit 0 est utilisé (module LCD) secondes : 1 ; lecture des secondes (registre d'adresse 0x00 du DS1307) minutes : 1 ; lecture des minutes (registre d'adresse 0x01 du DS1307) heures : 1 ; lecture des heures (registre d'adresse 0x02 du DS1307) jours : 1 ; lecture des jours (registre d'adresse 0x03 du DS1307) date : 1 ; lecture de la date (registre d'adresse 0x04 du DS1307) mois : 1 ; lecture du mois (registre d'adresse 0x05 du DS1307) annee : 1 ; lecture de l'année (registre d'adresse 0x06 du DS1307) chiffre : 1 ; variable d'entrée de la routine affichagechiffre etape : 1 ; = numéro de l'étape (1 à 11 en mode réglage) ; en mode normal : étape n°0 clignotement : 1 ; bit 1 = 0 : affichage ; bit 1 = 1 : masquage (' ') tampon : 1 ; variable temporaire ENDC CBLOCK 0x020 ; début de la zone des registres d'usage général du 16F876A ; de la banque 0 (0x020 - 0x06F : 80 variables) boutonpoussoir : 1 ; le bit 1 contient le niveau du BP1 de la dernière scrutation ; le bit 2 contient le niveau du BP2 de la dernière scrutation boutonpoussoirbak : 1 ; le bit 1 contient le niveau du BP1 de l'avant dernière scrutation ; le bit 2 contient le niveau du BP2 de l'avant dernière scrutation boutonpoussoiractivite : 1 ; ; bit 1 = 1 <=> BP1 a été appuyé entre les deux dernières scrutation ; bit 2 = 1 <=> BP2 a été appuyé entre les deux dernières scrutation ; variables d'entrées de la routine affichageLCDdateheure jours0 : 1 ; numéro du jour (.1 <=> Di ...) date0 : 1 ; codage BCD mois0 : 1 ; codage BCD annee0 : 1 ; codage BCD heures0 : 1 ; codage BCD minutes0 : 1 ; codage BCD secondes0 : 1 ; codage BCD compteur : 1 ENDC ;xxxxxxxxxxxxxxxxxxxx ; Démarrage sur reset ;xxxxxxxxxxxxxxxxxxxx org 0x0000 ; vecteur Reset goto initialisation ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine d'interruption ; 2 sources d'interruption ; -> Interruption RB0/INT (toutes les 1,000 000 s) ; -> Interruption Timer1 (toutes les 104,8576 ms) ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx org 0x0004 ; vecteur d'interruption movwf W_TEMP swapf STATUS,W movwf STATUS_TEMP ; sauvegarde du registre W puis du registre STATUS bank0 btfss INTCON, INTE goto int1 btfsc INTCON, INTF ; test du drapeau de l'interruption RB0/INT goto interruption_RB0 int1 bank1 btfss PIE1, TMR1IE goto int_fin bank0 btfsc PIR1, TMR1IF goto interruption_Timer1 int_fin goto restauration ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Traitement de l'interruption Timer1 ; (toutes les 104,8576 ms) ; -> gestion des boutons poussoirs ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx interruption_Timer1 ; on teste si on a appuyé sur le bouton BP1 (broche RB1) call BP1 ; on teste si on a appuyé sur le bouton BP2 (broche RB2) call BP2 ; si (etape) = 0 et BP1 non appuyé et BP2 non appuyé alors retour bank0 btfsc boutonpoussoiractivite , 1 goto interruption_Timer1_0 btfsc boutonpoussoiractivite , 2 goto interruption_Timer1_0 movf etape , f ; (etape) = (etape) btfss STATUS , Z ; test du bit Z goto interruption_Timer1_0 goto interruption_Timer1_retour interruption_Timer1_0 ; ; si BP1 a été appuyé : incrémentation du numéro d'étape btfss boutonpoussoiractivite , 1 goto interruption_Timer1_1 ; BP1 n'a pas été appuyé incf etape , f ; si (etape > .11) alors (etape = .0) movf etape , W ; W = (etape) sublw .11 ; W = .11 - (etape) btfsc STATUS, C ; test du bit C (Carry) goto interruption_Timer1_retour ; C = 1 c'est-à-dire (etape)<= .11 ; C = 0 c'est-à-dire (etape)> .11 clrf etape ; (etape) = .0 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; écriture de la nouvelle date/heure dans DS1307 call I2C_start movlw B'11010000' ; 8 bits à écrire (7 bits d'adresse + RW) ; 1011000 + 0 (write) call I2C_write call I2C_ACK_slave_to_master movlw 0x00 ; 8 bits à écrire (adresse du registre du DS1307) call I2C_write call I2C_ACK_slave_to_master movf secondes0 , W ; écriture dans le registre d'adresse 0x00 call I2C_write call I2C_ACK_slave_to_master movf minutes0 , W ; écriture dans le registre d'adresse 0x01 call I2C_write call I2C_ACK_slave_to_master movf heures0 , W ; écriture dans le registre d'adresse 0x02 call I2C_write call I2C_ACK_slave_to_master movf jours0 , W ; écriture dans le registre d'adresse 0x03 call I2C_write call I2C_ACK_slave_to_master movf date0 , W ; écriture dans le registre d'adresse 0x04 call I2C_write call I2C_ACK_slave_to_master movf mois0 , W ; écriture dans le registre d'adresse 0x05 call I2C_write call I2C_ACK_slave_to_master movf annee0 , W ; écriture dans le registre d'adresse 0x06 call I2C_write call I2C_ACK_slave_to_master call I2C_stop goto interruption_Timer1_retour interruption_Timer1_1 ; test BP2 btfss boutonpoussoiractivite , 2 goto etape_fin ; BP2 n'a pas été appuyé ; BP2 a été appuyé ; on teste si (etape = 1) etape01 ; jours movlw .1 ; W = .1 subwf etape, W ; W = (etape) - .1 btfss STATUS, Z ; test du bit Z goto etape02 ; Z = 0 c'est-à-dire (etape) != .1 incf jours0 , f ; si (jours0) > .7 alors (jours0) = .1 movf jours0 , W ; W = (jours0) sublw .7 ; W = .7 - (jours0) btfsc STATUS, C ; test du bit C (Carry) goto etape_fin ; C = 1 c'est-à-dire (jours0)<= .7 movlw .1 movwf jours0 ; (jours0) = .1 goto etape_fin ; on teste si (etape = 2) etape02 ; date (chiffre des dizaines) movlw .2 ; W = .2 subwf etape, W ; W = (etape) - .2 btfss STATUS, Z ; test du bit Z goto etape03 ; Z = 0 c'est-à-dire (etape) != .2 ; on incrémente la date (chiffre des dizaines) movlw 0x10 addwf date0 , f ; (date0) = (date0) + 0x10 ; si (date0) > 0x31 alors (date0) = 0x01 movf date0 , W ; W = (date0) sublw 0x31 ; W = 0x31 - (date0) btfsc STATUS, C ; test du bit C (Carry) goto etape_fin ; C = 1 c'est-à-dire (date0)<= 0x31 ;(date0) > 0x31 movlw 0x01 movwf date0 ; (date0) = 0x01 goto etape_fin ; on teste si (etape = 3) etape03 ; date (chiffre des unités) movlw .3 ; W = .3 subwf etape, W ; W = (etape) - .3 btfss STATUS, Z ; test du bit Z goto etape04 ; Z = 0 c'est-à-dire (etape) != .3 ; on incrémente la date (chiffre des unités) incf date0 , f ; (date0) = (date0) + 0x01 ; si (chiffre des unités) > .9 alors (chiffre des unités) =.0 movf date0 , W ; W = (date0) movwf tampon ; (tampon) = (date0) movlw B'00001111' ; masque andwf tampon , f ; fonction ET logique movf tampon , W ; W = (tampon) sublw .9 ; W = .9 - (tampon) btfsc STATUS, C ; test du bit C (Carry) goto etape03_0 ; C = 1 c'est-à-dire (tampon)<= .9 ;(tampon) > .9 movlw B'11110000' ; masque andwf date0 , f goto etape03_0 etape03_0 ; si (date0) > 0x31 alors (date0) = 0x30 movf date0 , W ; W = (date0) sublw 0x31 ; W = 0x31 - (date0) btfsc STATUS, C ; test du bit C (Carry) goto etape03_1 ; C = 1 c'est-à-dire (date0)<= 0x31 movlw 0x30 movwf date0 ; (date0) = 0x30 goto etape03_1 etape03_1 ; si (date0) = 0x00 alors (date0) = 0x01 movf date0 , f ; (date0) = (date0) btfss STATUS , Z ; test du bit Z goto etape_fin ; Z = 0 c'est-à-dire (date0) != 0x00 movlw 0x01 movwf date0 ; (date0) = 0x01 goto etape_fin ; on teste si (etape = 4) etape04 ; mois (chiffre des dizaines) movlw .4 ; W = .4 subwf etape, W ; W = (etape) - .4 btfss STATUS, Z ; test du bit Z goto etape05 ; Z = 0 c'est-à-dire (etape) != .4 ; on incrémente le mois (chiffre des dizaines) movlw 0x10 addwf mois0 , f ; (mois0) = (mois0) + 0x10 ; si (mois0) > 0x12 alors (mois0) = 0x01 movf mois0 , W ; W = (mois0) sublw 0x12 ; W = 0x12 - (mois0) btfsc STATUS, C ; test du bit C (Carry) goto etape_fin ; C = 1 c'est-à-dire (mois0)<= 0x12 ;(mois0) > 0x12 movlw 0x01 movwf mois0 ; (mois0) = 0x01 goto etape_fin ; on teste si (etape = 5) etape05 ; mois (chiffre des unités) movlw .5 ; W = .5 subwf etape, W ; W = (etape) - .5 btfss STATUS, Z ; test du bit Z goto etape06 ; Z = 0 c'est-à-dire (etape) != .5 ; on incrémente le mois (chiffre des unités) incf mois0 , f ; (mois0) = (mois0) + 0x01 ; si (chiffre des unités) > .9 alors (chiffre des unités) =.0 movf mois0 , W ; W = (mois0) movwf tampon ; (tampon) = (mois0) movlw B'00001111' ; masque andwf tampon , f ; fonction ET logique movf tampon , W ; W = (tampon) sublw .9 ; W = .9 - (tampon) btfsc STATUS, C ; test du bit C (Carry) goto etape05_0 ; C = 1 c'est-à-dire (tampon)<= .9 ;(tampon) > .9 movlw B'11110000' ; masque andwf mois0 , f goto etape05_0 etape05_0 ; si (mois0) > 0x12 alors (mois0) = 0x10 movf mois0 , W ; W = (mois0) sublw 0x12 ; W = 0x12 - (mois0) btfsc STATUS, C ; test du bit C (Carry) goto etape05_1 ; C = 1 c'est-à-dire (mois0)<= 0x12 movlw 0x10 movwf mois0 ; (mois0) = 0x10 goto etape05_1 etape05_1 ; si (mois0) = 0x00 alors (mois0) = 0x01 movf mois0 , f ; (mois0) = (mois0) btfss STATUS , Z ; test du bit Z goto etape_fin ; Z = 0 c'est-à-dire (mois0) != 0x00 movlw 0x01 movwf mois0 ; (mois0) = 0x01 goto etape_fin ; on teste si (etape = 6) etape06 ; année (chiffre des dizaines) movlw .6 ; W = .6 subwf etape, W ; W = (etape) - .6 btfss STATUS, Z ; test du bit Z goto etape07 ; Z = 0 c'est-à-dire (etape) != .6 ; on incrémente l'année (chiffre des dizaines) movlw 0x10 addwf annee0 , f ; (annee0) = (annee0) + 0x10 ; si (chiffre des dizaines) > .9 alors (chiffre des dizaines) =.0 movf annee0 , W ; W = (annee0) sublw 0x9F ; W = 0x9F - (annee0) btfsc STATUS, C ; test du bit C (Carry) goto etape_fin ; C = 1 c'est-à-dire (chiffre des dizaines)<= .9 ;(chiffre des dizaines) > .9 movlw B'00001111' ; masque andwf annee0 , f goto etape_fin ; on teste si (etape = 7) etape07 ; année (chiffre des unités) movlw .7 ; W = .7 subwf etape, W ; W = (etape) - .7 btfss STATUS, Z ; test du bit Z goto etape08 ; Z = 0 c'est-à-dire (etape) != .7 ; on incrémente l'année (chiffre des unités) incf annee0 , f ; (annee0) = (annee0) + 0x01 ; si (chiffre des unités) > .9 alors (chiffre des unités) =.0 movf annee0 , W ; W = (annee0) movwf tampon ; (tampon) = (annee0) movlw B'00001111' ; masque andwf tampon , f ; fonction ET logique movf tampon , W ; W = (tampon) sublw .9 ; W = .9 - (tampon) btfsc STATUS, C ; test du bit C (Carry) goto etape_fin ; C = 1 c'est-à-dire (tampon)<= .9 ;(tampon) > .9 movlw B'11110000' ; masque andwf annee0 , f goto etape_fin ; on teste si (etape = 8) etape08 ; heures (chiffre des dizaines) movlw .8 ; W = .8 subwf etape, W ; W = (etape) - .8 btfss STATUS, Z ; test du bit Z goto etape09 ; Z = 0 c'est-à-dire (etape) != .8 ; on incrémente l'heure (chiffre des dizaines) movlw 0x10 addwf heures0 , f ; (heures0) = (heures0) + 0x10 ; si (heures0) > 0x23 alors (heures0) = 0x00 movf heures0 , W ; W = (heures0) sublw 0x23 ; W = 0x23 - (heures0) btfsc STATUS, C ; test du bit C (Carry) goto etape_fin ; C = 1 c'est-à-dire (heures0)<= 0x23 ;(heures0) > 0x23 clrf heures0 ; (heures0) = 0x00 goto etape_fin ; on teste si (etape = 9) etape09 ; heures (chiffre des unités) movlw .9 ; W = .9 subwf etape, W ; W = (etape) - .9 btfss STATUS, Z ; test du bit Z goto etape10 ; Z = 0 c'est-à-dire (etape) != .9 ; on incrémente l'heures (chiffre des unités) incf heures0 , f ; (heures0) = (heures0) + 0x01 ; si (chiffre des unités) > .9 alors (chiffre des unités) =.0 movf heures0 , W ; W = (heures0) movwf tampon ; (tampon) = (heures0) movlw B'00001111' ; masque andwf tampon , f ; fonction ET logique movf tampon , W ; W = (tampon) sublw .9 ; W = .9 - (tampon) btfsc STATUS, C ; test du bit C (Carry) goto etape09_0 ; C = 1 c'est-à-dire (tampon)<= .9 ;(tampon) > .9 movlw B'11110000' ; masque andwf heures0 , f goto etape09_0 etape09_0 ; si (heures0) > 0x23 alors (heures0) = 0x20 movf heures0 , W ; W = (heures0) sublw 0x23 ; W = 0x23 - (heures0) btfsc STATUS, C ; test du bit C (Carry) goto etape_fin ; C = 1 c'est-à-dire (heures0)<= 0x23 movlw 0x20 movwf heures0 ; (heures0) = 0x20 goto etape_fin ; on teste si (etape = 10) etape10 ; minutes (chiffre des dizaines) movlw .10 ; W = .10 subwf etape, W ; W = (etape) - .10 btfss STATUS, Z ; test du bit Z goto etape11 ; Z = 0 c'est-à-dire (etape) != .10 ; on incrémente les minutes (chiffre des dizaines) movlw 0x10 addwf minutes0 , f ; (minutes0) = (minutes0) + 0x10 ; si (chiffre des dizaines) > .5 alors (chiffre des dizaines) =.0 movf minutes0 , W ; W = (minutes0) sublw 0x5F ; W = 0x5F - (minutes0) btfsc STATUS, C ; test du bit C (Carry) goto etape_fin ; C = 1 c'est-à-dire (chiffre des dizaines)<= .5 ;(chiffre des dizaines) > .5 movlw B'00001111' ; masque andwf minutes0 , f goto etape_fin ; on teste si (etape = 11) etape11 ; minutes (chiffre des unités) movlw .11 ; W = .11 subwf etape, W ; W = (etape) - .11 btfss STATUS, Z ; test du bit Z goto interruption_Timer1_retour ; Z = 0 c'est-à-dire (etape) != .11 ; normalement on ne doit pas arriver ici ... ; on incrémente les minutes (chiffre des unités) incf minutes0 , f ; (minutes0) = (minutes0) + 0x01 ; si (chiffre des unités) > .9 alors (chiffre des unités) =.0 movf minutes0 , W ; W = (minutes0) movwf tampon ; (tampon) = (annee0) movlw B'00001111' ; masque andwf tampon , f ; fonction ET logique movf tampon , W ; W = (tampon) sublw .9 ; W = .9 - (tampon) btfsc STATUS, C ; test du bit C (Carry) goto etape_fin ; C = 1 c'est-à-dire (tampon)<= .9 ;(tampon) > .9 movlw B'11110000' ; masque andwf minutes0 , f goto etape_fin etape_fin call affichageLCDdateheure goto interruption_Timer1_retour interruption_Timer1_retour bank0 bcf PIR1, TMR1IF ; on efface le drapeau de l'interruption Timer1 goto restauration ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Traitement de l'interruption RB0/INT (toutes les 1,000 000 s) ; -> lecture du calendrier (DS1307) ; -> mise à jour de l'affichage du module LCD ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx interruption_RB0 clrwdt ; on efface le watchdog ; => Reset si le module LCD ne répond pas (bit busy_flag) ; ou si le DS1307 ne répond pas (bit acknowledge ...) ; on teste le n° étape movf etape , f ; (etape) = (etape) btfss STATUS , Z ; test du bit Z goto interruption_RB0_retour ; Z = 0 c'est-à-dire (etape) != .0 clrf clignotement ; bit 1 = 0 (affichage) ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Lecture du calendrier (DS1307) ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; étape n°0 (mode normal) call I2C_start movlw B'11010000' ; 8 bits à écrire (7 bits d'adresse I2C + 0 Write ) call I2C_write call I2C_ACK_slave_to_master movlw B'00000000' ; 8 bits à écrire (registre d'adresse 0x00) call I2C_write call I2C_ACK_slave_to_master call I2C_Repeated_Start movlw B'11010001' ; 8 bits à écrire (7 bits d'adresse + 1 Read) call I2C_write call I2C_ACK_slave_to_master call I2C_read movwf secondes ; lecture des secondes (registre d'adresse 0x00) call I2C_ACK_master_to_slave call I2C_read movwf minutes ; lecture des minutes (registre d'adresse 0x01) call I2C_ACK_master_to_slave call I2C_read movwf heures ; lecture des heures (registre d'adresse 0x02) call I2C_ACK_master_to_slave call I2C_read movwf jours ; lecture des jours (registre d'adresse 0x03) call I2C_ACK_master_to_slave call I2C_read movwf date ; lecture de la dates (registre d'adresse 0x04) call I2C_ACK_master_to_slave call I2C_read movwf mois ; lecture des mois (registre d'adresse 0x05) call I2C_ACK_master_to_slave call I2C_read movwf annee ; lecture de l'année (registre d'adresse 0x06) call I2C_NOACK call I2C_stop ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Mise à jour de l'affichage du module LCD bank0 movlw B'00000111' ; masque andwf jours , f ; fonction ET logique movf jours , W ; W = (jours) movwf jours0 ; (jours0) = (jours) movf date , W ; W = (date) movwf date0 ; (date0) = (date) movf mois , W ; W = (mois) movwf mois0 ; (mois0) = (mois) movf annee , W ; W = (annee) movwf annee0 ; (annee0) = (annee) movf heures , W ; W = (heures) movwf heures0 ; (heures0) = (heures) movf minutes , W ; W = (minutes) movwf minutes0 ; (minutes0) = (minutes) movf secondes , W ; W = (secondes) movwf secondes0 ; (secondes0) = (secondes) call affichageLCDdateheure interruption_RB0_retour bcf INTCON , INTF ; on efface le drapeau de l'interruption RB0/INT goto restauration ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx restauration swapf STATUS_TEMP,W ; restauration des registres STATUS puis W movwf STATUS swapf W_TEMP,f swapf W_TEMP,W retfie ; retour d'interruption ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine de commande du module LCD ; On traite ici les instructions d'écriture (R/W = 0) ; - Display clear ; - Entry mode set ; - Display On/Off Control ; - Set function ; - Set DDRAM address ; - Write Data into DDRAM ; 2 variables d'entrée : data1, data2 ; pas de variable de sortie commandeLCD ; 1ère étape : RS =0, R/W=0 , E = 0 bcf PORTB , 5 ; E = 0 bcf PORTB , 3 ; RS = 0 bcf PORTB , 4 ; R/W = 0 ; mise à jour RS (RB3) btfsc data1 , 1 bsf PORTB , 3 btfss data1 , 1 bcf PORTB , 3 ; mise à jour R/W (RB4) btfsc data1 , 0 bsf PORTB , 4 btfss data1 , 0 bcf PORTB , 4 ; 2ème étape : DB7 DB6 DB5 DB4 ; mise à jour DB7 (RA3) btfsc data2 , 7 bsf PORTA , 3 btfss data2 , 7 bcf PORTA , 3 ; mise à jour DB6 (RA2) btfsc data2 , 6 bsf PORTA , 2 btfss data2 , 6 bcf PORTA , 2 ; mise à jour DB5 (RA1) btfsc data2 , 5 bsf PORTA , 1 btfss data2 , 5 bcf PORTA , 1 ; mise à jour DB4 (RA0) btfsc data2 , 4 bsf PORTA , 0 btfss data2 , 4 bcf PORTA , 0 ; 3ème étape E=1 (RB5) bsf PORTB , 5 nop nop nop nop nop ; une pause de 1 µs (220 ns suffisent) ; 4ème étape E=0 (RB5) bcf PORTB , 5 ; 5ème étape DB3 DB2 DB1 DB0 ; mise à jour DB3 (RA3) btfsc data2 , 3 bsf PORTA , 3 btfss data2 , 3 bcf PORTA , 3 ; mise à jour DB2 (RA2) btfsc data2 , 2 bsf PORTA , 2 btfss data2 , 2 bcf PORTA , 2 ; mise à jour DB1 (RA1) btfsc data2 , 1 bsf PORTA , 1 btfss data2 , 1 bcf PORTA , 1 ; mise à jour DB0 (RA0) btfsc data2 , 0 bsf PORTA , 0 btfss data2 , 0 bcf PORTA , 0 ; 6ème étape E=1 (RB5) bsf PORTB , 5 nop nop nop nop nop ; une pause de 1 µs (220 ns suffisent) ; 7ème étape E=0 (RB5) bcf PORTB , 5 ; xxxxxxxxxxxxxxxxxxxxxxxx ; on teste le drapeau Busy fin_instruction call busy btfsc busy_flag , 0 goto fin_instruction ; drapeau Busy = 1 (instruction en cours) ; drapeau Busy = 0 : instruction terminée return ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine (module LCD) ; Instruction "Read Busy Flag" ; Pas de variable d'entrée ; Variable de sortie : bit 0 de busy_flag ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx busy ; étape initiale : configuration des broches RA0 à RA3 en entrées bank1 bsf TRISA , 0 ; bit 0 du port A (RA0) = 1 : configuration en entrée (DB4) bsf TRISA , 1 ; bit 1 du port A (RA1) = 1 : configuration en entrée (DB5) bsf TRISA , 2 ; bit 2 du port A (RA2) = 1 : configuration en entrée (DB6) bsf TRISA , 3 ; bit 3 du port A (RA3) = 1 : configuration en entrée (DB7) bank0 ; 1ère étape : RS= 0, R/W =1 , E = 0 bcf PORTB , 5 ; E = 0 bcf PORTB , 3 ; RS = 0 bsf PORTB , 4 ; R/W = 1 ; 2ème étape : E = 1 bsf PORTB , 5 nop ; une petite pause de 200 ns ; 3ème étape : lecture DB7 (RA3)(busy flag) btfsc PORTA , 3 bsf busy_flag , 0 btfss PORTA , 3 bcf busy_flag , 0 ; bcf busy_flag , 0 ; à supprimer (test debugger MPLAB SIM) ; 4ème étape : E = 0 bcf PORTB , 5 nop ; une petite pause de 200 ns ; 5ème étape : E = 1 bsf PORTB , 5 nop ; une petite pause de 200 ns ; 6ème étape : DB3 DB2 DB1 DB0 nop ; 7ème étape : E = 0 bcf PORTB , 5 nop ; une petite pause de 200 ns ; 8ème étape : R/W = 0 bcf PORTB , 4 ; dernière étape : configuration des broches RA0 à RA3 en sorties bank1 bcf TRISA , 0 ; bit 0 du port A (RA0) = 0 : configuration en sortie (DB4) bcf TRISA , 1 ; bit 1 du port A (RA1) = 0 : configuration en sortie (DB5) bcf TRISA , 2 ; bit 2 du port A (RA2) = 0 : configuration en sortie (DB6) bcf TRISA , 3 ; bit 3 du port A (RA3) = 0 : configuration en sortie (DB7) bank0 return ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine d'affichage sur la module LCD ; Texte = "(C)" (1ère ligne) ; "Fabrice SINCERE" (2ème ligne) ; Pas de variable d'entrée ; Pas de variable de sortie ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx affichageFabriceSINCERE ; Instruction "Display Clear" ; (Efface l'écran ; Place le curseur dans la position d'origine : ; 1ère position à gauche, 1ère ligne : compteur d'adresse à 0x00) movlw B'00000000' movwf data1 movlw B'00000001' movwf data2 call commandeLCD ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw '(' movwf data2 call commandeLCD ; Affichage '(' ;movlw B'00000010' ;movwf data1 movlw 'C' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 movlw ')' movwf data2 call commandeLCD ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; On se positionne sur la deuxième ligne ; Instruction Set DDRAM Address movlw B'00000000' movwf data1 movlw B'11000000' ; adresse 0x40 movwf data2 call commandeLCD ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw 'F' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'a' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'b' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'r' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'i' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'c' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'e' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw ' ' ; espace movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'S' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'I' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'N' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'C' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'E' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'R' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw 'E' movwf data2 call commandeLCD return ;xxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine I2C Start ; Pas de variable d'entrée ; Pas de variable de sortie ;xxxxxxxxxxxxxxxxxxxxxxxxxx I2C_start call I2C_idle ; on attend que le bus I2C soit libre bank1 bsf SSPCON2 , SEN ; SEN = 1 (lancement d'une opération Start) bank0 return ;xxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine I2C Idle ; Pas de variable d'entrée ; Pas de variable de sortie ;xxxxxxxxxxxxxxxxxxxxxxxxxxx I2C_idle bank1 I2C_idle0 btfsc SSPCON2 , ACKEN goto I2C_idle0 ; le bit ACKEN n'est pas nul btfsc SSPCON2 , RCEN goto I2C_idle0 ; le bit RCEN n'est pas nul btfsc SSPCON2 , PEN goto I2C_idle0 ; le bit PEN n'est pas nul btfsc SSPCON2 , RSEN goto I2C_idle0 ; le bit RSEN n'est pas nul btfsc SSPCON2 , SEN goto I2C_idle0 ; le bit SEN n'est pas nul btfsc SSPSTAT , R_W goto I2C_idle0 ; le bit R_W n'est pas nul bank0 return ;xxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine I2C_write ; Variable d'entrée : W (accumulateur) ; Pas de variable de sortie ;xxxxxxxxxxxxxxxxxxxxxxxxxxxx I2C_write call I2C_idle ; on attend que le bus I2C soit prêt movwf SSPBUF return ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine I2C_ACK_slave_to_master ; Pas de variable d'entrée ; Pas de variable de sortie ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx I2C_ACK_slave_to_master call I2C_idle ; on attend que le bus I2C soit prêt bank1 I2C_ACK_slave_to_master0 btfsc SSPCON2 , ACKSTAT goto I2C_ACK_slave_to_master0 ; on attend la réception du bit ACK bank0 return ;xxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine I2C_Repeated_Start ; Pas de variable d'entrée ; Pas de variable de sortie ;xxxxxxxxxxxxxxxxxxxxxxxxxxx I2C_Repeated_Start call I2C_idle ; on attend que le bus I2C soit prêt bank1 bsf SSPCON2 , RSEN ; RSEN = 1 (lancement d'une opération Repeated Start) bank0 return ;xxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine I2C_read ; Pas de variable d'entrée ; variable de sortie : W (accumulateur) ;xxxxxxxxxxxxxxxxxxxxxxxxxxx I2C_read call I2C_idle ; on attend que le bus I2C soit prêt bank1 bsf SSPCON2 , RCEN ; on lance la réception I2C_read0 btfsc SSPCON2 , RCEN goto I2C_read0 ; on attend la fin de la réception bank0 movf SSPBUF , W return ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine I2C_ACK_master_to_slave ; Pas de variable d'entrée ; Pas de variable de sortie ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx I2C_ACK_master_to_slave call I2C_idle ; on attend que le bus I2C soit prêt bank1 bcf SSPCON2 , ACKDT ; ACKDT = 0 bsf SSPCON2 , ACKEN ; ACKEN = 1 (lancement d'une opération Acknowledge) bank0 return ;xxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine I2C_NOACK ; Pas de variable d'entrée ; Pas de variable de sortie ;xxxxxxxxxxxxxxxxxxxxxxxxxxxx I2C_NOACK call I2C_idle ; on attend que le bus I2C soit prêt bank1 bsf SSPCON2 , ACKDT ; ACKDT = 1 bsf SSPCON2 , ACKEN ; ACKEN = 1 (lancement d'une opération Acknowledge) bank0 return ;xxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine I2C_stop ; Pas de variable d'entrée ; Pas de variable de sortie ;xxxxxxxxxxxxxxxxxxxxxxxxxxx I2C_stop call I2C_idle ; on attend que le bus I2C soit prêt bank1 bsf SSPCON2 , PEN ; PEN = 1 (lancement d'une opération Stop) bank0 return ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine BP1 ; Détection d'un appuie sur le bouton poussoir BP1 (broche RB1) ; Pas de variable d'entrée ; Variable de sortie : ; bit 1 du registre boutonpoussoiractivite (banque 0) ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx BP1 bank0 bsf boutonpoussoirbak , 1 btfss boutonpoussoir , 1 bcf boutonpoussoirbak , 1 ; (boutonpoussoirbak , 1) = (boutonpoussoir , 1) bsf boutonpoussoir , 1 btfss PORTB , 1 bcf boutonpoussoir , 1 ; (boutonpoussoir , 1) = niveau actuel de RB1 bcf boutonpoussoiractivite , 1 btfss boutonpoussoirbak , 1 return btfsc boutonpoussoir , 1 return bsf boutonpoussoiractivite , 1 ; bouton poussoir 1 a été appuyé return ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine BP2 ; Détection d'un appuie sur le bouton poussoir BP2 (broche RB2) ; Pas de variable d'entrée ; Variable de sortie : ; bit 2 du registre boutonpoussoiractivite (banque 0) ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx BP2 bank0 bsf boutonpoussoirbak , 2 btfss boutonpoussoir , 2 bcf boutonpoussoirbak , 2 ; (boutonpoussoirbak , 2) = (boutonpoussoir , 2) bsf boutonpoussoir , 2 btfss PORTB , 2 bcf boutonpoussoir , 2 ; (boutonpoussoir , 2) = niveau actuel de RB2 bcf boutonpoussoiractivite , 2 btfss boutonpoussoirbak , 2 return btfsc boutonpoussoir , 2 return bsf boutonpoussoiractivite , 2 ; bouton poussoir 2 a été appuyé return ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine affichageLCDdateheure ; 1ère ligne : jj dd/mm/aaaa ; 2ème ligne : hh:mm:ss ; exemple : ; Lu 22/04/2010 ; 21:45:36 ; Variables d'entrée (banque 0) : ; etape ; clignotement (bit 1) ; ; jour0 ; date0 ; mois0 ; annee0 ; heures0 ; minutes0 ; secondes0 ; Pas de variable de sortie affichageLCDdateheure bank0 incf clignotement , f ; période de clignotement 2*104,8576 ms ; Instruction "Display Clear" ; (Efface l'écran ; Place le curseur dans la position d'origine : ; 1ère position à gauche, 1ère ligne : compteur d'adresse à 0x00) movlw B'00000000' movwf data1 movlw B'00000001' movwf data2 call commandeLCD ; jours0 : 00000b2b1b0 -> n° du jours ; 001 -> dimanche (Di) ; 010 -> lundi (Lu) ; 011 -> mardi (Ma) ; 100 -> Me ; 101 -> Je ; 110 -> Ve ; 111 -> Sa ; si etape = 1 et (clignotement , 1) = 1 ; alors on affiche deux espaces movlw .1 ; W = .1 subwf etape, W ; W = (etape) - .1 btfss STATUS, Z ; test du bit Z goto jour1 ; Z = 0 c'est-à-dire (etape) != .1 btfss clignotement , 1 goto jour1 ; on affiche ' ' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 movlw ' ' movwf data2 call commandeLCD goto _date ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx jour1 movlw 0x01 subwf jours0, W ; W = (jours0) - 0x01 btfss STATUS, Z ; test du bit Z goto jour2 ; Z = 0 c'est-à-dire (jours0) != 0x01 ; on affiche 'Di' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw 'D' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 movlw 'i' movwf data2 call commandeLCD goto _date jour2 movlw 0x02 subwf jours0, W ; W = (jours0) - 0x02 btfss STATUS, Z ; test du bit Z goto jour3 ; Z = 0 c'est-à-dire (jours0) != 0x02 ; on affiche 'Lu' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw 'L' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 movlw 'u' movwf data2 call commandeLCD goto _date jour3 movlw 0x03 subwf jours0, W ; W = (jours0) - 0x03 btfss STATUS, Z ; test du bit Z goto jour4 ; Z = 0 c'est-à-dire (jours0) != 0x03 ; on affiche 'Ma' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw 'M' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 movlw 'a' movwf data2 call commandeLCD goto _date jour4 movlw 0x04 subwf jours0, W ; W = (jours0) - 0x04 btfss STATUS, Z ; test du bit Z goto jour5 ; Z = 0 c'est-à-dire (jours0) != 0x04 ; on affiche 'Me' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw 'M' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 movlw 'e' movwf data2 call commandeLCD goto _date jour5 movlw 0x05 subwf jours0, W ; W = (jours0) - 0x05 btfss STATUS, Z ; test du bit Z goto jour6 ; Z = 0 c'est-à-dire (jours0) != 0x05 ; on affiche 'Je' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw 'J' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 movlw 'e' movwf data2 call commandeLCD goto _date jour6 movlw 0x06 subwf jours0, W ; W = (jours0) - 0x06 btfss STATUS, Z ; test du bit Z goto jour7 ; Z = 0 c'est-à-dire (jours0) != 0x06 ; on affiche 'Ve' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw 'V' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 movlw 'e' movwf data2 call commandeLCD goto _date jour7 ; nous sommes donc samedi ! ; on affiche 'Sa' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw 'S' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 movlw 'a' movwf data2 call commandeLCD goto _date ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; date0 : bit 5 bit 4 -> dizaines (00 à 11) ; b3b2b1b0 -> unités (0000 à 1001) _date ;movlw B'00000010' ;movwf data1 movlw ' ' ; affichage espace movwf data2 call commandeLCD ; affichage dizaine ; si etape = 2 et (clignotement , 1) = 1 ; alors on affiche un espace movlw .2 ; W = .2 subwf etape, W ; W = (etape) - .2 btfss STATUS, Z ; test du bit Z goto datedizaine ; Z = 0 c'est-à-dire (etape) != .2 btfss clignotement , 1 goto datedizaine ; on affiche ' ' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD goto dateunite ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx datedizaine movf date0 , W movwf chiffre ; (chiffre) = (date0) movlw B'00110000' ; masque andwf chiffre , f ; fonction ET logique swapf chiffre , f ; (chiffre) = (000000b5b4) call affichagechiffre ; affichage unité dateunite ; si etape = 3 et (clignotement , 1) = 1 ; alors on affiche un espace movlw .3 ; W = .3 subwf etape, W ; W = (etape) - .3 btfss STATUS, Z ; test du bit Z goto dateunite0 ; Z = 0 c'est-à-dire (etape) != .3 btfss clignotement , 1 goto dateunite0 ; on affiche ' ' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD goto moisdizaine ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx dateunite0 movf date0 , W movwf chiffre ; (chiffre) = (date) movlw B'00001111' ; masque andwf chiffre , f ; fonction ET logique (chiffre) = (0000b3b2b1b0) call affichagechiffre ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; mois0 : b4 -> dizaines (0 à 1) ; b3b2b1b0 -> unités (0000 à 1001) moisdizaine ;movlw B'00000010' ;movwf data1 movlw '/' ; affichage '/' movwf data2 call commandeLCD ; affichage dizaine ; si etape = 4 et (clignotement , 1) = 1 ; alors on affiche un espace movlw .4 ; W = .4 subwf etape, W ; W = (etape) - .4 btfss STATUS, Z ; test du bit Z goto moisdizaine0 ; Z = 0 c'est-à-dire (etape) != .4 btfss clignotement , 1 goto moisdizaine0 ; on affiche ' ' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD goto moisunite ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx moisdizaine0 movf mois0 , W movwf chiffre ; (chiffre) = (mois) movlw B'00010000' ; masque andwf chiffre , f ; fonction ET logique swapf chiffre , f ; (chiffre) = (0000000b4) call affichagechiffre ; affichage unité moisunite ; si etape = 5 et (clignotement , 1) = 1 ; alors on affiche un espace movlw .5 ; W = .5 subwf etape, W ; W = (etape) - .5 btfss STATUS, Z ; test du bit Z goto moisunite0 ; Z = 0 c'est-à-dire (etape) != .5 btfss clignotement , 1 goto moisunite0 ; on affiche ' ' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD goto anneedizaine ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx moisunite0 movf mois0 , W movwf chiffre ; (chiffre) = (mois) movlw B'00001111' ; masque andwf chiffre , f ; fonction ET logique (chiffre) = (0000b3b2b1b0) call affichagechiffre ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; annee0 : b7b6b5b4 -> dizaines (0000 à 1001) ; b3b2b1b0 -> unités (0000 à 1001) anneedizaine ;movlw B'00000010' ;movwf data1 movlw '/' ; affichage '/' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 movlw '2' ; affichage année 2XXX movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 movlw '0' ; affichage année 20XX movwf data2 call commandeLCD ; affichage dizaine ; si etape = 6 et (clignotement , 1) = 1 ; alors on affiche un espace movlw .6 ; W = .6 subwf etape, W ; W = (etape) - .6 btfss STATUS, Z ; test du bit Z goto anneedizaine0 ; Z = 0 c'est-à-dire (etape) != .6 btfss clignotement , 1 goto anneedizaine0 ; on affiche ' ' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD goto anneeunite ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx anneedizaine0 movf annee0 , W movwf chiffre ; (chiffre) = (annee) movlw B'11110000' ; masque andwf chiffre , f ; fonction ET logique swapf chiffre , f ; (chiffre) = (0000b7b6b5b4) call affichagechiffre ; affichage unité anneeunite ; si etape = 7 et (clignotement , 1) = 1 ; alors on affiche un espace movlw .7 ; W = .7 subwf etape, W ; W = (etape) - .7 btfss STATUS, Z ; test du bit Z goto anneeunite0 ; Z = 0 c'est-à-dire (etape) != .7 btfss clignotement , 1 goto anneeunite0 ; on affiche ' ' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD goto heuredizaine ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx anneeunite0 movf annee0 , W movwf chiffre ; (chiffre) = (annee) movlw B'00001111' ; masque andwf chiffre , f ; fonction ET logique (chiffre) = (0000b3b2b1b0) call affichagechiffre ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; On se positionne sur la deuxième ligne ; Instruction Set DDRAM Address heuredizaine movlw B'00000000' movwf data1 movlw B'11000000' ; adresse 0x40 movwf data2 call commandeLCD ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD ;movlw B'00000010' ;movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; heures0 : b5b4 -> dizaines (00 à 10) ; b3b2b1b0 -> unités (0000 à 1001) ; affichage dizaine ; si etape = 8 et (clignotement , 1) = 1 ; alors on affiche un espace movlw .8 ; W = .8 subwf etape, W ; W = (etape) - .8 btfss STATUS, Z ; test du bit Z goto heuredizaine0 ; Z = 0 c'est-à-dire (etape) != .8 btfss clignotement , 1 goto heuredizaine0 ; on affiche ' ' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD goto heureunite ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx heuredizaine0 movf heures0 , W movwf chiffre ; (chiffre) = (date) movlw B'00110000' ; masque andwf chiffre , f ; fonction ET logique swapf chiffre , f ; (chiffre) = (000000b5b4) call affichagechiffre ; affichage unité heureunite ; si etape = 9 et (clignotement , 1) = 1 ; alors on affiche un espace movlw .9 ; W = .9 subwf etape, W ; W = (etape) - .9 btfss STATUS, Z ; test du bit Z goto heureunite0 ; Z = 0 c'est-à-dire (etape) != .9 btfss clignotement , 1 goto heureunite0 ; on affiche ' ' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD goto minutedizaine ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx heureunite0 movf heures0 , W movwf chiffre ; (chiffre) = (date) movlw B'00001111' ; masque andwf chiffre , f ; fonction ET logique (chiffre) = (0000b3b2b1b0) call affichagechiffre ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; minutes0 : b6b5b4 -> dizaines (000 à 101) ; b3b2b1b0 -> unités (0000 à 1001) minutedizaine ;movlw B'00000010' ;movwf data1 movlw ':' ; affichage ':' movwf data2 call commandeLCD ; affichage dizaine ; si etape = 10 et (clignotement , 1) = 1 ; alors on affiche un espace movlw .10 ; W = .10 subwf etape, W ; W = (etape) - .10 btfss STATUS, Z ; test du bit Z goto minutedizaine0 ; Z = 0 c'est-à-dire (etape) != .10 btfss clignotement , 1 goto minutedizaine0 ; on affiche ' ' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD goto minuteunite ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx minutedizaine0 movf minutes0 , W movwf chiffre ; (chiffre) = (annee) movlw B'01110000' ; masque andwf chiffre , f ; fonction ET logique swapf chiffre , f ; (chiffre) = (0000b7b6b5b4) call affichagechiffre ; affichage unité minuteunite ; si etape = 11 et (clignotement , 1) = 1 ; alors on affiche un espace movlw .11 ; W = .11 subwf etape, W ; W = (etape) - .11 btfss STATUS, Z ; test du bit Z goto minuteunite0 ; Z = 0 c'est-à-dire (etape) != .11 btfss clignotement , 1 goto minuteunite0 ; on affiche ' ' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw ' ' movwf data2 call commandeLCD goto secondedizaine ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx minuteunite0 movf minutes0 , W movwf chiffre ; (chiffre) = (annee) movlw B'00001111' ; masque andwf chiffre , f ; fonction ET logique (chiffre) = (0000b3b2b1b0) call affichagechiffre ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; secondes0 : b6b5b4 -> dizaines (000 à 101) ; b3b2b1b0 -> unités (0000 à 1001) secondedizaine ;movlw B'00000010' ;movwf data1 movlw ':' ; affichage ':' movwf data2 call commandeLCD ; affichage dizaine movf secondes0 , W movwf chiffre ; (chiffre) = (annee) movlw B'01110000' ; masque andwf chiffre , f ; fonction ET logique swapf chiffre , f ; (chiffre) = (0000b7b6b5b4) call affichagechiffre ; affichage unité movf secondes0 , W movwf chiffre ; (chiffre) = (annee) movlw B'00001111' ; masque andwf chiffre , f ; fonction ET logique (chiffre) = (0000b3b2b1b0) call affichagechiffre return ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Routine affichage d'un chiffre sur le module LCD ; 1 variable d'entrée : chiffre ; (chiffre) doit contenir un nombre ; compris entre (00000000) et (00001001) 0 à 9 ; Pas de variable de sortie affichagechiffre movlw 0x00 subwf chiffre, W ; W = (chiffre) - 0x00 btfss STATUS, Z ; test du bit Z goto affichagechiffre1 ; Z = 0 c'est-à-dire (chiffre) != 0x00 ; on affiche '0' ; Instruction "Write Data into DDRAM" movlw B'00000010' movwf data1 ; RS = 1 R/W = 0 movlw '0' movwf data2 call commandeLCD return affichagechiffre1 movlw 0x01 subwf chiffre, W ; W = (chiffre) - 0x01 btfss STATUS, Z ; test du bit Z goto affichagechiffre2 ; Z = 0 c'est-à-dire (chiffre) != 0x01 ; on affiche '1' ; Instruction "Write Data into DDRAM" ; movlw B'00000010' ; movwf data1 ; RS = 1 R/W = 0 movlw '1' movwf data2 call commandeLCD return affichagechiffre2 movlw 0x02 subwf chiffre, W ; W = (chiffre) - 0x02 btfss STATUS, Z ; test du bit Z goto affichagechiffre3 ; Z = 0 c'est-à-dire (chiffre) != 0x02 ; on affiche '2' ; Instruction "Write Data into DDRAM" ; movlw B'00000010' ; movwf data1 ; RS = 1 R/W = 0 movlw '2' movwf data2 call commandeLCD return affichagechiffre3 movlw 0x03 subwf chiffre, W ; W = (chiffre) - 0x03 btfss STATUS, Z ; test du bit Z goto affichagechiffre4 ; Z = 0 c'est-à-dire (chiffre) != 0x03 ; on affiche '3' ; Instruction "Write Data into DDRAM" ; movlw B'00000010' ; movwf data1 ; RS = 1 R/W = 0 movlw '3' movwf data2 call commandeLCD return affichagechiffre4 movlw 0x04 subwf chiffre, W ; W = (chiffre) - 0x04 btfss STATUS, Z ; test du bit Z goto affichagechiffre5 ; Z = 0 c'est-à-dire (chiffre) != 0x04 ; on affiche '4' ; Instruction "Write Data into DDRAM" ; movlw B'00000010' ; movwf data1 ; RS = 1 R/W = 0 movlw '4' movwf data2 call commandeLCD return affichagechiffre5 movlw 0x05 subwf chiffre, W ; W = (chiffre) - 0x05 btfss STATUS, Z ; test du bit Z goto affichagechiffre6 ; Z = 0 c'est-à-dire (chiffre) != 0x05 ; on affiche '5' ; Instruction "Write Data into DDRAM" ; movlw B'00000010' ; movwf data1 ; RS = 1 R/W = 0 movlw '5' movwf data2 call commandeLCD return affichagechiffre6 movlw 0x06 subwf chiffre, W ; W = (chiffre) - 0x06 btfss STATUS, Z ; test du bit Z goto affichagechiffre7 ; Z = 0 c'est-à-dire (chiffre) != 0x06 ; on affiche '6' ; Instruction "Write Data into DDRAM" ; movlw B'00000010' ; movwf data1 ; RS = 1 R/W = 0 movlw '6' movwf data2 call commandeLCD return affichagechiffre7 movlw 0x07 subwf chiffre, W ; W = (chiffre) - 0x07 btfss STATUS, Z ; test du bit Z goto affichagechiffre8 ; Z = 0 c'est-à-dire (chiffre) != 0x07 ; on affiche '7' ; Instruction "Write Data into DDRAM" ; movlw B'00000010' ; movwf data1 ; RS = 1 R/W = 0 movlw '7' movwf data2 call commandeLCD return affichagechiffre8 movlw 0x08 subwf chiffre, W ; W = (chiffre) - 0x08 btfss STATUS, Z ; test du bit Z goto affichagechiffre9 ; Z = 0 c'est-à-dire (chiffre) != 0x08 ; on affiche '8' ; Instruction "Write Data into DDRAM" ; movlw B'00000010' ; movwf data1 ; RS = 1 R/W = 0 movlw '8' movwf data2 call commandeLCD return affichagechiffre9 movlw 0x09 subwf chiffre, W ; W = (chiffre) - 0x09 btfss STATUS, Z ; test du bit Z goto affichageerror ; Z = 0 c'est-à-dire (chiffre) != 0x09 ; on affiche '9' ; Instruction "Write Data into DDRAM" ; movlw B'00000010' ; movwf data1 ; RS = 1 R/W = 0 movlw '9' movwf data2 call commandeLCD return affichageerror ; normalement, on ne doit pas arriver ici ! ; on affiche '?' ; Instruction "Write Data into DDRAM" ; movlw B'00000010' ; movwf data1 ; RS = 1 R/W = 0 movlw '?' movwf data2 call commandeLCD return ; xxxxxxxxxxx fin routine affichagechiffre xxxxxxxx ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Initialisation ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx initialisation bank0 clrf PORTA ; mise à 0 des sorties du port A clrf PORTB ; mise à 0 des sorties du port B clrf PORTC ; mise à 0 des sorties du port C bank1 movlw B'00111111' movwf OPTION_REG ; bit 7 (/RBPU) = 0 : PORTB pull-ups are enabled (boutons poussoirs sur RB1 et RB2) ; bit 6 (INTEDG) = 0 : Interrupt on falling edge of RB0/INT pin ; bit 3 (PSA) = 1 ; bit 2 (PS2) = 1 ; bit 1 (PS1) = 1 ; bit 0 (PS0) = 1 ; watchdog : prescaler 1:128 (environ 2,3 secondes) movlw B'00000110' movwf ADCON1 ; les broches RA0, RA1, RA2 et RA3 sont configurées commme entrée/sortie de type numérique movlw B'11110000' movwf TRISA ; bit 0 du port A (RA0) = 0 : configuration en sortie (DB4, module LCD) ; bit 1 du port A (RA1) = 0 : configuration en sortie (DB5, module LCD) ; bit 2 du port A (RA2) = 0 : configuration en sortie (DB6, module LCD) ; bit 3 du port A (RA3) = 0 : configuration en sortie (DB7, module LCD) movlw B'11000111' movwf TRISB ; bit 0 du port B (RB0) = 1 : configuration en entrée (reliée à la sortie SQW/OUT du DS1307 ; signal de fréquence 1,000 000 Hz) ; bit 1 du port B (RB1) = 1 : configuration en entrée (Bouton poussoir 1) ; bit 2 du port B (RB2) = 1 : configuration en entrée (Bouton poussoir 2) ; bit 3 du port B (RB3) = 0 : configuration en sortie (RS, module LCD) ; bit 4 du port B (RB4) = 0 : configuration en sortie (R/W, module LCD) ; bit 5 du port B (RB5) = 0 : configuration en sortie (E, module LCD) ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Configuration du module MSSP du PIC 16F876A (I2C maître) ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx bank1 bsf TRISC , 3 ; broche RC3/SCK/SCL configurée en entrée bsf TRISC , 4 ; broche RC4/SDI/SDA configurée en entrée bsf SSPSTAT , SMP ; bit 7 (SMP) = 1 : fréquence de l'horloge du bus I2C : F SCL = 100 kHz bcf SSPSTAT , CKE ; bit 6 (CKE) = 0 : Disable SMBus specific inputs movlw 0x31 movwf SSPADD ; (SSPADD) = (FOSC / (4*f SCL)) - 1 = 0x31 ; FOSC = 20 MHz bank0 movlw B'00101000' movwf SSPCON ; bit 5 (SSPEN) = 1 : enable the MSSP ; bit 3 (SSPM3) = 1 ; bit 2 (SSPM2) = 0 ; bit 1 (SSPM1) = 0 ; bit 0 (SSPM0) = 0 ; (SSPM3:SSPM0) = (1000) : MSSP configuré dans le mode I2C maître ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Initialisation du module LCD (interface 4 bits) ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Instruction "Set Function" ; Choix du mode 4 bits (à la mise sous tension : mode 8 bits par défaut) ; RS R/W DB7 DB6 DB5 DB4 ; 0 0 0 0 1 0 bcf PORTB , 5 ; E = 0 bcf PORTB , 3 ; RS = 0 bcf PORTB , 4 ; R/W = 0 bcf PORTA , 0 ; DB4 = 0 bsf PORTA , 1 ; DB5 = 1 bcf PORTA , 2 ; DB6 = 0 bcf PORTA , 3 ; DB7 = 0 bsf PORTB , 5 ; E = 1 nop nop nop nop nop ; une pause de 5 x 200 ns = 1 µs (220 ns suffisent) bcf PORTB , 5 ; E = 0 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; pause de 3 x 256 x 0,2 = 153,6 µs (N.B. 39 µs suffisent) bank0 ; configuration du timer 1 movlw B'00000001' movwf T1CON ; bit 5 (T1CKPS1) = 0 : prescaler 1:1 ; bit 4 (T1CKPS0) = 0 : prescaler 1:1 ; bit 1 (TMR1CS) = 0 : Internal clock (FOSC/4) ; bit 0 (TMR1ON) = 1 : Enables Timer1 clrf TMR1L movlw D'253' movwf TMR1H bcf PIR1 , TMR1IF ; on efface le drapeau du timer1 attente3 btfss PIR1 , TMR1IF goto attente3 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; data1 : contient le niveau des bits RS et R/W (module LCD): ; (000000 RS R/W) ; data2 : contient le niveau des bits DB7-DB0 (module LCD): ; (DB7 ... DB0) ; Instruction "Set Function" (DL = 0, N = 1, F = 0) movlw B'00000000' movwf data1 movlw B'00101000' movwf data2 call commandeLCD ; Instruction "Set Function" (DL = 0, N = 1, F = 0) ; on recommence par précaution movlw B'00000000' movwf data1 movlw B'00101000' movwf data2 call commandeLCD ; Instruction "Display On/Off" (D = 1 , C = 0 , B = 0) movlw B'00000000' movwf data1 movlw B'00001100' movwf data2 call commandeLCD ; Instruction "Entry Mode Set" (I/D = 1 , SH = 0) movlw B'00000000' movwf data1 movlw B'00000110' movwf data2 call commandeLCD ; Instruction "Display Clear" movlw B'00000000' movwf data1 movlw B'00000001' movwf data2 call commandeLCD ; Affichage facultatif "(C) Fabrice SINCERE" sur les deux lignes du module LCD call affichageFabriceSINCERE ; Temporisation ; pour qu'on ait le temps de voir le message précédent ; pause de 65536 * 0,2 µs * 32 boucles = 419 ms bank0 clrf compteur clrf TMR1L clrf TMR1H attente1 bcf PIR1 , TMR1IF ; on efface le drapeau du timer1 attente0 btfss PIR1 , TMR1IF goto attente0 incf compteur , f ; on incrémente le compteur btfss compteur , 5 ; on teste le bit 5 (00100000) = .32 goto attente1 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Configuration DS1307 (Real Time Clock) bus I2C esclave ; adresse I2C : 1011000 ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Ecriture dans le registre de contrôle (adresse 0x07) du DS1307 call I2C_start movlw B'11010000' ; 8 bits à écrire (7 bits d'adresse + RW) ; 1011000 + 0 (write) call I2C_write call I2C_ACK_slave_to_master movlw 0x07 ; 8 bits à écrire (adresse du registre de contrôle du DS1307) call I2C_write call I2C_ACK_slave_to_master movlw B'00010000' ; écriture du contenu du registre de contrôle du DS1307 ; bit 4 : SQWE = 1 ; bit 1 : RS1 = 0 ; bit 0 : RS0 = 0 ; 1,000 000 Hz sur la sortie SQW/OUT call I2C_write call I2C_ACK_slave_to_master call I2C_stop ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Lecture dans le registre d'adresse 0x00 (seconds) du DS1307 call I2C_start movlw B'11010000' ; 8 bits à écrire (7 bits d'adresse I2C + 0 Write ) call I2C_write call I2C_ACK_slave_to_master movlw B'00000000' ; 8 bits à écrire (registre d'adresse 0x00) call I2C_write call I2C_ACK_slave_to_master call I2C_Repeated_Start movlw B'11010001' ; 8 bits à écrire (7 bits d'adresse + 1 Read) call I2C_write call I2C_ACK_slave_to_master call I2C_read movwf secondes ; lecture des secondes (registre d'adresse 0x00) call I2C_NOACK call I2C_stop ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Ecriture dans le registre d'adresse 0x00 (secondes) du DS1307 call I2C_start movlw B'11010000' ; 8 bits à écrire (7 bits d'adresse + RW) ; 1011000 + 0 (write) call I2C_write call I2C_ACK_slave_to_master movlw 0x00 ; 8 bits à écrire (adresse du registre du DS1307) call I2C_write call I2C_ACK_slave_to_master bcf secondes , 7 ; bit 7 (CH) = 0 : enable the oscillator movf secondes , W ; écriture du contenu du registre call I2C_write call I2C_ACK_slave_to_master call I2C_stop ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Lecture dans le registre d'adresse 0x02 (seconds) du DS1307 call I2C_start movlw B'11010000' ; 8 bits à écrire (7 bits d'adresse I2C + 0 Write ) call I2C_write call I2C_ACK_slave_to_master movlw B'00000010' ; 8 bits à écrire (registre d'adresse 0x02) call I2C_write call I2C_ACK_slave_to_master call I2C_Repeated_Start movlw B'11010001' ; 8 bits à écrire (7 bits d'adresse + 1 Read) call I2C_write call I2C_ACK_slave_to_master call I2C_read movwf heures ; lecture des heures (registre d'adresse 0x02) call I2C_NOACK call I2C_stop ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; écriture dans le registre d'adresse 0x02 (hours) du DS1307 call I2C_start movlw B'11010000' ; 8 bits à écrire (7 bits d'adresse + RW) ; 1011000 + 0 (write) call I2C_write call I2C_ACK_slave_to_master movlw 0x02 ; 8 bits à écrire (adresse du registre du DS1307) call I2C_write call I2C_ACK_slave_to_master bcf heures , 6 ; bit 6 (AM/PM) = 0 : mode 24 heures movf heures , W ; écriture du contenu du registre call I2C_write call I2C_ACK_slave_to_master call I2C_stop ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx bank0 movlw B'11010010' movwf INTCON ; bit 7 (GIE) = 1 : autorisation globale des interruptions ; bit 6 (PEIE) = 1 : autorisation des interruptions des périphériques (Timer1 ...) ; bit 4 (INTE) = 1 : autorisation de l'interruption RB0/INT ; bit 1 (INTF)= 0 : on efface le drapeau de l'interruption RB0/INT ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ; Configuration du TIMER1 (16 bits) en mode timer ; Utilisation de l'interruption ; Débordement (0xFFFF -> 0x0000) toutes les ; 8 (prescaler)x 65536 (16 bits)x 0,2 µs = 104,8576 ms ; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx bsf T1CON , T1CKPS1 bsf T1CON , T1CKPS0 ; prescaler 1:8 bsf T1CON , TMR1ON ; Enables TIMER1 bank1 bsf PIE1 , TMR1IE ; autorisation de l'interruption du TIMER1 (16 bits) clrwdt ; on efface le watchdog bank0 bsf boutonpoussoir , 1 bsf boutonpoussoir , 2 bsf boutonpoussoirbak , 1 bsf boutonpoussoirbak , 2 clrf boutonpoussoiractivite clrf etape ; étape n°0 (mode normal) clrf clignotement ; bit 1 = 0 (affichage) ;xxxxxxxxxxxxxxxxxxxxx ; Programme principal ;xxxxxxxxxxxxxxxxxxxxx debut_programme ; on attend une interruption (RB0/INT ou Timer1) goto debut_programme END