;
;					EJEMPLO 2.14
;
;				Autor: Mikel Etxebarria
;			(c) Microsystems Engineering (Bilbao)
;
;Ejemplo para simulación y/o MicroPIC Trainer
;
;Contador UP/DOWN decimal de un dígito
;
;Sobre el display 7 segmentos conectado a la puerta B se visualizará 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
                    
Contador	equ	0x0c		;Variable del contador
		
		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x05		;Salva el vector de interrupción

;**********************************************************************************
;Tabla: Esta rutina convierte el código BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmentos. El código 7 segmentos retorna también
;en el reg. W

Tabla:		addwf	PCL,F			;Desplazamiento sobre la tabla
		retlw	b'00111111'		;Dígito 0
		retlw	b'00000110'		;Dígito 1
		retlw	b'01011011'		;Dígito 2
		retlw	b'01001111'		;Dígito 3
		retlw	b'01100110'		;Dígito 4
		retlw	b'01101101'		;Dígito 5
		retlw	b'01111101'		;Dígito 6
		retlw	b'00000111'		;Dígito 7
		retlw	b'01111111'		;Dígito 8
		retlw	b'01100111'		;Dígito 9

;*********************************************************************************
;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			                                                                         
		clrf	Contador	;Puesta a 0 del contador
				
Loop		movf	Contador,W
		call	Tabla		;Convierte BCD a 7 segmentos
		movwf	PORTB		;Visualiza el valor del contador
Wait_0		clrwdt			;Refrescar el WDT
		btfss	PORTA,0		;Subida de la señal RA0 ?
		goto	Wait_0		;No
		call	Delay_20_ms	;Elimina rebotes

Wait_1		clrwdt			;Refrescar el WDT
		btfsc	PORTA,0		;Bajada de RA0 (pulso) ??
		goto	Wait_1		;No
		call	Delay_20_ms	;Ha habido pulso, eliminar rebotes

		btfss	PORTA,1		;RA1 = 1
		goto	Down		;No, cuenta descendente

Up		incf	Contador,F	;Incrementa contador
		movlw	.10
		subwf	Contador,W
		btfss	STATUS,Z	;Es  mayor de 9 ??
		goto	Loop		;No
		clrf	Contador	;Si, puesta a 0 del contador
		goto	Loop

Down		decf	Contador,F	;Decrementa el contador
		movlw	0xff
		subwf	Contador,W
		btfss	STATUS,Z	;Es menor de 0 ??
		goto	Loop		;No
		movlw	0x09
		movwf	Contador	;Si, puesta a 9 del contador
		goto	Loop

		end			;Fin del programa fuente

