
		list		p=16f628A
		#include	<p16f628a.inc>
	
		__CONFIG	(_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & DATA_CP_OFF & _CP_OFF)


		cblock		0x020				; Bank0 - 80 Byte
Display								; PORTB kimeneti tároló
LastPB								; PORTB előző állapotának tárolása a változás megállapításához
Temp								; átmeneti tároló
		endc

		cblock		0x70				; Közös memória terület - 16 Byte
w_save 								; W regiszter átmeneti helye
status_save							; STATUS regiszter átmeneti helye
		endc
		
		org		0x0000				; Reset vektor kezdőcíme
		goto		Start
		
		org		0x0004				; ISR vektor kezdőcíme
		movwf		w_save
		swapf		w_save, f			; W regiszter mentés + előkészület a visszaállításra
		swapf		STATUS, w			; STATUS regiszter -> W regiszter
		movwf		status_save			; STATUS mentése
		btfsc		INTCON, T0IE			; Timer0 megszakítás engedélyezett?
		btfss		INTCON, T0IF			; Timer0 megszakítás kérés érkezett?
		goto		$+2						; ugrás a követkető vizsgálatra
		goto		ServiceTimer0			; Timer0 megszakítás kiszolgálás
		btfsc		INTCON, RBIE			; PortB megszakítás engedélyezett;
		btfss		INTCON, RBIF			; PortB megszakítás kérés érkezett?
		goto		$+2						; ugrás a megszakítás végére
		goto	 	ServiceRBInterrupt		; PortB megszakítás kiszolgálás
		goto 		ExitISR
		
ServiceTimer0:
		movlw		(1 << RBIE) | (0 << T0IE) | (0 << T0IF)
		movwf		INTCON				; RB megszakítás engedélyezés, T0 megszakítás tiltás, T0IF törlése
		goto		ExitISR

ServiceRBInterrupt:
;		movlw		(0 << RBIE) | (0 << RBIF)
;		movwf		INTCON				; RBIE, tiltása, RBIF törlése
		movf		PORTB, w
		movwf		Temp				; PORTB állapotának elmentése a Temp változóba
		xorwf		LastPB, f			; XOR művelet a PORTB és a LastPB között a változás megállapításához
		btfsc		LastPB, RB5			; volt-e változás az RB5 lábon?
		goto		PB_End
RB5_CHNG:		
		btfsc		Temp, RB5			; RB5 változása 0->1-re vagy 1->0-ra? 
		goto		PB_End
		movlw		b'00000001'
		xorwf		PORTB, f 
PB_End:
		movf		Temp, w
		movwf		LastPB				; PORTB értékének mozgatása LastPb-be Temp-en keresztül
;		movlw		0xD8				; TMR0 feltöltése -> 0xD8 : D'216' ; előosztóval ~ 10ms   
		movlw		0xB2				;		     0xB2 : D'178' ; 		 ~ 20ms 
;		movlw		0x3C				;		     0x3C : D'60'  ;		 ~ 50ms
		movwf		TMR0		
		bcf		INTCON, RBIF			; RB megszakítást jező bit törlése
		bcf		INTCON, RBIE			; RB megszakítás tiltása
		bsf		INTCON, T0IE			; T0IE engedélyezés	
		goto		ExitISR

ExitISR:				
		swapf		status_save, w
		movwf		STATUS
		swapf		w_save, w
		retfie
		
Start:
		banksel		PCON
		bsf			PCON, OSCF		; Belső oszcillátor : 4 Mhz
		movlw		0x07
		movwf		OPTION_REG 			; Timer0 előosztó beállítás : (Fosc/4) / 256
		
		movlw 		b'00000000' 			
		movwf		TRISA					
		movlw		b'00100000'
		movwf		TRISB				; Adatirányok beállítása
		
		banksel		CMCON
		movlw		0x07					
		movwf		CMCON				; Komparátor kikapcsolása
		
;		movlw		(1 << GIE) | (0 << T0IE) | (1 << RBIE) | (0 << RBIF) 
		movlw		b'10001000'
		movwf		INTCON				; Globális interrupt és PORTB változás engedélyezés, Timer0 interrupt tiltás 
		bsf		LastPB, RB5			; LastPB tároló 5. bitjének beállítása 
;		call		init_display			; Display változó kezdőérték
		
MainLoop:
		nop
;		btfss		Button5_Flag, 0			; Button5 Flag figyelés
;		goto		$+3
;		movlw		b'00000001'			; maszk betöltése w-be
;		xorwf		Display, f			; Display regiszter 0. bitjének negálása
;		movf		Display, w 
;		movwf		PORTB				; Display -> PORTB
;		bcf		Button5_Flag, 0
		goto		MainLoop
		
		
init_display:
		bcf		STATUS,C
		movlw		b'00000001'
		movwf		Display	
		return	
		
		end
