	LIST P=16F877A, R=DEC
	#include <p16f877a.inc>

	__config _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC & _DEBUG_OFF & _CPD_OFF & _LVP_OFF  

	Datenpuffer	equ	32
	org 0x00
	goto begin

	org 0x04
        		retfie
	org 0x08
begin
	banksel	TRISB
	movlw	b'00000000'	;nastaveni PORTB jako vystup
	movwf	TRISB
	banksel	PORTB
    	bsf     	STATUS, RP0         ; Bank 1
    	movlw   	B'00011000'         ; RC3,4 inputs
    	iorwf   	TRISC, f            ; + RC2=CCP1 output
    	bcf     	STATUS, RP0         ; Bank 0 
cyklus
	movlw	b'00000001'
	movwf	PORTB
	movf	PORTB
	movwf	Datenpuffer
;*************************************************************************
;*************************************************************************
;inicializace I2C
	MOVLW		b'00101000'		; nastaveni registru SSPCON
	MOVWF		SSPCON
	BSF		STATUS,RP0		; banka 1
	MOVLW		b'10000000'		; nastaveni registru SSPSTAT
	MOVWF		SSPSTAT
	MOVLW		10			; (Fosc / (4 * prenosova rychlost)) - 1
	MOVWF		SSPADD
	BCF		STATUS,RP0		; banka 0
;*************************************************************************
;**Schreibe Wert 5 auf Speicher-Adresse 3 in 24C04*************
        call    i2c_on          ; Bus aktiv

        movlw   H'A0'           ; 1010 0000
        call    i2c_tx          ; 24C04 zum Schreiben adressieren

        movlw   0x00            ; high Teil der Adresse (Page)
        call    i2c_tx
        movlw   0x03            ; low Teil der  Adresse
        call    i2c_tx

   ;     movlw   0x05            ; Wert der auf Adresse 3 soll
        movlw   b'00001100'            ; Wert der auf Adresse 3 soll
        call    i2c_tx

        call    i2c_off         ; Bus freigeben
; Fertig. Nun beginnt im EEPROM ein Lösch-Schreib-Zyklus
; mit dem der Wert 5 in die EEPROM-Zelle 3 geschrieben wird.
; Das wird etwa 10 ms dauern. Solange ist der 24C04 nicht ansprechbar.
;
        ....                    ; das Programm geht dann irgentwie weiter

;nyní zacne v EEPROM Hasici-psaci-cyklus s hodnotou 5 v EEPROM-buňce bude 
;zapsána.To bude 10 ms trvat.Pokud není 24C04 detekována.Program pokračuje dál.
 
;*************************************************************************
;*************************************************************************
;čtení I2C
;**Stelle EEPROM auf Speicher-Adresse 3 ein*************
        call    i2c_on          ; Bus aktiv

        movlw   H'A0'           ; 1010 0000
        call    i2c_tx          ; 24C04 zum Schreiben adressieren

        movlw   0x00            ; high Teil der Adresse
        call    i2c_tx
        movlw   0x03            ; low Teil der  Adresse
        call    i2c_tx

        call    i2c_off         ; Bus freigeben 
;**Lesen des aktuellen Bytes aus 24C04*************
        call    i2c_on          ; Bus aktiv

        movlw   H'A1'           ; 1010 0001
        call    i2c_tx          ; 24C04 zum Lesen adressieren

        call    i2c_rx
        movfw   SSPBUF          ; I2C Empfangsregister auslesen
        movwf   PORTB     	  ; Byte in Speicherzelle Datenpuffer retten
        call    i2c_off         ; Bus freigeben



;*************************************************************************

;***I2C UNTERPROGRAMME************************************************************
;
; I2C-Bus im Master-Mode übernehmen
i2c_on  bcf     PIR1, SSPIF     ; SSPIF Bit löschen
        bsf     STATUS, RP0
        bsf     SSPCON2, SEN    ; Bus Übernahme anweisen
        bcf     STATUS, RP0
        goto    i2c_warte

; ein Byte aus W senden
i2c_tx
        movwf   SSPBUF          ; -> zum I2C-Slave übertragen
        goto    i2c_warte

;ein Byte vom Slave empfangen (nach SSPBUF)
i2c_rx
        bsf     STATUS, RP0
        bsf     SSPCON2, RCEN   ; Daten Empfang einschalten
        bcf     STATUS, RP0
        goto    i2c_warte

; I2C-Bus wieder freigeben
i2c_off
        bsf     STATUS, RP0
        bsf     SSPCON2, PEN    ; Bus Freigabe anweisen
        bcf     STATUS, RP0

i2c_warte
        btfss   PIR1, SSPIF     ; fertig?
        goto    i2c_warte       ; nein, noch nicht
        bcf     PIR1, SSPIF     ; ja, alles fertig, nun noch SSPIF zurücksetzen
        return

;***ENDE UNTERPROGRAMME**********************************************************

	end