;
;					ESEMPIO 2.13
;
;				Autore: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Esempio per simulazione e/o MicroPIC Trainer
;
;Contatore UP/DOWN binario
;
;Sugli 8 leds di uscita connessi alla porta B verrà visualizzato, in binario, il numero
;di impulsi applicati dall'entrata RA0. RA1 determina se il conto è ascendente (a "1")
;o discendente

	
		List	p=16F84		;Tipo di processore
		include	"P16F84.INC"	;Definizioni di registri interni
                    
		org	0x00		;Vettore di Reset
		goto	Inizio

		org	0x05		;Salva il vettore di interrupt

;********************************************************************************
;Delay_20_ms: Questa procedura di temporizzazione ha per oggetto di eliminare l'"effetto
;rimbalzo" delle periferiche elettromeccaniche. Realizza un delay di 20 mS. Se il PIC
;lavora a una frequenza di 4MHz, il TMR0 cambia ogni uS. Se vogliamo tempori-
;zzare 20000 uS (20 mS) con un prescaler di 128, il TMR0 dovrà contare 156 eventi
;(156 * 128). Il valore 156 equivale a 9c hex. e poiché il TMR0 è ascedente bisognerà
;caricare il suo complemento a 1 (63 hex.).

Delay_20_ms:	bcf	INTCON,T0IF	;Disconnetti il flag di overflow
		movlw	0x63		;Complemento hex. di 156
		movwf	TMR0		;carica il TMR0
Delay_20_ms_1	clrwdt			;Aggiornare il WDT
		btfss	INTCON,T0IF	;Overflow del TMR0 ??
		goto	Delay_20_ms_1	;Ancora no
		bcf	INTCON,T0IF	;Adesso sì, rimettere il flag
		return

Inizio	        clrf 	PORTB		;Cancella i latch di uscita
		bsf	STATUS,RP0	;Seleziona banco 1
		clrf	TRISB		;Porta B si configura come uscita
		movlw	b'00011111'		
		movwf	TRISA		;Porta A si configura come entrata		
		movlw	b'00000110'
		movwf	OPTION_REG	;Prescaler di 128 per il TMR0
		bcf	STATUS,RP0	;Seleziona banco 0			                                                                         

Loop		clrwdt			;Aggiornare il WDT
		btfss	PORTA,0		;Aumento del segnale RA0 ?
		goto	Loop		;No
		call	Delay_20_ms	;Elimina rimbalzi

Loop_2		clrwdt			;Aggiornare il WDT
		btfsc	PORTA,0		;Diminuzione di RA0 (impulsi) ??
		goto	Loop_2		;No
		call	Delay_20_ms	;C'è stato impulso, eliminare rimbalzi

		btfss	PORTA,1		;RA1 = 1
		goto	Down		;No, conto discendente

Up		incf	PORTB,F		;Conto ascendente
		goto	Loop

Down		decf	PORTB,F		;Conto discendente
		goto	Loop

		end			;Fine del programma principale

