 LIST P=16F877
 #INCLUDE "P16F877.INC"
 ERRORLEVEL	0,	-302		; suppress bank selection messages
 __CONFIG _XT_OSC&_CP_OFF&_WDT_OFF&_LVP_OFF
	CBLOCK	0x70			;A Minden BANK-ból látható GPR kezdőcím
		W_SAVE
		STATUS_SAVE
		SZAMLALO1
		SZAMLALO2
		SZAMLALO3
		T1				; ***********************************************************************
		T2				; *  T1 T2 T3 valtozokat hasznalja a DELAY subrutin mukodese kozben		*
		T3				; *																		*
		T1ERTEK			; *  T1ERTEK T2ERTEK T3ERTEK -el allitjuk be a kesleltetes hosszat 		*
		T2ERTEK			; *    a DELAY meghivasa elott											*
		T3ERTEK			; ***********************************************************************
	ENDC

#include "m_bank.asm"

	ORG	0
	GOTO	MAIN			;Beugrunk a MAIN loopba

	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

	BTFSS	PORTA,3
	GOTO	KIJELZO

	BTFSC	INTCON,T0IF		;Ha 1 a TMR0 flag
	GOTO	MEGSZ_TIMER		;Goto a timer megszakításra
	GOTO	KILEP

KIJELZO
	BCF		INTCON,INTF			;Töröljük az INTF flag bitet (Jelezzük, kezeltük a megszakítást RB0)

	MOVLW	d'20'			;  ******************************************************
	MOVWF	T1ERTEK			;  *  													*
	MOVLW	d'200'			;  *  Ezt a szakaszt kell betenni minden kesleltetes	*
	MOVWF	T2ERTEK			;  *  eseten, a T1ERTEK T2ERTEK T3ERTEK -el beallitva	*
	MOVLW	d'20'			;  *  a kesleltetes hosszat								*
	MOVWF	T3ERTEK			;  *													*
	CALL	DELAY			;  ******************************************************

	MOVLW	b'00100000'
	MOVWF	PORTC

	MOVLW	d'20'			;  ******************************************************
	MOVWF	T1ERTEK			;  *  													*
	MOVLW	d'200'			;  *  Ezt a szakaszt kell betenni minden kesleltetes	*
	MOVWF	T2ERTEK			;  *  eseten, a T1ERTEK T2ERTEK T3ERTEK -el beallitva	*
	MOVLW	d'20'			;  *  a kesleltetes hosszat								*
	MOVWF	T3ERTEK			;  *													*
	CALL	DELAY			;  ******************************************************

	MOVLW	b'01000000'
	MOVWF	PORTC

	MOVLW	d'20'			;  ******************************************************
	MOVWF	T1ERTEK			;  *  													*
	MOVLW	d'200'			;  *  Ezt a szakaszt kell betenni minden kesleltetes	*
	MOVWF	T2ERTEK			;  *  eseten, a T1ERTEK T2ERTEK T3ERTEK -el beallitva	*
	MOVLW	d'20'			;  *  a kesleltetes hosszat								*
	MOVWF	T3ERTEK			;  *													*
	CALL	DELAY			;  ******************************************************

	MOVLW	b'10000000'
	MOVWF	PORTC

	MOVLW	d'20'			;  ******************************************************
	MOVWF	T1ERTEK			;  *  													*
	MOVLW	d'200'			;  *  Ezt a szakaszt kell betenni minden kesleltetes	*
	MOVWF	T2ERTEK			;  *  eseten, a T1ERTEK T2ERTEK T3ERTEK -el beallitva	*
	MOVLW	d'20'			;  *  a kesleltetes hosszat								*
	MOVWF	T3ERTEK			;  *													*
	CALL	DELAY			;  ******************************************************

	MOVLW	b'00000100'
	MOVWF	PORTC

	GOTO	KILEP

MEGSZ_TIMER

	BCF		INTCON,T0IF		;Töröljük az RBIF flag bitet (Jelezzük, kezeltük a megszakítást)
	DECFSZ	SZAMLALO1,1
	GOTO	KILEP

	MOVLW	B'11111111'
	XORWF	PORTD,F			; XOR PORTD bitjeit

	GOTO	KILEP


KILEP


	; Visszatöltjük a Work és Status regisztereket
	MOVFW	STATUS_SAVE
	MOVWF	STATUS
	MOVFW	W_SAVE

	RETFIE				;Visszajövünk az interruptból


MAIN
	BANK1					;Unit az m_bank.asm-ben
	;PORTA Digitális I/O-vá tétel
	MOVLW	0x06			
	MOVWF	ADCON1			;Mindegyik PORTA digitális
	MOVLW	B'00000000'		;Betöltjük az akksiba a TRISD-be valót
	MOVWF	TRISD			;Beletöltjük (mind kimenet a nulla miatt)
	MOVLW	B'00001111'		;Betöltjük az akksiba a TRISA-be valót
	MOVWF	TRISA			;Beletöltjük (mind kimenet a nulla miatt)
	MOVLW	B'00000000'		;Betöltjük az akksiba a TRISD-be valót
	MOVWF	TRISC			;Beletöltjük (mind kimenet a nulla miatt)
	MOVLW	B'00000001'		;Betöltjük az akksiba a TRISD-be valót
	MOVWF	TRISB			;Beletöltjük (mind kimenet a nulla miatt)

	MOVLW	B'00000111'		;Betöltjük az akksiba az OPTION_REG-be valót
	MOVWF	OPTION_REG		;Beletöltjük... Előosztó: 1:256
	BANK0					;BANK0-ba visszalépünk

	MOVLW	B'01010101'		;Betöltjük az akksiba a PORTD-be valót
	MOVWF	PORTD			;Beletöltjük a PORTD-be
	CLRF	PORTC
	MOVLW	B'00000000'		;Betöltjük az akksiba a PORTD-be valót
	MOVWF	PORTB			;Beletöltjük a PORTD-be

	CLRF	SZAMLALO1

	;Beállítjuk a interruptot
	BSF		INTCON,T0IE			;Engedélyezzük az interruptot a Timer0-ra
	BSF		INTCON,INTE			;Engedélyezzük az interruptot az INT0-ra
	BSF		INTCON,GIE			;General Interrupt Enable bitet 1-re állítva bekapcsolunk mindent







LOOP
	NOP
	GOTO LOOP					;Vissza a végtelen ciklusba




DELAY					;Delay labelje
	MOVF	T1ERTEK,W
	MOVWF	T1			
DEL
	MOVF	T2ERTEK,W
	MOVWF	T2			
DEL1
	MOVF	T3ERTEK,W
	MOVWF	T3			
DEL2
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ	T3,f			;Csökkenti a T3-at, addíg, amig nem nulla
	GOTO	DEL2			; mindig visszaugruk a DEL2-re, vagyis a sok NOP-ra
	DECFSZ	T2,f			;Ha már nulla, akkor ugyanez eljátszódik a T2-vel
	GOTO	DEL1
	DECFSZ	T1,f			;Majd a T1-el is
	GOTO	DEL
	RETURN				;Visszatér a DELAY szubrutinból

 	END							;Teljes program végét jelentő END

; 4MHz-es oscillator,   Timer osztás 1 : 256(legnagyobb),    1 byte számláló(SZAMLALO1 byte)   =    16 sec-ként váltogat
; SZAMLALO2-t 4-re állítva kb 1 perc (kb 67 sec)


