;Curso básico de microcontroladores PIC. --- micropic@lleida.org
;prac_10.asm - Simula una alarma básica. Por RA0 a RA3 se entra el código 1010 para la desconexión ;de la alarma, en RA4 está el sensor puerta y en RB0 la salida para la 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	movf	PORTA,W		;pasa PORTA a W
	andlw	b'00001111'	;pone a 0 los cuatro bits de más peso de PORTA
	sublw	b'00001010'	;resta 10 (código) a W
	btfss	STATUS,Z	;son iguales ?, código correcto ?
	goto	EMPIEZA		;no, alarma desactivada
	call	DELAY_10S	;si, alarma activada, espera 10sg (tiempo salida)
ESPERA	btfss	PORTA,4		;está activado sensor alarma puerta ?
	goto	ESPERA		;no continúa comprobando sensor
	call	DELAY_10S	;si, espera 10seg (tiempo entrada)
	bsf	PORTB,0		;activa sirena

ALARMA	movf	PORTA,W		;comprueba si hay código desactivación
	andlw	b'00001111'	;máscara de los 4 bits de más peso
	sublw	b'00001010'					
	btfsc	STATUS,Z	;se desconecta alarma ?
	goto	ALARMA		;no, sigue sirena activada, esperando desconectar código
	bcf	PORTB,0		;si, desconecta sirena
	goto	EMPIEZA		;vuelve al principio


;subrutina de retardo de unos 10s. aprox. Se multiplica el bucle de tiempo por 51 veces 

DELAY_10S
	movlw	.51
	movwf	CONTA_2  
	
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 anterior 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
