; **** Encabezado ****
list p=16F84A
#include P16F84A.inc
__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;**** Definicion de variables ****
Contador	equ		0x0C	; Seleccionamos posición en la memoria RAM (GPR) para guardar
							; registro utilizado para demora.-
Contador1	equ		0x0D	; Registro utilizado en demora.-
Contador2	equ		0x0E
Pulsador	equ		7			; Definimos Pulsador como el bit 0, en este caso será para PORTA


Reset		org		0x00		; Aquí comienza el micro.-
		goto	Inicio		; Salto a inicio de mi programa.-

			
;**** Tabla de conversion BCD a 7 Segmentos ****
; Se coloca al inicio para asegurar ubicacion en Pagina.-
			org		0x05		; Origen del código de tabla.-
BCD7SEG:				; retlw b'gfedcba'  para display catodo comun
			addwf	PCL,1		; Se incrementa el contador del programa.-
			DT 0x00, 0x1, 0x2, 0x4, 0x8, 0x10	
			clrf	Contador	; Si llega 10, se resetea contador
			retlw	b'0000000'	; 0

;**** Programa principal ****
;**** Configuracion de puertos ****


Inicio		bsf		STATUS,RP0 	; Pasamos de Banco 0 a Banco 1.-
			movlw	b'10000000'	; RB7 como entrada y los demas como salida.-
			movwf	TRISB

			bcf		STATUS,RP0	; Paso del Banco 1 al Banco 0
            clrf	Contador
		    movlw b'0' 
			movwf PORTB
;**** Testeo de Pulsador ****
Testeo

			btfss	PORTB,Pulsador	; Testeamos si esta a 1 logico.-
			goto	Testeo			; No, seguimos testeando.-
			call	Demora_20ms		; Eliminamos Efecto rebote
			btfss	PORTB,Pulsador	; Testeamos nuevamente.-
			goto	Testeo			; Falsa Alarma, seguimos testeando.-
			incf	Contador,1		; Se ha pulsado, incrementamos contador.-
			movfw	Contador		; pasamos contador a W
			call	BCD7SEG			; Llamamos tabla.-
	    	movwf  	PORTB			; Cargamos valor recibido por Tabla en PORTB
            btfsc	PORTB,Pulsador	; Esperamos a que se suelte el pulsador -**-
			goto	$-1				; No, PCL - 1, --> btfss	PORTA,Pulsador.-
			call	Demora_20ms		; Eliminamos efecto rebote.-
			btfsc	PORTB,Pulsador	; Testeamos nuevamente.-
			goto	$-4				; No,Falsa alarma, volvemos a testear a que se suelte (**).-			
			goto	Testeo			; Si, Testeamos nuevamente.-
			
			

;**** Demora ****
Demora_20ms
		movlw	0xFF			; 
		movwf	Contador1		; Iniciamos contador1.-
Repeticion1
		movlw	0x19			; 
		movwf	Contador2		; Iniciamos contador2
Repeticion2
		decfsz	Contador2,1		; Decrementa Contador2 y si es 0 sale.-		
		goto	Repeticion2		; Si no es 0 repetimos ciclo.-
		decfsz	Contador1,1		; Decrementa Contador1.-
		goto	Repeticion1		; Si no es cero repetimos ciclo.-
		return				; Regresa de la subrutina.-

		end
