;
;					EJEMPLO 2.13
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para simulación y/o MicroPIC Trainer
;
;Contador UP/DOWN binario
;
;Sobre los 8 leds de salida conectados a la puerta B se visualizará, en binario, el número
;de pulsos aplicados por la entrada RA0. RA1 determina si la cuenta es ascendente (a "1")
;o descendente

	
		List	p=16F84		;Tipo de procesador
		include	"P16F84.INC"	;Definiciones de registros internos
                    
		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x05		;Salva el vector de interrupción

;*********************************************************************************
;Delay_20_ms: Esta rutina de temporización tiene por objeto eleiminar el "efecto
;rebote" de los periféricos electromecánicos. Realiza un delay de 20 mS. Si el PIC
;trabaja a una frecuencia de 4MHz, el TMR0 evoluciona cada uS. Si queremos tempori-
;zar 20000 uS (20 mS) con un preescaler de 128, el TMR0 deberá contar 156 eventos
;(156 * 128). El valor 156 equivale a 9c hex. y como el TMR0 es ascedente habrá que
;cargar su complemento a 1 (63 hex.).

Delay_20_ms:	bcf	INTCON,T0IF	;Desconecta el flag de rebosamiento
		movlw	0x63		;Complemento hex. de 156
		movwf	TMR0		;carga el TMR0
Delay_20_ms_1	clrwdt			;Refrescar el WDT
		btfss	INTCON,T0IF	;Rebasamiento del TMR0 ??
		goto	Delay_20_ms_1	;Todavía no
		bcf	INTCON,T0IF	;Ahora si, reponer el flag
		return

Inicio	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		clrf	TRISB		;Puerta B se configura como salida
		movlw	b'00011111'		
		movwf	TRISA		;Puerta A se configura como entrada		
		movlw	b'00000110'
		movwf	OPTION_REG	;Preescaler de 128 para el TMR0
		bcf	STATUS,RP0	;Selecciona banco 0			                                                                         

Loop		clrwdt			;Refrescar el WDT
		btfss	PORTA,0		;Subida de la señal RA0 ?
		goto	Loop		;No
		call	Delay_20_ms	;Elimina rebotes

Loop_2		clrwdt			;Refrescar el WDT
		btfsc	PORTA,0		;Bajada de RA0 (pulso) ??
		goto	Loop_2		;No
		call	Delay_20_ms	;Ha habido pulso, eliminar rebotes

		btfss	PORTA,1		;RA1 = 1
		goto	Down		;No, cuenta descendente

Up		incf	PORTB,F		;Cuenta ascendente
		goto	Loop

Down		decf	PORTB,F		;Cuenta descendente
		goto	Loop

		end			;Fin del programa fuente

