; 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
