LIST P=16F887 
#INCLUDE <p16f887.inc> 
;---------------------------------------------------------------------
#define CIM 	B'01000000' 			; I2C cím
#define PUFFER	0x20			; puffer kezdőcíme
;---------------------------------------------------------------------
	RX_BUF		EQU 0x20		;RX_BUF 32 bájtos puffer
    INDEX       EQU	0x40		;puffer mutató
    TEMP		EQU	0x41
	TMP			EQU	0x42
	ERTEK		EQU	0x43
    W_TEMP		EQU	0x70    
	STATUS_TEMP	EQU	0x71
	FSR_TEMP	EQU	0x72
	PCL_TEMP	EQU	0x73
;---------------------------------------------------------------------
	ORG	0x00
	GOTO	INIT
;---------------------------------------------------------------------
	ORG	0x04
    MOVWF   W_TEMP    
    MOVF   	STATUS,W
    MOVWF   STATUS_TEMP
    MOVF    PCLATH,W
    MOVWF   PCL_TEMP
    MOVF    FSR,W
    MOVWF   FSR_TEMP
    BTFSS   PIR1,SSPIF
	GOTO	BUG
    BCF     PIR1,SSPIF
    CALL    IIC_KEZELES
    MOVF    FSR_TEMP,W
    MOVWF   FSR
    MOVF    PCL_TEMP,W
    MOVWF   PCLATH
    MOVF    STATUS_TEMP,W
    MOVWF   STATUS
    SWAPF   W_TEMP,F
    SWAPF   W_TEMP,W
    RETFIE
;---------------------------------------------------------------------
INIT
	BSF		STATUS,RP0
	MOVLW	B'01111111'
	MOVWF	OSCCON
    CLRF    TRISC
	BCF		STATUS,RP0		
	MOVLW   CIM
    MOVWF   SSPADD			;Eszköz címe
    CLRF    SSPSTAT
	BSF     PIE1,SSPIE		;megszakítás
    BCF		STATUS,RP0
    CLRF    PORTC
    CLRF    PIR1
    MOVLW   b'00100110'		;IIC slave mód 7bites cím  
    MOVWF   SSPCON			
    BSF     INTCON,PEIE
    BSF     INTCON,GIE
	CLRF    INDEX
;---------------------------------------------------------------------
MAIN
	BSF 	PORTC,5
	GOTO	MAIN
BUG
	BCF		PORTC,5
	RETFIE
;---------------------------------------------------------------------

;--------------------------------------------------------------------------------
;| 1: I2C írás, utolsó bájt cím volt.			      							|
;| SSPSTAT bits: S = 1, D_A = 0, R_W = 0, BF = 1								|
;|																				|
;| 2: I2C írás, utolsó bájt adat volt.		      						    	|
;| SSPSTAT bits: S = 1, D_A = 1, R_W = 0, BF = 1								|
;|																				|
;| 3: I2C olvasás, utolsó bájt cím volt.      									|
;| SSPSTAT bits: S = 1, D_A = 0, R_W = 1 (see Appendix C for more information)	|
;|																				|
;| 4: I2C olvasás, utolsó bájt adat volt.										|
;| SSPSTAT bits: S = 1, D_A = 1, R_W = 1, BF = 0								|
;|																				|
;| 5: I2C reset NACK mastertől.													|
;| SSPSTAT bits: S = 1, D_A = 1, BF = 0 										|
;|																				|
;--------------------------------------------------------------------------------
IIC_KEZELES
    BSF		STATUS,RP0
    MOVF    SSPSTAT,W   
    andlw   b'00101101' 		; SSPSTAT maszkolása D_A, S, R_W, BF bitekre.
	BCF		STATUS,RP0
    MOVWF   TEMP
IR_CIM
    MOVLW   b'00001001' 		; Start bit jött, SSPBUF tele?
    XORWF   TEMP,W
    BTFSS   STATUS,Z
    GOTO    IR_ADAT
	CLRF	ERTEK
	CALL	FELTOLT
    CLRF    INDEX
    MOVF    SSPBUF,W
    RETURN
IR_ADAT
    MOVLW   b'00101001' 		; Adat bájt jött,start bit jött,SSPBUF tele?
    XORWF   TEMP,W
    BTFSS   STATUS,Z
    GOTO    OLVAS_CIM
    CALL	OFFSET
    MOVF    SSPBUF,W
    MOVWF   INDF        		; Bejött adat írása pufferbe
    INCF    INDEX,F				; Mutató növelése
    MOVF    INDEX,W
    SUBLW   PUFFER				; Ha a mutató = a puffer méretével ->puffer megtelt
    BTFSC   STATUS,Z
    CLRF    INDEX				; Mutató törlése
    RETURN
OLVAS_CIM
    MOVF    TEMP,W ;
    ANDLW   b'00101100'
    XORLW   b'00001100'			;Start bit jött,olvasás bit jött?
    BTFSS   STATUS,Z
    GOTO    OLVAS_ADAT
    CLRF    INDEX				; Index a puffer elejére
    CALL	OFFSET 
    MOVF    INDF,W				; Puffer olvasása
    CALL    I2C_IRAS			; Küldés
    INCF    INDEX,F
    RETURN
OLVAS_ADAT
    BTFSC   SSPCON,CKP
    GOTO    NACK
    MOVLW   b'00101100'			; Utolsó bájt adat volt, SSPBUF üres?
    XORWF   TEMP,W
    BTFSS   STATUS,Z
    GOTO    NACK
    MOVF    INDEX,W
    SUBLW   PUFFER
    BTFSC   STATUS,Z
    CALL	OFFSET
    MOVF    INDF,W
    CALL    I2C_IRAS
    INCF    INDEX,F
    RETURN
NACK
    MOVF    TEMP,W
    ANDLW   b'00101000' 		; Adat küldéskor NACK érkezett a masterttől
    XORLW   b'00101000'
    BTFSS   STATUS,Z
    GOTO	I2CERR
    RETURN
;---------------------------------------------------------------------
; Rutinok
;---------------------------------------------------------------------
I2CERR 
	NOP
    BSF     PORTC,7     		; Hibajelzés, amíg a WDT nem resetel
    GOTO    $-1
    RETURN

I2C_IRAS
    BSF		STATUS,RP0
    BTFSC   SSPSTAT,BF			; Várakozás, míg SSPBUF tele
    GOTO    $-1
    BCF		STATUS,RP0
    BCF     SSPCON,WCOL			;
    MOVWF   SSPBUF
    BTFSC   SSPCON,WCOL
    GOTO    $-3					; Adás folyamatban?
    BSF     SSPCON,CKP
    RETURN

OFFSET   
    MOVLW  	PUFFER
    MOVWF   FSR
    MOVF    INDEX,W
    ADDWF   FSR,F				;FSR=puffer kezdőcím + puffer mutató értéke
    RETURN

FELTOLT
	MOVLW	d'32'				;puffer méret
	MOVWF	TMP
	MOVLW	PUFFER				;puffer kezdete
	MOVWF	FSR
	MOVF	ERTEK,W
	MOVWF	INDF
	INCF	FSR,F
	DECFSZ	TMP,F
	GOTO	$-4
	RETURN

END