LIST P=16F627
#INCLUDE "P16F627.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _CP_OFF & _WDT_OFF & _MCLRE_OFF & _LVP_OFF

; Változók deklarálása
CBLOCK	0x70
	MPERC1		; másodperc első számjegye
	MPERC10		; másodperc második számjegye
	PERC1		; perc első számjegye
	PERC10		; perc második számjegye
	ORA1		; óra első számjegye
	ORA10		; óra második számjegye
	; Időzítéshez használt változók
	COUNT1
	COUNT2
	; TIMER0 megszakításhoz használt változók
	W_SAVE		; Ebbe mentjük W-t
	STATUS_SAVE	; Ebbe mentjük STARTUS-t
	COUNT		; Ciklusszámláló
	JELZO		; Ez jelzi, ha a megszakítás lefutott
ENDC

ORG	0
GOTO	MAIN

ORG 4
	; Elmentjük a Work és Status regisztereket
	MOVWF	W_SAVE		;Először a Work regisztert
	MOVFW	STATUS		;STATUS-t bele a már lementett Workbe
	MOVWF	STATUS_SAVE	;Status_save-be beletölti a Worköt 
		MOVLW	D'131'
		MOVWF	TMR0
		; CIKLUS AMI SZÁMOL 125-ig
		INCF	COUNT,F
		MOVFW	COUNT
		XORLW	D'125'
		BTFSS	STATUS,Z
		goto	VEGE
		; LESZ NÖVELÉS
		MOVLW	B'1'
		MOVWF	JELZO
	VEGE	
	; Visszatöltjük a Work és Status regisztereket
	MOVFW	STATUS_SAVE
	MOVWF	STATUS
	MOVFW	W_SAVE 
	RETFIE				;Visszajövünk az interruptból

MAIN	
	; Beállítások
	;
	; Timer0 beállítása
	MOVLW	D'131'
	MOVWF	TMR0
	MOVLW	B'00000111'	;Betöltjük az akksiba az OPTION_REG-be valót
	MOVWF	OPTION_REG	;Beletöltjük... Előosztó: 1:256
	;
	; PORTA
	MOVLW	B'00000111'
	MOVWF	CMCON
	BSF		STATUS,RP0
	MOVLW	B'10000'
	MOVWF	TRISA
	; PORTB
	MOVLW	B'11000000'
	MOVWF	TRISB
	BCF 	STATUS,RP0
	;
	; Timer0 beállítása
	BSF		INTCON,T0IE	;Engedélyezzük az interruptot a Timer0-ra
	BSF		INTCON,GIE	;General Interrupt Enable bitet 1-re állítva bekapcsolunk mindent

START		; Változók nullázása
	CLRF	MPERC1
	CLRF	MPERC10
	CLRF	PERC1
	CLRF	PERC10
	CLRF	ORA1
	CLRF	ORA10
	; Idő beállítása (ha nincsenek gombok)
		MOVLW	B'0000'
		MOVWF	MPERC1
		MOVLW	B'0000'
		MOVWF	MPERC10
		MOVLW	B'0000'
		MOVWF	PERC1
		MOVLW	B'0000'
		MOVWF	PERC10
		MOVLW	B'0000'
		MOVWF	ORA1
		MOVLW	B'0000'
		MOVWF	ORA10

KIIR		; főprogramrész
			call	KIIR1	; Idő kiírása
			call	VIZSGAL	; Gombok vizsgálata
	MOVFW	JELZO	; Jelző vizsgálata
	XORLW	B'1'
	BTFSS	STATUS,Z
	goto	KIIR	; Ha 0: vissza a kiíráshoz
	MOVLW	B'0'	; Ha 1:
	MOVWF	JELZO	; Jelző nullázása
	call	NOVEL	; Másodperc növelése
	goto	KIIR	; Vissza az elejére

KIIR1		; adatok kiírása
	; másodperc
	call	TORLES
	MOVLW	B'11111110'
	MOVWF	PORTB
	MOVF	MPERC1,W
	MOVWF	PORTA
	call	TORLES
	MOVLW	B'11111101'
	MOVWF	PORTB
	MOVF	MPERC10,W
	MOVWF	PORTA
	; perc
	call	TORLES
	MOVLW	B'11111011'
	MOVWF	PORTB
	MOVF	PERC1,W
	MOVWF	PORTA
	call	TORLES
	MOVLW	B'11110111'
	MOVWF	PORTB
	MOVF	PERC10,W
	MOVWF	PORTA
	; óra
	call	TORLES
	MOVLW	B'11101111'
	MOVWF	PORTB
	MOVF	ORA1,W
	MOVWF	PORTA
	call	TORLES
	MOVLW	B'11011111'
	MOVWF	PORTB
	MOVF	ORA10,W
	MOVWF	PORTA
	return

NOVEL		; Idő növelése
	MOVFW	MPERC1
	XORLW	B'1001'
	BTFSS	STATUS,Z
	GOTO	KISEBBMPERC1
	GOTO	NAGYOBBMPERC1
	KISEBBMPERC1
	INCF	MPERC1,F
	return
	NAGYOBBMPERC1
	CLRF	MPERC1
	MOVFW	MPERC10
	XORLW	B'0101'
	BTFSS	STATUS,Z
	GOTO	KISEBBMPERC10
	GOTO	NAGYOBBMPERC10
	KISEBBMPERC10
	INCF	MPERC10,F
	return
	NAGYOBBMPERC10
	CLRF	MPERC10
	MOVFW	PERC1
	XORLW	B'1001'
	BTFSS	STATUS,Z
	GOTO	KISEBBPERC1
	GOTO	NAGYOBBPERC1
	KISEBBPERC1
	INCF	PERC1,F
	return
	NAGYOBBPERC1
	CLRF	PERC1
	MOVFW	PERC10
	XORLW	B'0101'
	BTFSS	STATUS,Z
	GOTO	KISEBBPERC10
	GOTO	NAGYOBBPERC10
	KISEBBPERC10
	INCF	PERC10,F
	return
	NAGYOBBPERC10
	CLRF	PERC10
	MOVFW	ORA10
	XORLW	B'0010'
	BTFSS	STATUS,Z
	GOTO	ORA10NULLAEGY
	GOTO	ORA10KETTO
	ORA10NULLAEGY
	MOVFW	ORA1
	XORLW	B'1001'
	BTFSS	STATUS,Z
	GOTO	ORA1KISEBB1
	GOTO	ORA1NAGYOBB1
	ORA1KISEBB1
	INCF	ORA1,F
	return
	ORA1NAGYOBB1
	CLRF	ORA1
	INCF	ORA10,F
	return
	ORA10KETTO
	MOVFW	ORA1
	XORLW	B'0100'
	BTFSS	STATUS,Z
	GOTO	ORA1KISEBB2
	GOTO	ORA1NAGYOBB2
	ORA1KISEBB2
	INCF	ORA1,F
	return
	ORA1NAGYOBB2
	CLRF	MPERC1
	CLRF	MPERC10
	CLRF	PERC1
	CLRF	PERC10
	CLRF	ORA1
	CLRF	ORA10
	return

TORLES		; kijelző törlése, hogy ne legyen áthallás
	MOVLW	B'111111'
	MOVWF	PORTB
	MOVLW	B'0000'
	MOVWF	PORTA
	return

; EDDIG =====================================================

; Gombok vizsgálata
VIZSGAL
	BTFSC	PORTA,4
	GOTO	TOVABBVIZSGAL
	return					; Nincs csatlakoztatva
	BTFSC	PORTB,7
	GOTO	TOVABBVIZSGAL
	return					; Nincs csatlakoztatva
	BTFSC	PORTB,6
	GOTO	TOVABBVIZSGAL	; Csatlakoztatva
	return					; Nincs csatlakoztatva
	;
	TOVABBVIZSGAL
		call	VIZSGAL1
		call	VIZSGAL2
		call	VIZSGAL3
	return

VIZSGAL1
	BTFSS	PORTA,4
	GOTO	GOMB1LENYOMVA1
	GOTO	GOMB1FELENGEDVE1
	GOMB1LENYOMVA1
		CALL	KIIR1
		CALL	PRELL
		; Várakozás felengedésig
		BTFSS	PORTA,4
		GOTO	GOMB1LENYOMVA1		; Lenyomva
		GOTO	GOMB1FELENGEDVE2	; Felengedve
		GOMB1FELENGEDVE2
			CALL	KIIR1
			; Várakozás lenyomásig
			BTFSS	PORTA,4
			GOTO	GOMB1LENYOMVA3
			GOTO	GOMB1FELENGEDVE2
			GOMB1LENYOMVA3
				CALL	KIIR1
				CALL	PRELL
				; Várakozás felengedésig
				BTFSS	PORTA,4
				GOTO	GOMB1LENYOMVA3		; Lenyomva
				GOTO	GOMB1FELENGEDVE4	; Felengedve
				GOMB1FELENGEDVE4
					return
	GOMB1FELENGEDVE1
		return	; Ha nincs gombnyomás: vissza

VIZSGAL2
	BTFSS	PORTB,7
	GOTO	GOMB2LENYOMVA1
	GOTO	GOMB2FELENGEDVE1
	GOMB2LENYOMVA1
		CALL	VILAGIT
		CALL	PRELL
		; Várakozás felengedésig
		BTFSS	PORTB,7
		GOTO	GOMB2LENYOMVA1		; Lenyomva
		GOTO	GOMB2FELENGEDVE2	; Felengedve
		GOMB2FELENGEDVE2
			CALL	VILAGIT
			; Várakozás lenyomásig
			BTFSS	PORTB,7
			GOTO	GOMB2LENYOMVA3
			GOTO	GOMB2FELENGEDVE2
			GOMB2LENYOMVA3
				CALL	VILAGIT
				CALL	PRELL
				; Várakozás felengedésig
				BTFSS	PORTB,7
				GOTO	GOMB2LENYOMVA3		; Lenyomva
				GOTO	GOMB2FELENGEDVE4	; Felengedve
				GOMB2FELENGEDVE4
					return
	GOMB2FELENGEDVE1
		return	; Ha nincs gombnyomás: vissza

VIZSGAL3
	BTFSS	PORTB,6
	GOTO	GOMB3LENYOMVA1
	GOTO	GOMB3FELENGEDVE1
	GOMB3LENYOMVA1
		CALL	KIIR1
		CALL	PRELL
		CALL	PRELL
		; Várakozás felengedésig
		BTFSS	PORTB,6
		GOTO	GOMB3LENYOMVA1		; Lenyomva
		GOTO	GOMB3FELENGEDVE2	; Felengedve
		GOMB3FELENGEDVE2
			call	PRELL
			CALL	PRELL
			CALL	SZAMNOVEL
			return
	GOMB3FELENGEDVE1
		return	; Ha nincs gombnyomás: vissza

PRELL	; Prell kiszűrése
	CLRF	COUNT1
	eleje3
	NOP
	INCF	COUNT1,F
	MOVFW	COUNT1
	XORLW	D'100'
	BTFSS	STATUS,Z
	GOTO	eleje3
	return

VILAGIT		; összes led felkapcsolása
	MOVLW	B'000000'
	MOVWF	PORTB
	MOVLW	B'1111'
	MOVWF	PORTA
	return

SZAMNOVEL
	MOVFW	PERC1
	XORLW	B'1001'
	BTFSS	STATUS,Z
	GOTO	KISEBBPERC1GOMB
	GOTO	NAGYOBBPERC1GOMB
	KISEBBPERC1GOMB
		INCF	PERC1,F
		return
	NAGYOBBPERC1GOMB
		CLRF	PERC1
		return

END