;       EZ A PROGRAM A GYŐRI MIKROVEZÉRLŐ ALKALMAZÓI VERSENYEN
;		HASZNÁLT PRÓBAPANELHEZ KÉSZÜLT
;		EBBEN A PROGRAMBAN MULTIPLEXELVE KEZELJÜK LE A 
;		PRÓBAPANELEN TALÁLHATÓ 4 KIJELZŐT
;		A KIJELZŐRE KIÍRATNI KÍVÁNT ÉRTÉKET KIKÜLDJÜK A C-PORTRA ÉS
;		MINDIG BEKAPCSOLJUK A MEGFELELŐ KIJELZŐT (B-PORT)	


;		EZ A PROGRAM EGY KÖZLEKEDÉSI LÁMPÁT SZIMULÁL A PANELON LÉVŐ 3 LED ÉS 2 KIJELZŐ SEGÍTSÉGÉVEL
;		A PROGRAM ALAPBÓL EGY VILLOGÓ ÜZEMMÓDDAL INDUL, ITT EGY SÁRGA FÉNY VILLOG ÉS A KIJELZŐKÖN
;		SEMMI SEM JELENIK MEG. A NORMÁL ÜZEMMÓD A PB2 MEGNYOMÁSÁVAL INDUL (HOSSZAN KELL NYOMNI MAJD ELENGEDNI)
;		A NORMÁL ÜZEMMÓDBA FELVÁLTVA JELENNEK MEG A PIROS - PIROS,SÁRGA - ZÖLD - SÁRGA FÉNYEK
;		A KETTES KIJELZŐN A FÉNY VILÁGÍTÁSI IDEJE LÁTHATÓ MÍG A NÉGYES KIJELZŐN A MÉG HÁTRALÉVŐ IDŐ
;		NORMÁL ÜZEMMÓDBÓL VISSZA LEHET TÉRNI A VILLOGÓBA ÚGY, HOGY AKKOR NYOMJUK MEG(HOSSZAN) A PB2 GOMBOT
;		AMIKOR A CSAK  SÁRGA FÉNY VILÁGÍTÁSÁNAK VÉGE (ÉRDEMES A SÁRGA FÉNY VILÁGÍTÁSA ALATT VÉGIG NYOMNI ÉS ÍGY 
;		BIZTOS HOGY ÜZEMMÓDOT FOG VÁLTANI, A GOMBOT AKKOR KELL ELENGEDNI HA A KIJELZŐK ÉS A LED IS ELSÖTÉTÜLTEK) 
	

;-------------------------------------------------------------------------------------------


	LIST	P=16F877					;A HASZNÁLT PIC TÍPUS MEGADÁSA 
#INCLUDE	<P16F877.INC>					;SZIMBÓLUMHALMAZ MEGADÁSA
	__CONFIG _CP_OFF & _WDT_OFF & _LVP_OFF & _HS_OSC	;BEÁLLÍTÁSOK MEGADÁSA

#DEFINE	PIROS		PORTB,6		;INNENTŐL A PIROSSAL HIVATKOZUNK A PORTB,6-RA
#DEFINE	SARGA		PORTB,5
#DEFINE	ZOLD		PORTA,1

;-------------------------------------------------------------------------------------------

	CBLOCK	0X20			;FELHASZNÁLÓI REGISZTEREK MEGADÁSA
	DISP1
	DISP2
	DISP3
	DISP4
	PIR
	SAR
	ZOL
	TEMP
	VAR1
	VAR2
	VAR3
	W_TEMP
	STATUS_TEMP
	MELYDISP
	ENDC				;REGISZTERBLOKK VÉGE



	ORG	0			;KEZDŐCÍM
	GOTO	START
	ORG	4			;MEGSZAKÍTÁSI CÍM
	

PUSH					;MEGSZAKÍTÁS
	MOVWF	W_TEMP			;W REGISZTER ELTÁROLÁSA
	SWAPF	STATUS,W		
	MOVWF 	STATUS_TEMP		;STATUS REGISZTER ELTÁROLÁSA

	BTFSC	INTCON,T0IF		;TMR0 MEGSZAKÍTÁS ELLENŐRZÉSE
	GOTO	T0INT			;UGRÁS A TMR0 MEGSZAKÍTÁSRA

POP
	SWAPF	STATUS_TEMP,W	
	MOVWF 	STATUS			;AZ ELMENTETT STATUS REGISZTER VISSZAÁLLÍTÁSA
	SWAPF	W_TEMP,F
	SWAPF	W_TEMP,W		;AZ ELMENTETT W REGISZTER VISSZAÁLLÍTÁSA
	BSF	INTCON,GIE		;ÁLTALÁNOS MEGSZAKÍTÁS ENGEDÉLYEZÉSE
	RETFIE				;VISSZATÉRÉS A MEGSZAKÍTÁSBÓL

;--------------------------------------------------------------------------

START				
	MOVLW	0X20			;REGISZTEREK TÖRLÉSE
	MOVWF	FSR
TOROL
	CLRF	INDF
	INCF	FSR,F
	BTFSS	FSR,7
	GOTO	TOROL

;--------------------------------------------------------------------------

	BANKSEL	TRISA		;ABBA A BANKBA LÉPÉS, AHOL A TRISA REGISZTER VAN (BANK1)
	MOVLW	B'11111100'	
	MOVWF 	TRISA		;A-PORT IRÁNYAINAK MEGADÁSA
	MOVLW	B'10000001'
	MOVWF	TRISB		;B-PORT IRÁNYAINAK MEGADÁSA
	MOVLW	B'00000000'
	MOVWF	TRISC		;C-PORT IRÁNYAINAK MEGADÁSA
	
	MOVLW	B'10000100'
	MOVWF 	OPTION_REG	;OPTION_REG BEÁLLÍTÁSA(TMR0 ELŐOSZTÓ)
	
	MOVLW	.006
	MOVWF 	ADCON1		;PORT DIGITIÓ BEÁLLÍTÁSA
	
	BANKSEL	PORTA		;ABBA A BANKBA LÉPÉS AHOL A PORTA REGISZTER VAN (BANK0)
	
	MOVLW	HIGH	TABLA	;UGRÓTÁBLA LÉTREHOZÁSA
	MOVWF	PCLATH

	BSF	INTCON,T0IE	;TMR0 MEGSZAKÍTÁS ENGEDÉLYEZÉSE
	BSF	INTCON,GIE	;ÁLTALÁNOS MEGSZAKÍTÁS ENGEDÉLYEZÉSE

	BCF	PIROS		;PIROS LED KIKAPCSOLÁSA
	BCF	SARGA		;SÁRGA LED KIKAPCSOLÁSA
	BCF	ZOLD		;ZÖLD LED KIKAPCSOLÁSA
	BCF	PORTA,0		;ZÜMMER KIKAPCSOLÁSA

;------------------------------FŐPROGRAM------------------------------------
MAIN
	MOVLW	D'7'		;REGISZTEREK FELTÖLTÉSE
	MOVWF	PIR		;AZ ITT MEGADOTT IDŐÉRTÉKEKKEL FOGNAK VILÁGÍTANI AZ EGYES LEDEK
	MOVLW	D'3'		
	MOVWF	SAR
	MOVLW	D'7'
	MOVWF	ZOL

	MOVLW	D'10'		;KIJELZŐK "KIKAPCSOLÁSA" ÚGY, HOGY NULLA ÉRTÉKKEL TÖLTJÜK FEL ŐKET
	MOVWF	DISP1
	MOVWF	DISP2
	MOVWF	DISP3
	MOVWF	DISP4

;--------------VILLOGÓ ÜZEMMÓD---(SÁRGA FÉNY VILLOG)--------------------------

VILLOG
	BSF	SARGA		;SÁRGA LED BEKAPCSOLÁSA
	CALL	DELAY		;VÁRAKOZÓ RUTIN MEGHÍVÁSA
	BCF	SARGA		;SÁRGA LED KIKAPCSOLÁSA
	CALL	DELAY		;VÁRAKOZÓ RUTIN MEGHÍVÁSA
	CALL	PRELL		
	BTFSS	PORTB,0		;PB2 MEGNYOMÁSÁNAK TESZTELÉSE
	GOTO	VILLOG		;A PROGRAM AKKOR LÉP A FŐ RÉSZRE HA MEGNYOMJUK A GOMBOT

	CALL	PRELL		;ITT LETESZTELJÜK, HOGY A GOMB EL LETT-E ENGEDVE ÉS CSAK
	BTFSC	PORTB,0		;AKKOR LÉPÜNK TOVÁBB HA MÁR NEM NYOMJÁK
	GOTO	$-2		;VISSZATÉRÉS A KETTŐVEL EZELŐTTI PARANCSRA

;---------------------NORMÁL ÜZEMMÓD-------------------------------------------------------

LAMPA
;---------PIROS FÉNY VILÁGÍT-------------------
	
	BSF	PIROS		;PIROS LED BEKAPCSOLÁSA
	MOVF 	PIR,W		;A PIR ÉRTÉKÉT ÁTMÁSOLJUK A KIJELZŐRE ÉS AZ IDEIGLENES REGISZTERBE
	MOVWF	TEMP
	MOVWF	DISP2
	CALL	SZAMLAL		;MEGHÍVJUK A SZÁMLÁLÓ RUTINT

;---------PIROS ÉS SÁRGA FÉNY VILÁGÍT----------

	BSF	SARGA		;SÁRGA LED BEKAPCSOLÁSA	
	MOVF	SAR,W		;A SAR ÉRTÉKÉT ÁTMÁSOLJUK A KIJELZŐRE ÉS AZ IDEIGLENES REGISZTERBE
	MOVWF	TEMP
	MOVWF	DISP2
	CALL	SZAMLAL		;MEGHÍVJUK A SZÁMLÁL RUTINT
	
;---------ZÖLD FÉNY VILÁGÍT--------------------

	BCF	PIROS		;PIROS LED KIKAPCSOLÁSA
	BCF	SARGA		;SÁRGA LED KIKAPCSOLÁSA
	BSF	ZOLD		;ZÖLD LED BEKAPCSOLÁSA
	MOVF	ZOL,W
	MOVWF	TEMP
	MOVWF	DISP2
	CALL	SZAMLAL
	
;---------SÁRGA FÉNY VILÁGÍT-------------------

	BCF	ZOLD		;ZÖLD LED KIKAPCSOLÁSA
	BSF	SARGA		;SÁRGA LED BEKAPCSOLÁSA
	MOVF	SAR,W
	MOVWF	TEMP
	MOVWF	DISP2
	CALL	SZAMLAL
	BCF	SARGA		;SÁRGA LED KIKAPCSOLÁSA

;---------TESZT---------------------------------

	CALL	PRELL		;PB2 TESZTELÉSE ÉS HA NYOMJÁK AKKOR VISSZATÉRÜNK A VILLOGÓ ÜZEMMÓDBA
	BTFSS	PORTB,0
	GOTO	LAMPA
	
	MOVLW	D'10'		;KIJELZŐK KIKAPCSOLÁSA
	MOVWF	DISP2
	MOVWF	DISP4

	CALL	PRELL		;A GOMB ELENGEDETTSÉGÉNEK VIZSGÁLATA
	BTFSC	PORTB,0
	GOTO	$-2			;VISSZATÉRÉS A KETTŐVEL EZELŐTTI PARANCSRA
	GOTO	VILLOG		;VILLOGÓ ÜZEMMÓDRA VALÓ UGRÁS		

;--------------------------A FŐPROGRAM VÉGE--------------------------------


;-----------------------------SZUBRUTINOK----------------------------------

SZAMLAL				;EZ A RUTIN FELELŐS A VISSZASZÁMLÁLÁSÉRT
	MOVF	TEMP,W		;AZ IDEIGLENES REGISZTER ÉRTÉKÉT ÁTMÁSOLJUK A KIJELZŐRE
	MOVWF	DISP4
	CALL	DELAY		;MEGHÍVJUK A VÁRAKOZÓ RUTINT
	DECFSZ	TEMP,F		;AZ IDEIGLENES REGISZTER ÉRTÉKÉNEK CSÖKKENTÉSE ÉS VIZSGÁLATA
	GOTO	SZAMLAL		;HA AZ IDEIGLENES REGISZTERNEK AZ ÉRTÉKE MÉG NEM NULLA AKKOR ÚJRA LEFUTTATJUK SZÁMLÁLÓ RUTINT
	RETURN			;HA AZ IDEIGLENES REGISZTER ÉRTÉKE NULLA VISSZATÉRÜNK A RUTINBÓL

DELAY				;VÁRAKOZÓ RUTIN
	MOVLW	D'255'		;EBBEN A RUTINBA SEMMI A PROGRAM RÉSZÉRE LÉNYEGES DOLOG NEM TÖRTÉNIK
	MOVWF	VAR1		;EZ A RUTIN AZÉRT FONTOS SZÁMUNKRA MERT HA NEM LENNE BENNE A PROGRAMBAN NEM LÁTNÁNK PL.
DEL1				;A LEDEK VILLOGÁSÁT
	MOVLW	D'255'		
	MOVWF	VAR2		;A RUTIN MŰKÖDÉSE: KÜLÖNBÖZŐ REGISZTEREKET FELTÖLTÜNK BIZONYOS ÉRTÉKEKKEL (EZEKKEL
DEL2				;AZ ÉRTÉKEKKEL SZABÁLYOZHATJUK A RUTIN HOSSZÁT) MAJD ADDIG CSÖKKENTJÜK A REGISZTEREK ÉRTÉKÉT 
	MOVLW	D'010'		;AMÍG AZ ÖSSZES ÉRTÉKE NULLA NEM LESZ, JELEN ESETBE AMÍG EZ A RUTIN VÉGREHAJTÓDIK
	MOVWF	VAR3		;EZ ALATT 255x255x10-SZER FUT LE A NOP UTASÍTÁS  
DEL3
	NOP
	DECFSZ	VAR3,F
	GOTO	DEL3
	DECFSZ	VAR2,F
	GOTO	DEL2
	DECFSZ	VAR1,F
	GOTO	DEL1
	RETURN

PRELL				;EZ SZINTÉN EGY VÁRAKOZÓ RUTIN
	MOVLW	D'100'		;ENNEK A RUTINNAK AZ A LÉNYEGE HOGY KISZŰRJÜK A MECHANIKUS ÉRINTKEZŐ 
	MOVWF	VAR1		;"PRELLEZÉSÉT", AZAZ NE KAPJUNK 1 GOMBNYOMÁSRA TÖBB HAMIS IMPULZUST
PRE1
	MOVLW	D'100'
	MOVWF	VAR2
PRE2
	NOP
	DECFSZ	VAR2,F
	GOTO	PRE2	
	DECFSZ	VAR1,F
	GOTO	PRE1
	RETURN

;-----------------------KIJELZŐ MULTIPLEXELÉS-------------------------------

T0INT					;TMR0 MEGSZAKÍTÁS
	BCF	INTCON,GIE		;ÁLTALÁNOS MEGSZAKÍTÁS TILTÁSA
	BCF	INTCON,T0IF		;TMR0 MEGSZAKÍTÁST JELZŐ BIT TÖRLÉSE
	BTFSC	MELYDISP,0		;KIJELZŐ KIVÁLASZTÁSA
	GOTO	KIIR1
	BTFSC	MELYDISP,1
	GOTO	KIIR2
	BTFSC	MELYDISP,2
	GOTO	KIIR3
	BTFSC	MELYDISP,3
	GOTO	KIIR4
;---------------------------
KIIR1					;1-ES KIJELZŐRE VALÓ KIÍRATÁS
	MOVF	DISP1,W			;AZ 1-ES KIJELZŐRE KIÍRATNI KÍVÁNT ÉRTÉK BERAKÁSA A W-BE	
	CALL	TABLA			;UGRÓTÁBLA MEGHÍVÁSA
	MOVWF 	PORTC			;A KÍVÁNT ÉRTÉK KIRAKÁSA A KIJELZŐKRE
	CLRF	MELYDISP
	BSF	MELYDISP,1		;KIJELZŐ VÁLASZTÓ BIT ÉRTÉKÉNEK MEGVÁLTOZTATÁSA
	BSF	PORTB,4			;AZ 1-ES KIJELZŐ BEKAPCSOLÁSA
	BCF	PORTB,3			;A 2-ES KIJELZŐ KIKAPCSOLÁSA
	BCF	PORTB,2			;A 3-MAS KIJELZŐ KIKAPCSOLÁSA
	BCF	PORTB,1			;A 4-ES KIJELZŐ KIKAPCSOLÁSA
	GOTO	POP
;---------------------------
KIIR2
	MOVF	DISP2,W
	CALL	TABLA
	MOVWF 	PORTC
	CLRF	MELYDISP
	BSF	MELYDISP,2
	BCF	PORTB,4			;AZ 1-ES KIJELZŐ KIKAPCSOLÁSA
	BSF	PORTB,3			;A 2-ES KIJELZŐ BEKAPCSOLÁSA
	BCF	PORTB,2			;A 3-MAS KIJELZŐ KIKAPCSOLÁSA
	BCF	PORTB,1			;A 4-ES KIJELZŐ KIKAPCSOLÁSA
	GOTO	POP
;---------------------------
KIIR3
	MOVF	DISP3,W
	CALL	TABLA
	MOVWF 	PORTC
	CLRF	MELYDISP
	BSF	MELYDISP,3
	BCF	PORTB,4
	BCF	PORTB,3
	BSF	PORTB,2
	BCF	PORTB,1
	GOTO	POP
;---------------------------
KIIR4
	MOVF	DISP4,W
	CALL	TABLA
	MOVWF 	PORTC
	CLRF	MELYDISP
	BSF	MELYDISP,0
	BCF	PORTB,4
	BCF	PORTB,3
	BCF	PORTB,2
	BSF	PORTB,1
	GOTO	POP

;------------------------UGRÓTÁBLA----------------------------

	ORG		600
	

TABLA					;UGRÓTÁBLA
	ADDWF	PCL,F			;W HOZZÁADÁSA A PROGRAMSZÁMLÁLÓ ALSÓ BYTE-JÁHOZ
	RETLW	B'00111111'		;0
	RETLW	B'00000110'		;1
	RETLW	B'01011011'		;2
	RETLW	B'01001111'		;3
	RETLW	B'01100110'		;4
	RETLW	B'01101101'		;5
	RETLW	B'01111101'		;6
	RETLW	B'00000111'		;7
	RETLW	B'01111111'		;8
	RETLW	B'01101111'		;9
	RETLW	B'00000000'		;SEMMI

	RETURN			

	END						;PROGRAM VÉGE
