	LIST P=16F877
 #INCLUDE "P16F877.INC"
 ERRORLEVEL	0,	-302		; suppress bank selection messages
 __CONFIG _XT_OSC&_CP_OFF&_WDT_OFF&_LVP_OFF
	CBLOCK	0x20			
		W_SAVE
		STATUS_SAVE
		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			; ***********************************************************************
		ELOBYTE
		WSTACK
		SSTACK
	ENDC

#include "m_bank.asm"


	ORG	0
	GOTO	MAIN			;Beugrunk a MAIN loopba


;__________________________________________________________________________________________________
;			megszakitasi lap

	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
	MOVWF   WSTACK
	SWAPF   STATUS,0
	MOVWF   SSTACK           ; eddig a mentés


		;celszeru mindent azonnal lekapcsolni (ledek,kijelzok stb) pl CLRF PORTD (ha epp nem ez az elmentendo byte)
	BANK3				;BSF STATUS, RP1   BSF STATUS, RP0     Bank 3
	BTFSC	EECON1, WR 		;Wait for write to finish (addig újabb írást nem kezd amig egy esetleges korábbit be nem fejezett)
	GOTO	$-1 			;
			
	BANK2				;BCF STATUS, RP0 	;Bank 2		EEADR EEDATA   Bank 2-ben
	MOVLW	5			; az ötös programmemória címre írok majd be    ;MOVF ADDR,W 	;Address to	256byte egyikenek cimet megadjuk
	MOVWF	EEADR 			;write to  (erre a cimre irunk)
	MOVFW	ELOBYTE			;PORTD amit kiiratok  ;MOVF VALUE, W
	MOVWF	EEDATA 			;write
			
	BANK3				;BSF STATUS, RP0 ;Bank 3		EECON1 EECON2 Bank 3-ban
	BCF	EECON1, EEPGD 		;Point to Data memory
	BSF	EECON1, WREN 		;Enable writes
	BCF	INTCON, GIE 		;Only disable interrupts if already enabled, otherwise discard	(iras idejere az interruptot tiltjuk)
	MOVLW	0x55 			;Write 55h to
	MOVWF	EECON2 			;EECON2
	MOVLW	0xAA 			;Write AAh to
	MOVWF	EECON2 			;EECON2
	BSF	EECON1, WR 			;Start write operation
	BTFSC	EECON1, WR 		;Wait for write to finish (addig újabb írást nem kezd)
	GOTO	$-1 			;

	BSF	INTCON, GIE 		;Only enable interrupts if already disabled, otherwise discard	(iras idejere az interrupt tiltva volt, most ujbol engedelyezzuk)
	BCF	EECON1, WREN 		;Disable writes (le kell tíltani az EEPROM írását is, de csak akkor, ha már megtörtént az írás)
	BANK0				;BANK0-ba visszalépünk

	GOTO	KILEP

KILEP
	BCF	INTCON,INTF		;Töröljük az INTF flag bitet (Jelezzük, kezeltük a megszakítást RB0)

	; Visszatöltjük a Work és Status regisztereket
;	MOVFW	STATUS_SAVE
;	MOVWF	STATUS
;	MOVFW	W_SAVE
	SWAPF   SSTACK,0        ; visszaállítás
	MOVWF   STATUS
	SWAPF   WSTACK,1
	SWAPF   WSTACK,0

	RETFIE					;Visszajövünk az interruptból gondolom oda ahol abbahagyta a vegtelen ciklusba

;			megszakitasi lap
;__________________________________________________________________________________________________
;			MAIN (minden beallitasa)

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'00000001'		;Betöltjük az akksiba a TRISB-be valót
	MOVWF	TRISB			;Beletöltjük az 0. PORTB bemenet lesz  RB0/INT
	MOVLW	B'00000001'		;Betöltjük az akksiba a TRISA-be valót
	MOVWF	TRISA			;Beletöltjük a 3. 2. 1. 0. PORTA bemenet lesz   (ellenállással H-ra húzni alapállapotban, L szinre reagál)

	BCF	OPTION_REG,INTEDG	;Lefutó élre interruptol (1 = felfutó, 0 = lefutó él) 33.lábat ellenállással H szintre húzni
	BANK0				;BANK0-ba visszalépünk

	;Beállítjuk az interruptokat
	BSF		INTCON,INTE		;Engedélyezzük az interruptot az INT0-ra
	BSF		INTCON,GIE		;General Interrupt Enable bitet 1-re állítva bekapcsolunk mindent


;kiolvassuk az 5-ös EEPROM byte értékét
				
				
	BANK2				;BSF STATUS, RP1    BCF STATUS, RP0        Bank 2
	MOVLW	5			;Write address
	MOVWF	EEADR 			;to read from
				
	BANK3				;BSF STATUS, RP0 ;Bank 3
	BCF	EECON1, EEPGD 		;Point to Data memory
	BSF	EECON1, RD 		;Start read operation   (itt az EEDATA-ba 11111111 kerul)
				
	BANK2				;BCF STATUS, RP0 ;Bank 2
	MOVFW	EEDATA 		;W = EEDATA
	MOVWF	ELOBYTE
	BANK0				;BANK0-ba visszalépünk

;			MAIN (minden beallitasa)
;__________________________________________________________________________________________________

LOOP
	MOVFW	ELOBYTE
	MOVWF	PORTD
	MOVLW	d'10'			;  ******************************************************
	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			;  ******************************************************
	INCF	ELOBYTE,1
	GOTO	LOOP





;______________________________________________________________________________________
;			késlelteto rutin (hossza mindig a T1ERTEK  T2ERTEK   T3ERTEK  -el beállítva)


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


















