LIST P=16F627
#INCLUDE "P16F627.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _CP_OFF & _WDT_OFF & _MCLRE_OFF & _LVP_OFF

; fenykoveto.asm
; Ez a progi azt csinálja, hogy ha az ra2-es láb pozitívabb, mint az ra1-es,
; akkor rb6-os lábra rakott led világít, ha nem, akkor az rb7-es lábra rakott led

; Változók
CBLOCK 0x20
	; Időzítő
	Coarse_Delay
	Fine_Delay
	M_Delay
	; Mentés
	save_s
	save_w
ENDC

ORG	0
	goto	START
ORG	4					; itt kezdődik a megszakítás
	BCF		PIR1,CMIF	; ezt lenullázom, hogy ha kilépek a megszakításból, akkor megint lehessen megszakítás
	; Regiszterek mentése
	MOVWF	save_w          ; save w register
	MOVF	STATUS, W       ; W = STATUS
	MOVWF	save_s          ; save STATUS register
	; ha porta2 értéke nagyobb mint porta1 értéke:
	MOVLW	B'01000000' ; portb6-os lábon egy ideig 1 lesz
	MOVWF	PORTB
	; Regiszterek visszaállítása
	MOVF	save_s, W	; Put STATUS and W back where they belong
	MOVWF	STATUS
	SWAPF	save_w, F
	SWAPF	save_w, W
	RETFIE				; kilépek

START
	CLRF	PORTA
	MOVLW	B'00000101'	; beállítom a komparátorokat, így csak 1 komparátor fog működni, az RA1 RA2-es
	MOVWF	CMCON
	; Portok beállítása
	BSF		STATUS,RP0
	MOVLW	B'00011111'	; PORTA --> bemenet
	MOVWF	TRISA
	MOVLW	B'00000000'	; PORTB --> kimenet
	MOVWF	TRISB
	BCF 	STATUS,RP0
	; Megszakítás
	BCF		PIR1,CMIF
	BSF		STATUS,RP0
	BSF		PIE1,CMIE	; engedélyezem a komparátoros megszakítást
	BCF		STATUS,RP0
	BSF		INTCON,GIE	; engedélyezem a főmegszakításkapcsolót
	BSF		INTCON,PEIE
	CLRF	PORTB		; lenullázom portb-t

VISSZA:
	MOVLW	B'10000000' ; itt a portb7-es lábon egy ideig 1 lesz
	MOVWF	PORTB
	GOTO	VISSZA

Delay					; this loop takes approx 1mSec
	movwf	Coarse_Delay
	Delay_M
		movlw	H'0A'
		movwf	M_Delay
		Delay01
			movlw	H'FF'
			movwf	Fine_Delay
			Delay02
				NOP
				decfsz  Fine_Delay,F
				goto    Delay02
				decfsz  M_Delay,F
				goto    Delay01
				decfsz  Coarse_Delay,F
				goto    Delay_M
				retlw   0

END