	LIST P=16F877A
	#INCLUDE "P16F877A.INC"

CBLOCK 0X20
I2C_ADAT
I2C_ADAT_H
ENDC



#DEFINE FOSC	D'16000'
#DEFINE BAUD	D'100'
#DEFINE I2C_SCL	3
#DEFINE	I2C_SDA	4
;#DEFINE I2C_FAULT	0




	GOTO	SETUP_I_O

	ORG	0X00
	
	ORG	0X04





SETUP_I_O:
	BANKSEL	TRISC		; BANK1	
	BSF	TRISC,I2C_SCL	;SCL INPUT_KELL EZ? SSPCONBAN IS ÁLLÍTJUK, DE ADATLAP AJÁNLJA
	BSF	TRISC,I2C_SDA	;SDA INPUT_KELL EZ? SSPCONBAN IS ÁLLÍTJUK, DE ADATLAP AJÁNLJA
;	BSF	TRISC,I2C_FAULT	;I2C_FAULT KIMENET: JELENLEG PIN PORTC/0 
	
	MOVLW	B'00000000'	; HOGY LÁSSUK MIT CSINÁLTUNK (KÉSŐBB TÖRLENDŐ)
	MOVWF	TRISD
	BCF		TRISC,0	
	BCF		TRISC,2
	BCF		TRISC,1	;KIMENET MINDEN PIN
	BANKSEL	PORTD
	CLRF	PORTD
	CLRF	PORTC
	CLRF	I2C_ADAT_H
	CLRF	I2C_ADAT	
	

SETUP_I2C:

	BANKSEL	SSPCON		; BANK0
	MOVLW	B'00101000'	;PORTC SCL, SDA I2C LÁBAK, MASTER MODE 
	MOVWF	SSPCON
	BANKSEL	SSPSTAT		; BANK1
	MOVLW	B'10000000'	;100 KHz, 
	MOVWF	SSPSTAT
	MOVLW	.39	;ELVILEG IDE D'9'=H'9' KERÜL
	MOVWF	SSPADD
	BCF	PIE1,SSPIE	;I2C MODUL:HA MAJD AKARUNK HASZNÁLNI I2C MEGSZAKÍTÁST TEGYÜK H RA
	BCF	INTCON,PEIE	;PERIFERIA:HA MAJD AKARUNK HASZNÁLNI I2C MEGSZAKÍTÁST TEGYÜK H RA
	BCF	INTCON,GIE	;GENERAL:HA MAJD AKARUNK HASZNÁLNI I2C MEGSZAKÍTÁST TEGYÜK H RA
	BCF	PIR1,SSPIF	;INTERUPT JELZŐBIT TÖRLÉSE, HOGY BIZTOS MŰKÖDJÖN: START/STROP/ACK
	BANKSEL	SSPCON		; BANK0
	
	

I2C_MAIN:
	
;BANKSEL	PORTC
;BSF		PORTC,1	;ELJUTOTT A PROGRAM IDÁID, ZÖLD LED

	

I2C_KULDES:
	CALL	I2C_STARTT	;
	MOVLW	B'10100000'	;MESTER ÍR SLAVE FELE (SLAVE CÍM: 1010 000)
	MOVWF	I2C_ADAT	;CÍM  + WRITE (0. BIT=0) PARANCS BYTE KIKÜLDVE
	CALL	I2C_WRITE
;	CALL	I2C_ACK_CHECK	;ACK CHECK, AMIT A SLAVE KÜLD A PIC FELE
	MOVLW	B'00000000'	;ÍRT REGISZTER CÍM DEKLARÁLÁS HIGH BYTE
	MOVWF	I2C_ADAT
	CALL	I2C_WRITE
;	CALL	I2C_ACK_CHECK	;ACK CHECK, AMIT A SLAVE KÜLD A PIC FELE
	MOVLW	B'10101010'	;ÍRT REGISZTER CÍM DEKLARÁLÁS HIGH BYTE
	MOVWF	I2C_ADAT
	CALL	I2C_WRITE
;	CALL	I2C_ACK_CHECK
	CALL	I2C_STOPP	;A MESTER STOP OT KÜLD, JELEZVE VÉGE A SOROZATNAK
;GOTO	I2C_KULDES
CALL DELAY
I2C_FOGADAS:	
	CALL	I2C_STARTT	;
	MOVLW	B'10100000'	;MESTER ÍR SLAVE FELE (SLAVE CÍM 1010 000)
	MOVWF	I2C_ADAT	;CÍM  + READ (0. BIT =0) 	
	CALL	I2C_WRITE	;CONTROL BYTE KIKÜLDVE
;	CALL	I2C_ACK_CHECK	;ACK
	MOVLW	B'00000000'	;OLVASOTT REGISZTER CÍM DEKLARÁLÁS HIGH BYTE
	MOVWF	I2C_ADAT
	CALL	I2C_WRITE
;	CALL	I2C_ACK_CHECK	;ACK CHECK, AMIT A SLAVE KÜLD A PIC FELE
	
	CALL	I2C_RESTART	;CALL	I2C_RESTART
	MOVLW	B'10100001'	;MESTER OLVAS SLAVE TŐL (SLAVE CÍM: 1010 000)
	MOVWF	I2C_ADAT	;CÍM  + WRITE (0. BIT=1) PARANCS BYTE KIKÜLDVE
	CALL	I2C_WRITE
;	CALL	I2C_ACK_CHECK	;ACK CHECK, AMIT A SLAVE KÜLD A PIC FELE
	CALL	I2C_OLVAS	;
	MOVF	I2C_ADAT,W	;ELSŐ KIOLVASOTT ADAT MEGÉRKEZETT
	MOVWF	I2C_ADAT_H	;BEKERÜL AZ I2C_ADAT_H VÁLTOZÓBA
	CALL	I2C_SEND_NACK	;A MESTER MOST NACK -OT KÜLD, JELEZVE TÖBB OLVASÁSA NEM LESZ
	CALL	I2C_STOPP	;A MESTER STOP OT KÜLD, JELEZVE VÉGE A SOROZATNAK
;GOTO	I2C_KULDES
BANKSEL STATUS
	BCF		STATUS,Z
MOVF	I2C_ADAT_H,W
ANDLW	B'10101010'
	BTFSS	STATUS,Z
	GOTO	$+.5
	BANKSEL	PORTC
	BSF		PORTC,1
	GOTO	$-.0
	NOP
	BANKSEL	PORTC
	BSF		PORTC,0
	GOTO	$-.0

	


DELAY
	MOVLW	D'200'			;D'50'	
	MOVWF	0X7C		
RIDO2:	MOVLW	H'FF'			;D'256'	
	MOVWF	0X7D
RIDO1:	DECFSZ	0X7D,1			
	GOTO	RIDO1			;0X7D <> 0
	DECFSZ	0X7C,1
	GOTO	RIDO2			;0X7C <> 0
;	BSF	PORTC,0
RETURN


I2C_RESTART:
	BANKSEL	SSPCON2		; BANK1	
	BSF	SSPCON2,RSEN
	BTFSC	SSPCON2,RSEN	;UGRIK, HA 0
	GOTO	$-1		;HW TÖRLI AUTOMATIKUSAN. LÁSD REGISZTER LEIRASABAN.
	BANKSEL	SSPCON		; BANK0 
	RETURN

I2C_SEND_ACK:
	BANKSEL	SSPCON2		; BANK1	
	BCF	SSPCON2,ACKDT	;ACKEN BIT ALACSONYRA ÁLLÍTÁSÁVAL ACK JEL KERÜL KÜLDÉSRE 
	BSF	SSPCON2,ACKEN	;KIKÜLDI AZ ACK JELET 
	BTFSC	SSPCON2,ACKEN	;UGRIK, HA 0
	GOTO	$-1		;HW TÖRLI AUTOMATIKUSAN. LÁSD REGISZTER LEIRASABAN.
	BANKSEL	SSPCON		; BANK0
	RETURN	

I2C_SEND_NACK:
	BANKSEL	SSPCON2		; BANK1
	BSF	SSPCON2,ACKDT	;ACKEN BIT MAGASRA ÁLLÍTÁSÁVAL NACK JEL KERÜL KÜLDÉSRE 
	BSF	SSPCON2,ACKEN	;KIKÜLDI A NACK JELET 
	BTFSC	SSPCON2,ACKEN	;UGRIK, HA 0
	GOTO	$-1		;HW TÖRLI AUTOMATIKUSAN. LÁSD REGISZTER LEIRASABAN.	
	BANKSEL	SSPCON		; BANK0 
	RETURN	

I2C_OLVAS:	
	CALL	I2C_BUSYCONTROL	;ENÉLKÜL IS MŰKÖDik, DE AJÁNLOTTÁK HOZZÁ, ÍGY LEGYEN ITT
	BANKSEL	SSPCON2		; BANK1
	BSF	SSPCON2,RCEN	;ENGEDÉLY A VÉTELRE
	BTFSC 	SSPCON2,RCEN	;UGRIK, HA 0: OLVASÁS KÉSZ?
	GOTO	$-1	
	BANKSEL	SSPBUF		; BANK0		
	MOVF	SSPBUF,W
	MOVWF	I2C_ADAT	;VETT ADAT I2C_ADAT BAN	
	RETURN


I2C_STARTT:
	BANKSEL	SSPCON2		; BANK1	
	BSF	SSPCON2,SEN
	BTFSC	SSPCON2,SEN	;UGRIK, HA 0
	GOTO	$-1		;HW TÖRLI AUTOMATIKUSAN. LÁSD REGISZTER LEIRASABAN.
	BANKSEL	SSPCON		; BANK0 
	RETURN	


I2C_STOPP:
	BANKSEL	SSPCON2		; BANK1	
	BSF	SSPCON2,PEN
	BTFSC	SSPCON2,PEN	;UGRIK, HA 0
	GOTO	$-1		;HW TÖRLI AUTOMATIKUSAN. LÁSD REGISZTER LEIRASABAN.
	BANKSEL	SSPCON		; BANK0 
	RETURN	

I2C_ACK_CHECK:
	BANKSEL	SSPCON2		; BANK1
	BTFSC	SSPCON2,ACKSTAT	;UGRIK, HA 0
	GOTO	I2C_FAIL
	BANKSEL	SSPCON		; BANK0 
	RETURN	

I2C_FAIL:
	BANKSEL	PORTC
				;BSF	PORTC,I2C_FAULT
BSF		PORTC,2
	
	GOTO	$-0


I2C_WRITE:
	CALL	I2C_BUSYCONTROL	;ENÉLKÜL IS MŰKÖDik, DE AJÁNLOTTÁK HOZZÁ, ÍGY LEGYEN ITT
	BANKSEL	SSPBUF		; BANK0
	MOVF	I2C_ADAT,W	;I2C_ADAT BAN LÉVŐ ADAT W BE KERÜL
	MOVWF	SSPBUF		;KIKÜLDJÜK A W BEN LÉVŐ ADATOT
	BANKSEL	SSPSTAT		; BANK1
	BTFSC	SSPSTAT, R_W	;ÍRÁS KÉSZ?	
	GOTO	$-1		;  
	BANKSEL	SSPBUF		; BANK0	

	RETURN
	

		
I2C_BUSYCONTROL:	;ENÉLKÜL IS MŰKÖDik, DE AJÁNLOTTÁK HOZZÁ, ÍGY LEGYEN ITT
	BANKSEL	SSPSTAT		; BANK1
	BTFSC	SSPSTAT,R_W	;ADÁS VAN/NINCS FOLYAMATBAN?
	GOTO	$-1
	MOVF	SSPCON2,W	;SEN, RSEN, PEN, RCEN, ACKEN 
	ANDLW	H'1F'		;VALAMELYIKE FOLYAMATBEN VAN?
	BTFSS	STATUS,Z
	GOTO	$-5
	BANKSEL	SSPCON		; BANK0
	RETURN



	

	END
