;************************************ 3in5out ************************************
;
;	===================================================================
;	  Autor Guillermo Arévalo
;	  pic16f84a
; 	  Programa principal
;	===================================================================
;
; El sistema controla tres entradas, para accionar sobre cinco salidas.
;  
;
; ZONA DE DATOS **********************************************************************

	LIST		P=16F84A
	INCLUDE		<P16F84A.INC>
	__CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

	CBLOCK  0x0C	; En esta posición empieza la RAM de usuario.


	ENDC
	#DEFINE	ENTRADA	PORTA
	#DEFINE	SALIDA	PORTB
	ORG	0

	BSF	STATUS,RP0	;PASO AL BANCO 1
	MOVLW	B'00011111'	;CARGO 1 EN W
	MOVWF	ENTRADA		;DEFINO EN PUERTOA COMO ENTRADA
	CLRF	SALIDA		;DEFINO EL PUERTO B COMO SALIDA
	BCF	STATUS,RP0	;PASO AL BANCO 0

; ZONA DE PROGRAMA **********************************************************************
	
INICIO


	MOVLW	B'00000000'	;CARGO CERO EN W
	MOVWF	SALIDA		;SALIDA EN CERO SISTEMA EN REPOSO
	

TEST_IN

	BTFSC	ENTRADA,0	;SI RP0 ES CERO SALTO LA PROXIMA LINEA
	GOTO	MANUAL		;SI RP0 ES UNO ENTONCES SISTEMA PASA A MODO MANUAL
	BTFSC	ENTRADA,1	;SI RP1 ES CERO SALTO LA PROXIMA LINEA
	GOTO	ACCESO		;SI RP1 ES UNO ENTONCES PERMITE EL ACCESO
	BTFSC	ENTRADA,2	;SI RP2 ES CERO SALTO LA PROXIMA LINEA
	GOTO	ALARMA		;SI RP2 ES UNO SE DISPARA LA ALARMA
	GOTO	INICIO		;SI TODO ESTA NORMAL VA A INICIO
	
MANUAL

	MOVLW	B'00000110'	;CARGAMOS EN W '01100000'
	MOVWF	SALIDA		;ACTIVAMOS RB1(DESARMA SISTEMA DE ALARMA) Y RB2(QUITA ALIMENTACION CEM)			
	GOTO	TEST_IN		;vuelve a testear entradas

ACCESO
	MOVLW	B'00010110'	;cargamos en w '01101000'
	MOVWF	SALIDA		;activamos RB1, RB2 y RB4(motorizada)
	CALL	Retardo_500ms	;retardo de 500MS
	MOVLW	B'00000110'	;CARGO EN W
	MOVWF	SALIDA		;MANTENGO ACCESO QUITANDO PULSO EN RB4 (MOTORIZADA)
	CALL	Retardo_5s	;RETARDO 5S
	BTFSC	ENTRADA,2	;SI RP2 (SENSOR PUERTA) ES CERO (PUERTA CERRADA) SALTO LA PROXIMA LINEA
	GOTO	BUZZER		;SI LA PUERTA SIGUE ABIERTA VA A LA RUTINA BUZZER
	GOTO	TEST_IN		;CON LA PUERTA CERRADA VOY A TESTEAR LAS ENTRADAS NUEVAMENTE	

BUZZER
	MOVLW	B'00001110'	;CARGO EN W
	MOVWF	SALIDA		;MANTENGO ACCESO ALIMENTANDO BUZZER
	CALL	Retardo_500ms	;retardo de 500MS
	MOVLW	B'00000110'	;CARGO EN W
	MOVWF	SALIDA		;MANTENGO ACCESO QUITANDO ALIMENTACION EN RB3 (BUZZER) 
	CALL	Retardo_500ms	;retardo de 500MS
	BTFSC	ENTRADA,2	;SI RP2 (PUERTA ABIERTA) ES CERO SALTO LA PROXIMA LINEA
	GOTO	BUZZER		;SI RP2 ES UNO ENTONCES CONTINUA CICLO DE PUERTA ABIERTA CON BUZZER
	GOTO	INICIO		;SI TODO ESTA NORMAL VA A INICIO


ALARMA
	CALL	Retardo_100ms	;100ms DE DEMORA
	BTFSC	ENTRADA,1	;SI RP1 ES CERO SALTO LA PROXIMA LINEA
	GOTO	INICIO		;VA A INICIO
	BTFSS	ENTRADA,2	;SI RP1 ES CERO(ACCESO NEGADO) Y RP2 ES UNO (PUERTA ABIERTA) DISPARA ALARMA	
	GOTO	INICIO		;VUELVE A SENSAR ENTRADAS
	MOVLW	B'00001001'	;CARGAMOS 00001001 EN W

	MOVWF	SALIDA		;ACTIVAMOS RBO(ALARMA Z1) Y BUZZER CONTINUO
	GOTO	TEST_IN


	INCLUDE<Retardos.inc>


	END