;Szitkovits Gábor, vasútmodell fénysorompó
;és jelző vezérlés.
;4 gomb: 1 gomb alap-fehér villogó piros jelző
;		 2 gomb bejárat zöld kijárat piros fénysorompó piros
;		 3 gomb kijárat zöld bejárat piros fénysorompó piros
;		 4 gomb tolatás jelzők piros fénysorompó piros
 LIST P=16F84A
 #INCLUDE "P16F84A.INC"
 __CONFIG _XT_OSC&_CP_OFF&_WDT_OFF

	CBLOCK	0X0C			;Konstansok megadása
	GOMB					;Gombok
	T1						;Villogó időzítés
	T2
	T3
	P1						;Prell időzítés
	P2
	SZAM					;Számláló
	GO						;Gombok figyelése
	ENDC				

	ORG	0				;Progi kezdés
 	GOTO	START		;Startnál

	ORG	4				;Megszakítás

START		
	BSF	STATUS,RP0			;BANK1
	MOVLW	B'00000000'		;PORTA kimenet
	MOVWF	TRISA
	MOVLW	B'11110000'		;PORTB ki és bemenet
	MOVWF	TRISB
	BCF	STATUS,RP0			;BANK0
	CLRF	GO
	CLRF	GOMB			;Töröljük a GOMB -ot
	CLRF	PORTB
	CLRF	PORTA
	CLRF	SZAM
	MOVLW	d'4'			;SZAM-ba 4-et írunk
	MOVWF	SZAM
GOMBOK
	MOVLW	d'2'		;A GO-ba 2-őt írunk kb. 2s-t ránézünk a gombokra
	MOVWF	GO
	BTFSS	PORTB,5		;Megnézzük a gombot 
	CALL	G1
	BTFSS	PORTB,6
	CALL	G2			;Gomb 2=Kijárati jelző szubrutin
	BTFSS	PORTB,7
	CALL	G3
	BTFSS	PORTB,4
	CALL	G4
VISSZA					;Melyik gomb lett lenyomva?
	DECFSZ	GO			;Visszaszámolunk, 
	GOTO	TO			;ha nem null akkor TO
	GOTO	GOMBOK		;Ránézünk a gombokra
TO	BTFSC	GOMB,0		;Ha Gomb 1 a 0-biten
	GOTO	ALAP		;akkor ALAP. STB
	BTFSC	GOMB,1
	GOTO	BEJAR
	BTFSC	GOMB,2
	GOTO	KIJAR
	BTFSC	GOMB,3
	GOTO	TOLAT
	GOTO	VISSZA
ALAP
	BTFSC	PORTB,0		;Megnézzük a jelző állapotát
	GOTO	JA
	BTFSC	PORTB,3		;itt is jelzőállapot
	GOTO	JA
	BTFSC	PORTB,1		;Ha a PORTB 1 es bitje 1
	GOTO	FV			;akkor fehér villogó, ha 0 akkor
JA	CALL	PRE
	CLRF	PORTB
	MOVLW	B'00000110'		;PORTB 1,2-es bitje 1-be azaz
	XORWF	PORTB			;Bejárat és kijáratijelzö piros
	
FV							;Fénysorompó fehér villogó
	MOVLW	B'00000001'		;Led bekapcs
	MOVWF	PORTA			;PORTA 0-án
	CALL	DELAY			;Villogó időzítés
	MOVLW	B'00000000'
	MOVWF	PORTA
	CALL	DELAY
	GOTO	VISSZA			;Vissza az elejére
BEJAR						;Bejárat kezelés
	BTFSS	PORTB,3			;Jelző állapot állapot
	GOTO	VIB				;Ha nem villágít akkor bekapcs
	BTFSC	PORTB,3			;Bejárati jelző zöld figyelése
	GOTO	PV				;Ha megy a zöld akkor fénysorompó piros
VIB
	DECFSZ	SZAM			;várunk 4mp-et és jelzö bekapcs
	GOTO	PV
	MOVLW	d'4'			;újra feltöltjük a számlálót
	MOVWF	SZAM
	CLRF	PORTB
	CALL	PRE				;Várunk egy kicsit
	MOVLW	B'00001010'		;Jelző átkapcs
	XORWF	PORTB			;Bejárati zöld PORTB 4
PV							;Fénysorompó piros
	MOVLW	b'00000010'		;nincs mit magyarázni
	MOVWF	PORTA			;PORTA 1 és 2-es villogtatás
	CALL	DELAY
	MOVLW	B'00000100'
	MOVWF	PORTA
	CALL	DELAY
	GOTO	VISSZA
KIJAR
	BTFSS	PORTB,0			;Jelző figyelés
	GOTO	VIK				;ha nem megy bekapcs
	BTFSC	PORTB,0			;Kijárati zöld figyelés
	GOTO	PV				;ha megy akkor fénysorompó villogás
VIK
	DECFSZ	SZAM			;Késleltetés
	GOTO	PV
	MOVLW	d'4'			;SZAM-ba írunk
	MOVWF	SZAM
	CLRF	PORTB			;PORTB töröl
	CALL	PRE
	MOVLW	b'00000101'		;Kijárat zöld bejárat piros
	XORWF	PORTB			;váltás
	GOTO	VISSZA
TOLAT
	BTFSC	PORTB,0			;Ugyan az mint alap, csak piros
	GOTO	TA				;a fénysorompó
	BTFSC	PORTB,3
	GOTO	TA
	BTFSC	PORTB,1
	GOTO	PV
TA	CALL	PRE
	CLRF	PORTB
	MOVLW	b'00000110'		;Minden jelző piros
	XORWF	PORTB
	GOTO	VISSZA
G1
	MOVLW	b'00000001'		;gombok prell mentesítése
	MOVWF	GOMB
	CALL	PRE
	BTFSC	PORTB,5
	RETURN
	GOTO	G1
G2
	MOVLW	b'00000010'
	MOVWF	GOMB
	CALL	PRE
	BTFSC	PORTB,6
	RETURN
	GOTO	G2
G3	
	MOVLW	b'00000100'
	MOVWF	GOMB
	CALL	PRE
	BTFSC	PORTB,7
	RETURN
	GOTO	G3
G4
	MOVLW	b'00001000'
	MOVWF	GOMB
	CALL	PRE
	BTFSC	PORTB,4
	RETURN
	GOTO	G4
PRE							;Prell mentesítés időzítés
	MOVLW	D'210'
	MOVWF	P1
PR
	MOVLW	D'10'
	MOVWF	P2
PR1
	NOP
	DECFSZ	P2,F
	GOTO	PR1
	DECFSZ	P1,F
	GOTO	PR
	RETURN

DELAY						;Villogó időzítő
	MOVLW	d'255'
	MOVWF	T1
DEL
	MOVLW	d'80'
	MOVWF	T2
DEL1
	MOVLW	d'5'
	MOVWF	T3
DEL2
	NOP
	NOP
	DECFSZ	T3,F
	GOTO	DEL2
	DECFSZ	T2,F
	GOTO	DEL1
	DECFSZ	T1,F
	GOTO	DEL
	RETURN
 	END				;Progi vége
