;Curso básico de microcontroladores PIC. --- micropic@lleida.org
;prac_11.asm - Contador binario UP/DOWN. RA0 = INC, RA1 = DEC. Visualiza en PORTB

	list	p=16F84		;indica al ensamblador el modelo de PIC
	include	"P16F84.inc"	;incluye librería de definiciones para el PIC16F84
	__config	_CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ;palabra de configuración

CONTA	equ	0x0C		;registro para el bucle de pausa 

	org	0x00		;primera posición de la memoria de programa
	goto	INICIO		;salto a la etiqueta inicio
	org	0x05		;para pasar por encima del vector de interrupción

INICIO	bsf	STATUS,RP0	;selecciona banco 1 del área de datos
	clrf	TRISB		;configura PORTB todo salidas
	movlw	b'00011111'
	movwf	TRISA		;configura PORTA todo entradas
	bcf	STATUS,RP0	;vuelve a banco 0 del área de datos
	clrf	PORTB		;empieza apagando todos los Led

;programa principal

BUCLE	btfss	PORTA,0		;cambia a 0 RA0 ?
	goto	INC		;no ha brincado, RA0 = 0, goto INC  
	btfss	PORTA,1		;cambia a 0 RA1 ?
	goto	DEC		;no ha brincado, RA0 = 0, goto DEC 
	goto	BUCLE		;no ha habido 0 en RA0 ni RA1, goto bucle

INC	call	PAUSA		;pequeña pausa antirrebotes
	btfss	PORTA,0		;vuelve a 1 RA0 ?
	goto	INC		;NO, espera a soltar pulsador, goto INC
	incf	PORTB,F	;SÍ, incrementa PORTB
	call	PAUSA		;pequeña pausa antirebotes	
	goto	BUCLE

DEC	call	PAUSA		;pausa antirrebotes
	btfss	PORTA,1		;vuelve a 1 RA1 ?
	goto	DEC		;NO, espera a soltar pulsador, goto DEC
	decf	PORTB,F	;si, decrementa PORTB
	call	PAUSA	
	goto	BUCLE

;subrutina pausa de unos 767 microsegundos

PAUSA	decfsz	CONTA,F	;decrementa conta, guarda en conta (F) y brinca si es cero
	goto	PAUSA		;no es cero, vuelve a la etiqueta pausa
	return			;es cero, ha brincado, vuelvde de donde se la llamó

	end
