;DIRECTIVAS

	LIST		p=16F887		;Tipo de microcontrolador
	INCLUDE 	P16F887.INC		;Define los SFRs y bits del 
								;P16F887

	__CONFIG _CONFIG1, _CP_OFF&_WDT_OFF&_INTOSCIO&_FCMEN_OFF 	
						;Setea parámetros de configuración

	errorlevel	 -302	;Deshabilita mensajes de 
						;advertencia por cambio 
						;bancos
;*********************************************************************
CONTEO   	EQU	0X21


;PROGRAMA
	ORG	0x00		;Vector de RESET
	GOTO	MAIN
	ORG	0x04		;Vector de interrupción
	GOTO	Interrupcion	;Va a rutina de interrupción

MAIN
;SETEO DE PUERTOS 
	BSF			STATUS,5
	BSF			STATUS,6	;Selecciona el Banco 3
	CLRF		ANSELH		; Digitaliza puertos ANS.
	CLRF        ANSEL
	BCF			STATUS,6	;Selecciona el Banco 1
	BSF 		OSCCON,6        
	BSF 		OSCCON,5         
	BCF 		OSCCON,4 ; Selecciona el reloj de 8MHz
	BSF			OSCCON,0 ; Selecciona el oscilador de rejor interno.
	MOVLW		0XFF
	MOVWF		TRISA	;Setea PORTA como entrada.
	MOVLW		0XFF
	MOVWF		TRISB	;Setea PORTB como entrada.
	CLRF		TRISC	;Setea PORTC como salida.
	MOVLW		B'10010000'
	MOVWF		INTCON ; GIE, INTE Habilita interrupcion por RB0.

;INICIALIZACION
	BCF			STATUS,5	;Selecciona el Banco 0.		
	CLRF		PORTA	;Encera PORTA
	CLRF        PORTB	;Encera PORTB
	CLRF        PORTC	;Encera PORTCINTCON
	CLRF        PORTE	;Encera PORTD
	CLRF		CONTEO	;Encera CONTEO
	MOVFW		CONTEO ; Encera el registro W.
	CALL		TABLA
	MOVWF		PORTC

INICIO
	NOP
	GOTO		INICIO	; Lazo infinito

Interrupcion
	BCF         INTCON,INTF   ; Borra la bandera de interrupcion TMR0IF
	CLRF		PORTB	; Encera el PORTB.
	BTFSC		PORTA,0	; Pregunta si en RA0 esta con cero.
	GOTO		INCREMENTO ; RA0=1 INCREMENTO
	GOTO		DECREMENTO ; RA0=0 DECREMENTO

INCREMENTO
	INCF		CONTEO ; Incrementa CONTEO
	MOVFW		CONTEO ; A W le asiga CONTEO 
	CALL		TABLA 
	MOVWF		PORTC ; PORTC se le asigna el codigo de 7 segmentos.
	MOVFW		CONTEO ; a W se le asigna CONTEO
	SUBLW		0X0A ; W=10-CONTEO
	BTFSS		STATUS,Z ; Si CONTEO=10 salta.
	GOTO		SALIDA
	MOVLW		0X00 
	MOVWF		CONTEO ; CONTEO=0
	MOVFW		CONTEO ; W=CONTEO
	CALL		TABLA 
	MOVWF		PORTC ; PORTC se carga con el codigo de 7 segmentos de CONTEO.
	GOTO		SALIDA

DECREMENTO
	DECF		CONTEO ; Decrementa CONTEO en una unidad.
	MOVFW		CONTEO ; W=CONTEO
	SUBLW		0XFF	; W=255-CONTEO
	BTFSC		STATUS,Z ; Verifica si desborde mediante Z=1.
	GOTO		DESBORDE 
	MOVFW		CONTEO ; W=CONTEO
	CALL		TABLA  
	MOVWF		PORTC ; PORTC le asigna el codigo de 7 segmentos.
	GOTO		SALIDA

DESBORDE
	MOVLW		0X09 
	MOVWF		CONTEO ; CONTEO=9
	MOVFW		CONTEO
	CALL		TABLA
	MOVWF		PORTC ; PORTC se carga con el codigo de 7 segmentos de 9.
	
SALIDA
	BSF         INTCON,GIE      ; Se habilita la interrupcion global
    RETFIE     ; Regresamos al lazo infinito a espera
			   ; de otra interrupcion.                 

TABLA
    ADDWF   PCL,F       	; PCL + W -> W
					; El PCL se incrementa con el 
					; valor de W proporcionando un 
					; salto
    RETLW   0x3F     	; Retorna con el código del 0
	RETLW	0x06		; Retorna con el código del 1
	RETLW	0x5B		; Retorna con el código del 2
	RETLW	0x4F		; Retorna con el código del 3
	RETLW	0x66		; Retorna con el código del 4
	RETLW	0x6D		; Retorna con el código del 5
	RETLW	0x7D		; Retorna con el código del 6
	RETLW	0x07		; Retorna con el código del 7
	RETLW	0x7F		; Retorna con el código del 8
	RETLW	0x67		; Retorna con el código del 9
	RETLW	0X00
	END			; Fin del programa fuente