;i2c írás / 24c64 eeprom


	list		p=16F887, w=-302
	include		<P16F887.INC>
	__config	_CONFIG1,0xE0E4
	__config	_CONFIG2,0xF8FF

		#define SCL		PORTC,3
		#define SDA		PORTC,4
		#define bSCL	TRISC,3
		#define bSDA	TRISC,4

		cblock 070
		i2c_data_out
		wait_cnt
		bit_cnt
		endc

	CBLOCK	0X7E
	i2c_data_in
	ENDC
	org		0

init
	BANKSEL	TRISC
	MOVLW	0X00
	MOVWF	TRISC
	MOVWF	TRISD

	BANKSEL	PORTC
	MOVLW	0X00
	MOVWF	PORTC
	MOVWF	PORTD

i2c_main
	CALL 	i2c_start		;start feltétel
	;--------------------------------------------------
	MOVLW	0XA0 			;chip cím | 1010000 rw 0
	MOVWF	i2c_data_out
	CALL	i2c_byte_send
	CALL	i2c_ack
	;--------------------------------------------------
	MOVLW	0X00			;cím eleje (High byte)
	MOVWF	i2c_data_out
	CALL	i2c_byte_send
	CALL	i2c_ack
	;--------------------------------------------------
	MOVLW	0X00			;cím 2. rész (Low byte)
	MOVWF	i2c_data_out
	CALL	i2c_byte_send
	CALL	i2c_ack
	;--------------------------------------------------
	CALL 	i2c_start		;start feltétel
	;--------------------------------------------------
	MOVLW	0XA1 			;chip cím | 1010000 rw 0
	MOVWF	i2c_data_out
	CALL	i2c_byte_send
	CALL	i2c_ack
	;--------------------------------------------------
	call	sda_in_funk
	call	i2c_byte_recive ;adatfogadás
	call	sda_out_funk
	CALL	i2c_stop		;vége
	;--------------------------------------------------
	MOVFW	i2c_data_in
	MOVWF	PORTD
	GOTO $

i2c_byte_recive 
	movlw	0x00
	movwf	bit_cnt
bit_recive
	incf	bit_cnt
	CALL 	i2c_cpulse_2		;órajel fent a végén, ekkor lehet olvasni az adatvonalat
	BTFSS	SDA
	BCF		i2c_data_in,0
	BTFSC	SDA
	BSF		i2c_data_in,0
	RLF		i2c_data_in,1
	btfss	bit_cnt,3
	GOTO	bit_recive
	RRF		i2c_data_in			;visszaforgatás mert "túlforgat" amikor átjött a 8.ik bit
	call	i2c_ack
	bcf		SDA					;adatvonal le
	RETURN


sda_in_funk
	BANKSEL	TRISC
	BSF	bSDA
	BANKSEL	PORTC
	RETURN

sda_out_funk
	BANKSEL	TRISC
	BCF	bSDA
	BANKSEL	PORTC
	RETURN

i2c_stop					;stop feltétel
	BSF		SCL
	BSF		SDA
	GOTO	d5us
	RETURN

i2c_start					;start feltétel
	BCF		SCL
	BSF		SDA
	BSF		SCL
	BCF		SDA
	BCF		SCL
	RETURN
	
i2c_ack						;adatvonal le és egy órajel generálás
	BCF		SDA	
	CALL	i2c_cpulse
	RETURN

i2c_byte_send				;adatküldés i2c vonalon
	movlw	0x00
	movwf	bit_cnt
	rlf		i2c_data_out		;1. forgatás balra hogy a 7. bit carry-be kerüljön
bit_send
	incf	bit_cnt
	rlf		i2c_data_out
	BTFSS	i2c_data_out,0
	BCF		SDA
	BTFSC	i2c_data_out,0
	BSF		SDA
	CALL	i2c_cpulse			;órjel lent a végén az adatvonal módosításához
	btfss	bit_cnt,3
	goto	bit_send
	RETURN

i2c_cpulse					;órajel impulzus
	BSF		SCL	
	BCF		SCL
	RETURN

i2c_cpulse_2
	BCF		SCL	
	BSF		SCL
	RETURN

d5us						;5 us várakozás										
	MOVLW	0X08						
	MOVWF 	wait_cnt				
loop						
	DECFSZ 	wait_cnt, F					
	GOTO 	loop		
	RETURN	

END