
;Curso básico de microcontroladores PIC. -- micropic@lleida.org
;prac_04.asm - Incremento/Decremento de PORTB según RA0 esté a 1 o a 0

	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_0	equ	0x0C	;primer registro para el bucle de retardo 
CONTA_1	equ	0x0D	;segundo registro para el bucle de retardo

	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		;PORTB todo salidas
	bcf	STATUS,RP0	;vuelve a banco 0 del área de datos
	clrf	PORTB		;empieza apagando todos los Led

;Programa principal

MIRAR	btfsc	PORTA,0		;comprueba si RA0 está a 0 (interrruptor en RA0)
		goto	INC	;si esta a 1 no brinca, hay que incrementar, goto etiqueta INC
		decf	PORTB,F	;si esta a 0 ha brincado y hay que decrementar PORTB
		call	RETARDO	;espera un tiempo
		goto	MIRAR	;vuelve a mirar interruptor
		
INC		incf	PORTB,F	;incrementa PORTB
		call	RETARDO	;espera un tiempo
		goto	MIRAR	;vuelve a mirar interruptor

;subrutina "RETARDO" mediante dos bucles anidados se consigue un tiempo de unos 196ms 

RETARDO	decfsz	CONTA_0,F	;decrementa conta_0, guarda en conta_0 (F) y salta si es 0
	goto	RETARDO		;si conta_0 no es 0, goto a etiqueta retardo
	decfsz	CONTA_1,F	;decrementa conta_1, guarda en conta_1 (F) y salta si es 0
	goto	RETARDO		;si conta_1 no es cero, repite el primer bucle
	return			;regresa desde donde se llamó

	end			;a partir de aquí no hay más código de programa

