;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

		cblock 070
		i2c_data
		wait_cnt
		bit_cnt
		endc

	org		0

init
	BANKSEL	TRISC
	MOVLW	0X00
	MOVWF	TRISC
	BANKSEL	PORTC
	MOVLW	0X00
	MOVWF	PORTC

i2c_main
	CALL 	i2c_start		;start feltétel
	;--------------------------------------------------
	MOVLW	0XA0 			;chip cím | 1010000 rw 0
	MOVWF	i2c_data
	CALL	i2c_byte_send
	CALL	i2c_ack
	;--------------------------------------------------
	MOVLW	0X00			;cím eleje (High byte)
	MOVWF	i2c_data
	CALL	i2c_byte_send
	CALL	i2c_ack
	;--------------------------------------------------
	MOVLW	0X00			;cím 2. rész (Low byte)
	MOVWF	i2c_data
	CALL	i2c_byte_send
	CALL	i2c_ack
	;--------------------------------------------------
	MOVLW	0XEE			;adat
	MOVWF	i2c_data
	CALL	i2c_byte_send
	CALL	i2c_ack
	;--------------------------------------------------
	;következő adat.
	;--------------------------------------------------
	CALL	i2c_stop		;vége
	;--------------------------------------------------
	GOTO $

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		;1. forgatás balra hogy a 7. bit carry-be kerüljön
bit_send
	incf	bit_cnt
	rlf		i2c_data
	BTFSS	i2c_data,0
	BCF		SDA
	BTFSC	i2c_data,0
	BSF		SDA
	CALL	i2c_cpulse
	btfss	bit_cnt,3
	goto	bit_send
	RETURN

i2c_cpulse					;órajel impulzus
	BSF		SCL	
	BCF		SCL
	RETURN

d5us						;5 us várakozás										
	MOVLW	0X08						
	MOVWF 	wait_cnt				
loop						
	DECFSZ 	wait_cnt, F					
	GOTO 	loop		
	RETURN	

END