; Sensado de puertas
; Empieza a correr el programa en el modo de habitacin disponible


	#include	<p16f628a.inc>

	__config	3F18h

DelayA		equ		20h
DelayB		equ		21h
TrDelayA	equ		22h
TrDelayB	equ		23h
Byte		equ		24h
Bits		equ		25h

	#define		LedVerde		PORTA,0
	#define		LedRojo			PORTA,1
	#define		LedAmarillo		PORTA,2
	#define		SensorPuerta	PORTA,3
	#define		Switch			PORTA,4

	org		00h
	goto	Inicio
	org		05h

Delay
	movlw	.255
	movwf	DelayA

CicloA
	movlw	.255
	movwf	DelayB
CicloB
	decfsz	DelayB,F
	goto	CicloB
	decfsz	DelayA,F
	goto	CicloA
	return

Delay6ms
	movlw	.20
	movwf	DelayA

CicloA6ms
	movlw	.200
	movwf	DelayB
CicloB6ms
	decfsz	DelayB,F
	goto	CicloB6ms
	decfsz	DelayA,F
	goto	CicloA6ms
	return

TrDelay
	movlw	.5
	movwf	TrDelayA
	movlw	.10
	movwf	TrDelayB
	decfsz	TrDelayB,F
	goto	$-1
	decfsz	TrDelayA,F
	goto	$-5
	return

Delay8us
	nop
	nop
	nop
	nop
	return

Delay68us
	call	Delay8us
	call	Delay8us
	call	Delay8us
	call	Delay8us
	call	Delay8us
	call	Delay8us
	call	Delay8us
	call	Delay8us
	return

SendData
	bsf		STATUS,RP0
	movlw	b'10111111'
	andwf	TRISA,F
	bcf		STATUS,RP0
	bcf		PORTA,6
	call	TrDelay
	call	Delay8us
	call	Delay8us
	nop
	rrf		Byte,F
	bsf		STATUS,RP0
	btfss	STATUS,C
	goto	$+5
	nop
	movlw	b'01000000'
	iorwf	TRISA,F
	goto	$+4
	movlw	b'10111111'
	andwf	TRISA,F
	nop
	nop
	bcf		STATUS,RP0
	call	TrDelay
	call	TrDelay
	call	TrDelay
	call	Delay68us
	nop
	bsf		STATUS,RP0
	movlw	b'01000000'
	iorwf	TRISA,F
	bcf		STATUS,RP0
	call	TrDelay
	call	TrDelay
	call	Delay8us
	call	Delay8us
	call	Delay8us
	call	Delay8us
	call	Delay8us
	nop
	nop
	nop
	decfsz	Bits,F
	goto	SendData
	call	TrDelay
	movlw	.4
	movwf	Bits
	return

Inicio
	movlw	b'11000111'
	movwf	CMCON
	bsf		STATUS,RP0
	movlw	b'11111000'
	movwf	TRISA
	clrf	TRISB
	clrf	INTCON
	bcf		STATUS,RP0
	clrf	PORTA
	clrf	PORTB
	movlw	.4
	movwf	Bits
	movlw	b'00000001'
	movwf	Byte
	call	SendData


Ciclo
	bsf		LedVerde		; enciendo el led Verde
	btfsc	Switch			; testeo el switch pulsador
	goto	SeguirCiclo		; si no esta presionado, sigo normalmente
	call	Delay6ms		; retardo 6ms
	btfsc	Switch			; vuelvo a testear, como antirrebote
	goto	$-4				; si cambi, regreso porque fue un rebote
	bcf		LedVerde
	bsf		LedRojo
	btfss	Switch			; testeo nuevamente el switch
	goto	$-1				; si esta presionado, vuelvo a la lnea anterior
	call	Delay6ms		; retardo 6ms
	btfss	Switch			; vuelvo a testear el switch
	goto	$-4				; si sigue presionado, vuelvo
	goto	$+4			; si se solto, paso a 3 lneas adelante

SeguirCiclo
	btfss	SensorPuerta	; testeo el sensor de puerta
	goto	Ciclo			; si esta cerrado, vuelvo a Ciclo	
	bcf		LedVerde		; si se abre, apago el led Verde

Ciclo2
	bsf		LedRojo			; enciendo el led Rojo
	movlw	b'00001010'
	movwf	Byte
	call	SendData
	call	Delay			; retardo
	bcf		LedRojo			; apago el led rojo
	movlw	b'00001000'
	movwf	Byte
	call	SendData
	call	Delay			; retardo

Ciclo2b
	btfsc	Switch
	goto	SeguirCiclo2
	call	Delay6ms		; retardo 6ms
	btfsc	Switch			; vuelvo a testear, como antirrebote
	goto	$-4				; si cambi, regreso porque fue un rebote
	bcf		LedRojo
	bsf		LedAmarillo
	btfss	Switch			; testeo nuevamente el switch
	goto	$-1				; si esta presionado, vuelvo a la lnea anterior
	call	Delay6ms		; retardo 6ms
	btfss	Switch			; vuelvo a testear el switch
	goto	$-4				; si sigue presionado, vuelvo
	goto	Ciclo3
	
SeguirCiclo2
	btfsc	SensorPuerta	; testeo la puerta
	goto	Ciclo2			; si esta abierta vuelvo a ciclo2

	movlw	b'00000010'
	movwf	Byte
	bsf		LedRojo			; puerta cerrada, enciendo el led rojo	
	call	SendData
	btfss	SensorPuerta	; testeo puerta
	goto	Ciclo2b				; puerta cerrada, vuelvo a la lnea anterior
	bcf		LedRojo			; puerta abierta, apago led rojo

Ciclo3
	bsf		LedAmarillo		; enciendo led Amarillo
	movlw	b'00001100'
	movwf	Byte
	call	SendData
	call	Delay			; retardo
	bcf		LedAmarillo		; apago led Amarillo
	movlw	b'00001000'
	movwf	Byte
	call	SendData
	call	Delay			; retardo
	btfsc	Switch			; testeo el switch pulsador
	goto	Ciclo3			; no presionado, vuelvo a ciclo3
	call	Delay6ms		; retardo 6ms
	btfsc	Switch			; testeo el switch pulsador
	goto	Ciclo3

; Testeo 2 veces el pulsador (con un retardo de 6ms) para evitar la
; una lectura erronea debido a algn rebote del pulsador

	bsf		LedAmarillo		; presionado, dejo encendido led Amarillo
	movlw	b'000000100'
	movwf	Byte
	call	SendData
	btfss	Switch			; testeo el switch pulsador
	goto	$-1				; presionado, vuelvo a la lnea anterior
	call	Delay6ms
	btfss	Switch
	goto	$-4

; en las lineas anteriores, lo que hago es testear que se suelte
; el pulsador.

	btfsc	Switch
	goto	$-1
	call	Delay6ms
	btfsc	Switch
	goto	$-4
	bcf		LedAmarillo
	bsf		LedVerde
	btfss	Switch			; testeo el switch pulsador
	goto	$-1				; presionado, vuelvo a la lnea anterior
	call	Delay6ms
	btfss	Switch
	goto	$-4
	movlw	b'00000001'
	movwf	Byte
	call	SendData
	goto	Ciclo			; presionado, vuelvo a ciclo; Recomenzando todo
	end
