;Curso básico de microcontroladores PIC.  --- micropic@lleida.org
;prac_09.asm - Simula una alarma básica. RA0 llave conexión/desconexión alarma, RA1 sensor puerta, ;RB0 salida sirena

	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
CONTA_2	equ	0x0E		;tercer 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

EMPIEZA btfsc	PORTA,0		;llave alarma activada ?
	goto	EMPIEZA		;no, vuelve a empieza
	call	DELAY_10S	;si, espera 10 segundos para salir
ESPERA	btfss	PORTA,1		;sensor puerta activado ?
	goto	ESPERA		;no, sigue esperando
	call	DELAY_10S	;si, espera 10 segundos para entrar
	bsf	PORTB,0		;activa salida sirena
ALARMA	btfss	PORTA,0		;llave desactiva alarma ?
	goto	ALARMA		;no, se mantiene sirena activada
	bcf	PORTB,0		;si, se desactiva sirena
	goto	EMPIEZA		;vuelve al principio


;subrutina de retardo de unos 10s. aprox. Se multiplica el bucle de tiempo de 196ms por 51 veces ;obteniéndose 9.996ms 

DELAY_10S
	movlw	.51
	movwf	CONTA_2		;carga conta_2 con 51 (decimal)  
		
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 
	decfsz	CONTA_2,F	;decrementa conta_2, guarda en conta_2 (F) y salta si es 0 
	goto	RETARDO		;si conta_2 no es cero, repite los dos bucles anteriores
	return			;regresa desde donde se llamó

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