	list		p=16F887, w=-302
	include		<P16F887.INC>
	__config	_CONFIG1,0xE0E4
	__config	_CONFIG2,0xF8FF

	#define bSCL	3
	#define bSDA	4

		org		0

init
		BANKSEL	TRISC
		movlw	(1 << bSCL) | (1 << bSDA)
		movwf	TRISC
		CLRF	TRISD
		BANKSEL PORTD
		CLRF	PORTD



init_i2c
		BANKSEL	SSPSTAT
		MOVLW	B'10000000'			;100 kHz,
		MOVWF	SSPSTAT
		MOVLW	0x31				;20MHz --> 100kHz | 20000/(4*100)-1
		MOVWF	SSPADD
		clrf	SSPCON2
		BANKSEL	SSPCON
		MOVLW	B'00101000'			;PORTC SCL, SDA I2C LÁBAK, MASTER MODE
		MOVWF	SSPCON
		BCF		PIE1,SSPIE
		BCF		INTCON,PEIE
		BCF		INTCON,GIE
		BCF		PIR1,SSPIF			;INTERUPT JELZŐBIT TÖRLÉSE, HOGY BIZTOS MŰKÖDJÖN: START/STROP/ACK
		BANKSEL	SSPCON


I2CByteWrite
	    call    I2CBSTART           ; start i2c
	    movlw   0xA0				; cím, rw bit 0 - A szimulátorban a chip címe 1010 000-ra lett állítva
    	call    I2CTX               ; küldés
		;----------------
		movlw	0x00				; cím
	    call    I2CTX
		movlw	0x00				; cím
	    call    I2CTX
		;----------------
		movlw	0xEE				; adat
    	call    I2CTX               ; küldés
	   	call    I2CBSTOP            ; stop

I2CByteRead
	    call    I2CBSTART           ; start i2c
	    movlw   0xA0				; cím, rw bit 0 - A szimulátorban a chip címe 1010 000-ra lett állítva
    	call    I2CTX               ; küldés
		;----------------
		movlw	0x00				; cím
	    call    I2CTX
		movlw	0x00				; cím
	    call    I2CTX
		;----------------

	    bcf     PIR1,SSPIF			; Clear SSP interrupt flag
	    bsf     STATUS,RP0			; Select Bank1
	    bsf     SSPCON2,RSEN		; restart i2c
		call	I2Cbstop_wait0

	    movlw   0xA1				; cím, rw bit 1 - A szimulátorban a chip címe 1010 000-ra lett állítva
    	call    I2CTX				; küldés

									; Read data byte
    	bcf     PIR1,SSPIF			; Clear SSP interrupt flag
    	bsf     STATUS,RP0			; Select Bank1
    	bsf     SSPCON2,ACKDT		; Select to send NO ACK bit
    	bsf     SSPCON2,RCEN		; Initiate reception of byte

		call	I2Cbstop_wait0		; Wait for oparation completed

    	movf    SSPBUF,W			; Copy byte to WREG

    	bcf     PIR1,SSPIF			; Clear SSP interrupt flag
    	bsf     STATUS,RP0			; Select Bank1
    	bsf     SSPCON2,ACKEN		; Generate ACK/NO ACK bit

		call	I2Cbstop_wait0		; Wait for oparation completed

		movwf	PORTD

		goto	I2CByteWrite



I2CTX
	    bcf		PIR1,SSPIF          ; Clear SSP interrupt flag
    	movwf	SSPBUF              ; Write byte out to device

I2Cbstop_wait0						; Wait for oparation completed
	    bcf     STATUS,RP0          ; Select Bank 00
bstop_wait
	    btfss   PIR1,SSPIF          ; Check if operation completed
	    goto    bstop_wait          ; If not, keep checking
    	return


I2CBSTART
	    bcf     STATUS,RP1          ; Select Bank 0x
	    bcf     STATUS,RP0          ; Select Bank 00
	    bcf     PIR1,SSPIF          ; Clear SSP interrupt flag
	    bsf     STATUS,RP0          ; Select Bank 01
	    bsf     SSPCON2,SEN         ; Generate Start condition
		goto	I2Cbstop_wait0

I2CBSTOP
	    bcf     PIR1,SSPIF          ; Clear SSP interrupt flag
	    bsf     STATUS,RP0          ; Select Bank 01
	    bsf     SSPCON2,PEN         ; Generate Stop condition
		goto	I2Cbstop_wait0

END