;Curso básico de microcontroladores PIC. --- micropic@lleida.org
;prac_08.asm - Comprueba si el valor de los interruptores de PORTA es menor que 8  "01000"
;si es menor parpadean los leds, si no, los leds estarán apagados

	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		;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

COMPARA	movf	PORTA,W		;pasa PORTA (interruptores) a W
	sublw	.8		;resta 8 a W
	btfsc	STATUS,C	;si bit C es 1, es que es menor
	goto	MENOR		;C = 1 no ha brincado, PORTA < 8 
	clrf	PORTB		;C = 0 ha brincado, no es mayor, apaga los leds 
	goto	COMPARA		;vuelve a comparar
		
MENOR	movlw	0xFF		;carga W todo a 1 (11111111)
	movwf	PORTB		;enciende todos los leds de PORTB
	call	RETARDO		;espera un tiempo
	clrf	PORTB		;apaga todos los leds de PORTB	
	call	RETARDO		;espera un tiempo 
	goto	COMPARA 	;vuelve a comparar

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		; 
	return			;regresa desde donde se llamó

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