   processor 16F84A
    #include <P16F84A.INC>
TMR0		equ	  1
pc          equ     2
STATUS      equ     3
fsr         equ     4

PORTA       equ     5
PORTB       equ     6

TRISA		equ	85h
TRISB		equ	86h


INTCON		equ	0Bh
OPTIONS		equ	81h


;==================================
c              	equ     0h
z              	equ     2h

w              	equ     0h
r              	equ     1h

RP0		equ	5H

rbpu		equ	7
intedg		equ	6

intf		equ	1

inte		equ	4
gie		equ	7

t0if		equ	2
t0ie		equ	5

psa		equ	3
t0cs		equ	5


;**************************************
led1		equ	0
TRIAC		equ	1
 
s1		equ	3
s2		equ	4


Porta_1		equ	0
Porta_2		equ	1
Janela_1	equ	2
Janela_2	equ	3
Janela_3	equ	4
Chave		equ	5
LED_AlarHabi	equ	6
LED_Alarme	equ	7


LED_Porta_1	equ	0
LED_Porta_2	equ	1
LED_Janela_1	equ	2
LED_Janela_2	equ	3
LED_Janela_3	equ	4


F_Alarme	equ	0
F_Alar_Prt1	equ	1
F_Alar_Prt2	equ	2
F_Alar_Habili	equ	3
F_SwAcDeAlar	equ	4
F_SwitchPiscar	equ	5
F_Chv		equ	7


;Bool
B_TestEnt	equ	0


;===================================   RAM     
r15            	equ     15h
r14            	equ     16h
milissegundo	equ	17h
Tempo		equ	18h


W_TEMP		equ	19h
STATUS_TEMP	equ	1ah

Flag		equ	1bh
Bool		equ	1ch

NumeroPiscadas	equ	1eh
 
r1		equ	20h
r2		equ	21h


;==========  PROGRAMA  =======

		
;=============================
      org     00H
;============================= 
	goto	início	;Pula para início do programa principal.


;============================= 
	org	04H		
;============================= 


;----------------------------- 
interrup			;Endereço de Interrupções gerais.
;-----------------------------
		
PUSH 					
	MOVWF 	W_TEMP 		; Copia W no registro W_TEMP.
	SWAPF 	STATUS, W 		; Swap STATUS para ser salvo em W.
	MOVWF 	STATUS_TEMP 	; Salva STATUS para o registro STATUS_TEMP

int_timer0	
	movlw	00h				;Recarrega o timer 0.
	movwf	TMR0

	
	btfss	INTCON,t0if			;Rotina de interrupção do timer0.
	goto	sai_interrup
 
	decfsz	milissegundo,r	;Registro da RAM usado como
	goto	sai_interrup		;contador de interrupções.
	movlw	15
	movwf	milissegundo

	btfss	Flag,F_Alarme		;Testa se o alarma foi ativado.
	goto	sai_interrup
		
	decfsz	Tempo,r		;Decrementa o registro "tempo".
	goto	sai_interrup
		
	bcf	PORTB,LED_Alarme		;Ativa a saída do alarme.


;================================
sai_interrup

 	bcf	INTCON,t0if	;Limpa o aviso de interrupções do timer 0.
POP 
	SWAPF STATUS_TEMP, W 	;Intercambia nibbles no	STATUS_TEMP.
					;e coloca o resultado em W.
	MOVWF STATUS 		;Move W dentro do registro STATUS.
				
	SWAPF 	W_TEMP, F 	;Intercambia nibbles em W_TEMP e deixa o 						;resultado em W_TEMP.
	SWAPF 	W_TEMP, W 	;Intercambia nibbles em W_TEMP e deixa o 
					;resultado em W.

	retfie			;Retorno de interrupções.


;***********************************
;===================================
início	
;====================================

	bsf	STATUS,RP0	;Seleciona o banco 1 da memória RAM.

	movlw	03fh		;Configura a porta B como entrada.
	movwf	TRISB		;exceto os pinos B0 e B1.

	movlw	00h		;Configura a porta A como saída.
	movwf	TRISA

	bcf	OPTIONS,rbpu ;Seleciona pull-up na porta B.

	bcf	OPTIONS,psa	 ;Seleciona o pré-escalar para o timer 0.
	bcf	OPTIONS,t0cs ;Seleciona o timer 0 com o clock de 					 ;instruções.

	bcf	STATUS,RP0	;Seleciona o banco 0 da memória RAM.


;=======================================
 
	movlw	00h		;Recarrega o timer 0.
	movwf	TMR0

	bsf	INTCON,t0ie	;Habilita o timer 0.
 
 	bsf	INTCON,gie	;Habilita o bit global de interrupções.	

	movlw	0ffH		;Apaga os LEDs indicadores.
	movwf	PORTA

	movlw	15		;Registro usado para contar interrupções
	movwf	milissegundo	;no timer 0
 
	bsf	Flag,F_Chv	;Inicializa bit de aviso para o 
	bcf	Flag,F_SwAcDeAlar	;programa principal.

	bsf	PORTB,LED_AlarHabi
	bcf	Bool,B_TestEnt


;***************************************
;=======================================


Test__Prt_1

	btfss	Flag,F_Alar_Habili	;Testa se o alarme 
	goto    Test_Chave		;está habilitado.

;***************************************
	btfss	PORTB,Porta_1	;Testa a porta 1.
	goto	Test_Prt_2

	btfss	Flag,F_Alar_Prt1	;O sensor da porta 1 
	goto	Test_Prt_2		;foi detectado.

	bcf	Flag,F_Alar_Prt1

	bcf	PORTA,LED_Porta_1	;Acende o LED indicador.
	
	bsf	Flag,F_Alarme	;Ativa a temporização para
	movlw	12			;desarmar o alarme.
	movwf	Tempo


;=================================
Test_Prt_2

	btfss	PORTB,Porta_2	;Testa a porta 2.
	goto	Test_Jnl_1
 
	btfss	Flag,F_Alar_Prt2	;O sensor da porta 2 
	goto	Test_Jnl_1		;foi detectado.

	bcf	Flag,F_Alar_Prt2

	bcf	PORTA,LED_Porta_2	;Acende o respectivo LED.
	
	bsf	Flag,F_Alarme	;Ativa a temporização para 
	movlw	12			;desarmar o alarme.
	movwf	Tempo


;===================================		
Test_Jnl_1

	btfss	PORTB,Janela_1	;Testa a janela 1.    
	goto	Test_Jnl_2

	bcf	PORTA,LED_Janela_1 ;Acende o respectivo LED do sensor.
	bcf	PORTB,LED_Alarme   ;Ativa a saída do alarme.

 	
;=================================
Test_Jnl_2

	btfss	PORTB,Janela_2	;Testa a janela 2.
	goto	Test_Jnl_3

	bcf	PORTA,LED_Janela_2 ;Acende o respectivo LED do sensor.
	bcf	PORTB,LED_Alarme	 ;Ativa a saída do alarme.


;===================================		
Test_Jnl_3

	btfss	PORTB,Janela_3	;Testa a janela 3.
	goto	Test_Chave

	bcf	PORTA,LED_Janela_3 ;Acende o respectivo LED do sensor.
	bcf	PORTB,LED_Alarme	 ;Ativa a saída do alarme.


;===============================  
Test_Chave
;=============================== 
	btfsc	PORTB,Chave		;Testa o pulsador chave.
	goto	Test_Ds_1

	btfss	Flag,F_Chv		;Evita o ruído no pulsador.
	goto	Test__Entrada

 	bcf	Flag,F_Chv
	movlw	100
	movwf	r2
	;^^^^^^^^^^^^^^^^^^^^^


	btfss	Flag,F_SwAcDeAlar	;Interruptor por programa para
	goto	ativar_Alarme	;ativar ou desativar o alarme.
	;---------------------	
	bcf	Flag,F_SwAcDeAlar

	bcf	Flag,F_Alar_Habili ;Desativa o alarme.
	bcf	Bool,B_TestEnt

 	bcf	Flag,F_Alarme

	bsf	PORTB,LED_Alarme	;Desativa a saída do alarme.
	bsf	PORTB,LED_AlarHabi
	
	goto	dec_r1
	;>>>>>>>>>>>>>>>>>>>>>>>


ativar_Alarme
	;-----------------------
	bsf	Flag,F_SwAcDeAlar 

	bsf	Flag,F_Alar_Prt1   ;Ativa o alarme.
	bsf	Flag,F_Alar_Prt2

	bcf	PORTB,LED_AlarHabi

	bsf	Bool,B_TestEnt	;Habilita o temporizador por programa
	movlw	60			;para fazer piscar os LEDs.
	movwf	NumeroPiscadas


	;------------------------
dec_r1				;Retardo para evitar 
	decfsz	r1,r		;ruído no pulsador.
	goto	dec_r1
	decfsz	r2,r
	goto	dec_r1	

Test_Chv_1

	btfss	PORTB,Chave	;Testa-se o pulsador chave
	goto	Test_Chv_1		;foi liberado.

	movlw	50
	movwf	r2


dec_r10a				;Retarda para evitar o ruído
	decfsz	r1,r		;do pulsador chave usando for
	goto	dec_r10a		;liberado.
	decfsz	r2,r
	goto	dec_r10a	

	movlw	50
	movwf	r2
	goto	Test__Entrada

Test_Ds_1

	bsf	Flag,F_Chv		

;=====================================
Test__Entrada

	btfss	Bool,B_TestEnt	;Habilita a temporização 
	goto	Sai__Test_E		;por programa.
	
	decfsz	r1,r		;Registro da memória RAM
	goto	Sai__Test_E		;usado para temporizar.
	decfsz	r2,r
	goto	Sai__Test_E
	movlw	50
	movwf	r2

	btfss	Flag,F_SwitchPiscar ;Este bloco de programa faz
	goto	Desligar_Leds	  ;piscar os LEDs dos sensores.

	
;=================================
	bcf	Flag,F_SwitchPiscar
;=================================
	comf	PORTB,w		;Lê a porta B e a complementa	
	movwf	PORTA	;antes de passar para a porta A.
	goto	Sai_Pscr

 
;=================================
Desligar_Leds	
	bsf	Flag,F_SwitchPiscar
;==================================	
	movlw	0ffH	;Apaga os LEDs conectados a porta A.
	movwf	PORTA
	;---------------
Sai_Pscr

	decfsz	NumeroPiscadas,r  ;Conta o número de piscadas.
	goto	Sai__Test_E

	bcf	Bool,B_TestEnt
	
	bsf	Flag,F_Alar_Habili   ;Habilita o alarme.

Sai__Test_E

 	goto	Test__Prt_1		;Pula para voltar a testar.


;====================================
;====================================
              	END
