; Definiëren van de gebruikte symbolen SCL bit P1.0 ; SCL Bus SDA bit P1.1 ; SDA Bus IADDR equ R0 ; Adres Byte IBYTE equ R1 ; Data Byte CSEG AT 8000H ; PLAATS HIER UW CODE ; ********************************************************************* ; I²C routine bibliotheek ; ; functie GETBYTE : verkrijg een byte naar een I²C bus device ; functie SENDBYTE : stuur een byte naar een I²C bus device ; ********************************************************************* ; SENDBYTE: ; * STUUR DATA OP DE LIJN * CALL START ; genereer een i²c startconditie MOV A,IADDR ; laad het device startadres in CALL WRBYT ; stuur het device adres op de bus CALL ACK ; wacht op een bevestiging v/d slave MOV A,IBYTE ; laad de te schrijven byte in CALL WRBYT ; stuur de databyte op de bus CALL ACK ; wacht op een bevestiging v/d slave CALL STOP ; genereer een I²C stopconditie RET ; verlaat de subroutine GETBYTE: ; * VERKRIJG DATA VAN DE LIJN * call start ; genereer een i²C startconditie mov a,IADDR ; laad het device startadres in xrl a,#00000001B ; stel de i²c schrijfmode in call wrbyt ; stuur het device adres op de bus call ack ; wacht op een bevestiging v/d slave call rdbyt ; lees de byte die de slave terug stuurt call nack ; stuur een acknowledge bericht terug call stop ; stop de bus ret ; verlaat de subroutine ; <--------------------------- I²C subroutines ------------------------> wrbyt: clr c ; wis de carry bit mov R5,#08h ; zet 08 in de count variabele (aantal bits) loopo: rlc a ; plaats de MSB v/d accu in de carry mov sda,c ; zet de te schrijven bit op de DATA lijn call clock ; genereer de klokpuls djnz R5,loopo ; verwerk de volgende bit ret ; verlaat de subroutine rdbyt: clr c ; wis de carry bit setb sda ; maak de datalijn hoog mov R5,#08H ; zet 08 in de count variabele (aantal bits) loopi: call clock ; genereer een klokpuls (sda komt in carry) rlc a ; schuif de accu op (carry in de MSB) djnz R5,loopi ; herhaal dit 8 keer (8 bits inlezen) ret ; verlaat de subroutine nack: setb sda ; maak de datalijn hoog call clock ; genereer een klokpuls ret ; verlaat de subroutine delay: nop ; wacht 1 µs nop ; wacht 1 µs nop ; wacht 1 µs nop ; wacht 1 µs RET ; verlaat de subroutine stop: clr sda ; wis de serial data setb scl ; zet de serial clock call delay ; vertraag de lijn voor 4 µs setb sda ; set de serial data ret ; verlaat de subroutine start: setb sda ; zet de serial data setb scl ; zet de serial clock call delay ; vertraag de lijn voor 4 µs clr sda ; wis de serial data call delay ; vertraag de lijn voor 4 µs clr scl ; maak de serial clock laag ret ; verlaat de subroutine ack: setb scl ; zet de serial clock call delay ; wacht 4 µs jnb scl,$ ; wacht tot de serial clock = 1 setb sda ; maak de serial data hoog nop ; wacht 1 µs jnb sda,endack ; verlaat de routine als de serial data = 1 jb sda,$ ; wacht tot de serial data = 1 endack: clr scl ; wis de kloklijn ret ; verlaat de subroutine clock: setb scl ; maak de clocklijn hoog call delay ; wacht 4 µs mov c,sda ; plaats de status van SDA in de carry clr scl ; wis de clocklijn ret ; verlaat de subroutine end