	LIST P=16F877A
	#INCLUDE "P16F877A.INC"

	CBLOCK 0X20
I2C_ADAT
I2C_ADAT_H
	ENDC

	__CONFIG _CP_OFF &_CPD_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _LVP_OFF


#DEFINE FOSC	D'16000'
#DEFINE BAUD	D'100'
#DEFINE I2C_SCL	3
#DEFINE	I2C_SDA	4
;#DEFINE I2C_FAULT	0




	ORG	0X00
	GOTO	SETUP_I_O

	
	ORG	0X04

	retfie



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		; Bank0
	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

	banksel	PIR1		; Bank0
	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

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)
							;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

	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

	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) 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
	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) 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
	BANKSEL I2C_ADAT_H		; Bank0
	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 I2C_ADAT_H		; Bank0
	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:
    bcf     PIR1,SSPIF      ; Clear SSP interrupt flag
	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
	goto	I2C_wait

I2C_SEND_ACK:
    bcf     PIR1,SSPIF      ; Clear SSP interrupt flag
	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	
	goto	I2C_wait

I2C_SEND_NACK:
    bcf     PIR1,SSPIF      ; Clear SSP interrupt flag
	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	
	goto	I2C_wait

I2C_OLVAS:	
	CALL	I2C_BUSYCONTROL	;ENÉLKÜL IS MŰKÖDik, DE AJÁNLOTTÁK HOZZÁ, ÍGY LEGYEN ITT
    bcf     PIR1,SSPIF      ; Clear SSP interrupt flag
	BANKSEL	SSPCON2			; BANK1
	BSF		SSPCON2,RCEN	;ENGEDÉLY A VÉTELRE
;	BTFSC 	SSPCON2,RCEN	;UGRIK, HA 0: OLVASÁS KÉSZ?
;	GOTO	$-1	
	call	I2C_wait

	BANKSEL	SSPBUF			; BANK0		
	MOVF	SSPBUF,W
;	MOVWF	I2C_ADAT		;VETT ADAT I2C_ADAT BAN	
	RETURN


I2C_STARTT:
    bcf     PIR1,SSPIF      ; Clear SSP interrupt flag
	BANKSEL	SSPCON2			; BANK1	
	BSF		SSPCON2,SEN
;	BTFSC	SSPCON2,SEN		;UGRIK, HA 0
;	GOTO	$-1				;HW TÖRLI AUTOMATIKUSAN. LÁSD REGISZTER LEIRASABAN.

I2C_wait
	BANKSEL	PIR1			; BANK0 
	btfss   PIR1,SSPIF		; Check if operation completed
	goto    I2C_wait		; If not, keep checking

	RETURN	


I2C_STOPP:
    bcf     PIR1,SSPIF      ; Clear SSP interrupt flag
	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	
	goto	I2C_wait

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:
	MOVWF	I2C_ADAT		; 	
	CALL	I2C_BUSYCONTROL	;ENÉLKÜL IS MŰKÖDik, DE AJÁNLOTTÁK HOZZÁ, ÍGY LEGYEN ITT
	BANKSEL	SSPBUF			; BANK0
    bcf     PIR1,SSPIF      ; Clear SSP interrupt flag
	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	

	goto	I2C_wait	

		
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
