 ; a föprogramban definiálj egy counter nevü változót
;
SDA	equ	4
SCL	equ	3
IICPort	equ	PORTC

#define	magas		bsf	IICPort,SDA
#define	alacsony	bcf	IICPort,SDA
#define	clkfel		bsf	IICPort,SCL
#define	clkle		bcf	IICPort,scl
#define get_ack		btfss	IICPort,SDA
#define	Bank0		bcf	STATUS,RP0
#define Bank1		bsf	STATUS,RP0

sub16
	banksel	PORTC
	



InitLCD
	call	Start
	movlw	d'116'
	call	WRI2C
	movlw	0
	call	WRI2C
	movlw	4
	call	WRI2C
	movlw	D'43'
	call	WRI2C
	movlw	D'12'
	call	WRI2C
	movlw	1
	call	WRI2C
	call	stop
	return
	

InitIIC
	banksel	PORTC
	movfw	IICPort
	andlw	0H
	movwf	IICPort
	banksel	TRISC
	bsf	IICPort,SDA	;az adatbit Tristate-be
	bsf	IICPort,SCL	;a clock bit tristate-be
	banksel	PORTC
	return

;a txt bufferben levő összes (16) karaktert kiküldi az első sorba
print1
	Call	Start
	movlw	D'116'	;slave addr
	call	WRI2C
	movlw	0
	Call	WRI2C
	movlw	D'132'	;az első sor első karakterére
	Call	WRI2C
	Call	Start
	movlw	D'116'	;slave addr
	call	WRI2C
	movlw	D'64'
	call	WRI2C	;karakter kiírás következik
	movlw	10H	;16 karaktert
	movwf	ccount
	movlw	buffer+0FH
	movwf	fsr
p1l	movf    INDF,W
	call	WRI2C		;W -> I2C
	decf	FSR,F
	decfsz	ccount,F
	goto	p1l
	Call	Stop
	return

;a txt bufferben levő összes (16) karaktert kiküldi a második sorba
print2

	Call	Start
	movlw	D'116'	;slave addr
	call	WRI2C
	movlw	0
	Call	WRI2C
	movlw	D'196'	;a második sor első karakterére
	call	WRI2C
	Call	Start
	movlw	D'116'	;slave addr
	call	WRI2C
	movlw	D'64'
	call	WRI2C	;karakter kiírás következik
	movlw	10H	;16 karaktert
	movwf	ccount
	movlw	buffer+0FH
	movwf	fsr
p2l	movf    INDF,W
	call	WRI2C		;W -> I2C bank0
	decf	FSR,F
	decfsz	ccount,F
	goto	p2l
	Call	Stop
	return

;a txt buffert feltölti 20H-al 
clrtxt
	banksel	PORTC
	movlw	10H	;16 karaktert
	movwf	counter
	movlw	buffer
	movwf	fsr
	movlw	20H
clr1	movwf  	INDF
	incf	FSR,F
	decfsz	counter,F
	goto	clr1
	return

;W regiszterben levő értékret kiküldi az IIC busra
;visszatérés Bank0-al
WRI2C
	banksel	TRISC
	movwf	I2CBuf
	movlw	8
	movwf	bcount		;kiküldendő bitek száma
	
WRloop	
	clkle
	call	delay5us
	rlf	I2CBuf,F
	alacsony
	btfsc	STATUS,C
	magas
	call	delay5us
	clkfel
	call	delay5us
	decfsz	Bcount, F
	goto	WRloop
	clkle
	call	delay5us
	clkfel
	magas
;get acknowagle
	clrf	Bcount
	Bank0
wr_ack
	call	delay5us
	get_ack
	goto	ACK_OK		
	decfsz	Bcount,F	
	goto	wr_ack
	return			;nem jött ACK 1.2 ms-ig
ACK_OK
	bank1
	clkle
	call	delay5us
	return

;byte küldés az i2c vége

Start
		banksel	TRISC
		magas			;az adatláb fel
		clkfel			; clock is high
		call	delay5us
		alacsony		;az adat vonalat lehuzni
		call	delay5us
		clkLe
		return

Stop
		banksel	TRISC
		alacsony
		call	delay5us
		clkfel
		call	delay5us
		magas
		call	delay5us
		return

delay5us
		nop
		return

;200ms-os késleltetés (pontosan 197.14ms)
;használva a bcount,ccount
delay200ms
		bank0
		clrf	ccount
		clrf	bcount	
d200		decfsz	ccount,F
		goto	d200
		decfsz	bcount,F
		goto	d200
		return
delay2sec
		call	delay200ms
		call	delay200ms
		call	delay200ms
		call	delay200ms
		call	delay200ms
		call	delay200ms
		call	delay200ms
		call	delay200ms
		call	delay200ms
		call	delay200ms
		return


