; Micro-contrôleur : 16F876 ; 147 LIGNES DE LISTING ; ; MEMOIRE PROGRAMME UTILISEE 1% ; MEMOIRE RAM UTILISEE 1% ; W EQU H'000' F EQU H'001' RP1 EQU H'006' RP0 EQU H'005' Z EQU H'002' C EQU H'000' TMR0 EQU H'001' STATUS EQU H'003' PORTA EQU H'005' PORTB EQU H'006' OPTIONREG EQU H'081' TRISA EQU H'085' TRISB EQU H'086' ADCON1 EQU H'09F' VAR EQU H'070' CPT_L EQU H'071' CPT_H EQU H'072' PAS EQU H'073' MEMO EQU H'074' REBOND EQU H'075' ; Déclarations ; ------------- __CONFIG H'3D39' ; var représente les LEDs allumées ; cpt = compteur de tempo. ; pas = valeur de rechargement de cpt ; rebond = temporisation d'antirebond du poussoir ; Memo 0 action du poussoir effectuée ; Memo 1 position interrupteur ; Memo 2 position fiable du poussoir ; ; Initialisations ; ---------------- ORG H'0000' CLRF PORTA CLRF PORTB BCF STATUS,RP1 BSF STATUS,RP0 ; Passer port A en digital MOVLW H'06' MOVWF ADCON1 ; Bits 0 et 1 de Port A en entrée MOVLW H'03' MOVWF TRISA CLRF TRISB ; Diviseur de TMR0 à 64 MOVLW H'85' MOVWF OPTIONREG BCF STATUS,RP1 BCF STATUS,RP0 CLRF TMR0 CLRF REBOND MOVLW H'01' MOVWF VAR MOVLW H'05' MOVWF PAS CLRF CPT_H MOVF PAS,W MOVWF CPT_L BCF MEMO,2 BCF MEMO,0 ; Boucle principale ; ------------------ ; ; 156 donne un passage toutes les 0.01s BOUCLE MOVLW H'9C' SUBWF TMR0,W BTFSS STATUS,C GOTO $+.40 CLRF TMR0 MOVF CPT_L,F BTFSC STATUS,Z DECF CPT_H,F DECFSZ CPT_L,F GOTO $+.12 MOVF CPT_H,F BTFSS STATUS,Z GOTO $+.9 ; Si compteur nul on avance les LEDs RLF VAR,W RLF VAR,F ; Si mode '1' on force le dernier bit à 1 BTFSS MEMO,1 GOTO $+.2 INCF VAR,F CLRF CPT_H MOVF PAS,W MOVWF CPT_L ; Changement d'état du poussoir, système anti-rebonds BTFSS PORTA,0 GOTO $+.7 BTFSC MEMO,2 GOTO $+.3 INCF REBOND,F GOTO $+.2 CLRF REBOND GOTO $+.6 BTFSS MEMO,2 GOTO $+.3 INCF REBOND,F GOTO $+.2 CLRF REBOND ; 1/10ème de sec. pour valider le changement d'état du poussoir MOVLW H'0A' SUBWF REBOND,W BTFSS STATUS,C GOTO $+.6 BTFSS MEMO,2 GOTO $+.3 BCF MEMO,2 GOTO $+.2 BSF MEMO,2 ; ; Scrutation des boutons ; Test de l'interrupteur ; ---------------------- ; Passage du mode '0' au mode '1' BTFSS PORTA,1 GOTO $+.6 BTFSC MEMO,1 GOTO $+.4 BSF MEMO,1 MOVLW H'01' MOVWF VAR ; Passage du mode '1' au mode '0' BTFSC PORTA,1 GOTO $+.6 BTFSS MEMO,1 GOTO $+.4 BCF MEMO,1 MOVLW H'01' MOVWF VAR ; ; Test du poussoir ; ---------------- ; Si appui non mémorisé BTFSC MEMO,0 GOTO $+.13 ; Si bouton appuyé BTFSS MEMO,2 GOTO $+.10 ; action BSF MEMO,0 MOVLW H'05' ADDWF PAS,F MOVF PAS,W SUBLW H'32' BTFSC STATUS,C GOTO $+.3 MOVLW H'05' MOVWF PAS GOTO $+.4 ; Si bouton relaché BTFSC MEMO,2 GOTO $+.2 BCF MEMO,0 ; ; Activation des sorties ; ----------------------- MOVF VAR,W MOVWF PORTB GOTO BOUCLE END