Assembly Implementation

As discussed earler, we can implement I2C by bit-banging on 8051 using any two pins. Here in implementation below we have used P0.0 for SDA (serial data) and P0.1 for SCL (serial clock).

;***************************************
;Ports Used for I2C Communication
;***************************************
	sda equ P0.0
	scl equ P0.1

;***************************************
;Initializing I2C Bus Communication
;***************************************
i2cinit:
	setb sda
	setb scl
	ret

;****************************************
;ReStart Condition for I2C Communication
;****************************************
rstart:
	clr scl
	setb sda
	setb scl
	clr sda
	ret

;****************************************
;Start Condition for I2C Communication
;****************************************
startc:
	setb scl
	clr sda
	clr scl
	ret

;*****************************************
;Stop Condition For I2C Bus
;*****************************************
stop:
	clr scl
	clr sda
	setb scl
	setb sda
	ret

;*****************************************
;Sending Data to slave on I2C bus
;*****************************************
send:
	mov r7,#08
back:
	clr scl
	rlc a
	mov sda,c
	setb scl
	djnz r7,back
	clr scl
	setb sda
	ret

;*****************************************
;ACK and NAK for I2C Bus
;*****************************************
ack:
	clr sda
	setb scl
	clr scl
	setb sda
	ret

nak:
	setb sda
	setb scl
	clr scl
	setb scl
	ret

;*****************************************
;Receiving Data from slave on I2C bus
;*****************************************
recv:
	mov r7,#08
back2:
	clr scl
	setb scl
	mov c,sda
	rlc a
	djnz r7,back2
	clr scl
	setb sda
	ret
		

C Implementation

#define SDA P0_0
#define SCL P0_1

void I2CInit(){
	SDA = 1;
	SCL = 1;
}

void I2CStart(){
	SCL = 1;
	SDA = 0;
	SCL = 0;
}

void I2CRestart(){
	SDA = 1;
	SCL = 1;
	SDA = 0;
}

void I2CStop(){
	SDA = 0;
	SCL = 1;
	SDA = 1;
}

void I2CAck(){
	SDA = 0;
	SCL = 1;
	SCL = 0;
}

void I2CNak(){
	SDA = 1;
	SCL = 1;
	SCL = 0;
}

unsigned char I2CSend(unsigned char Data){
	 unsigned char i, ack_bit;
	 for(i=0;i<8;i++){
	 	SCL = 0;
		if ((Data & 0x80) == 0)
			SDA = 0;
		else
			SDA = 1;
		SCL = 1;
		Data<<=1;
	 }
	 SCL = 0;
	 ack_bit = SDA;
	 SCL = 1;
	 SCL = 0;
	 return !ack_bit;
}

unsigned char I2CRead(){
	unsigned char i, Data=0;
	for(i=0;i<8;i++){
		SCL = 0;
		SCL = 1;
		if(SDA)
			Data |=1;
		if(i<7)
			Data<<=1;
	}
	SCL = 0;
	SDA = 1;
	return Data;
}
		

Using the above implementation is really easy, next part uses an example of interfacing DS1307 with AT89C51 to read RTC registers (0x00 to 0x07).

Conversation

Fri Jan 23 2015, 04:29 AM
lolokijuh
DJ Bakal tulungan mo ako s IC Tester
Fri Jan 23 2015, 04:29 AM
lolokijuh
sir help about IC Tester
Fri Jan 23 2015, 04:28 AM
lolokijuh
sir help me
Thu Jan 22 2015, 08:27 PM
1
-1'
Thu Jan 22 2015, 08:27 PM
1
1
Thu Jan 22 2015, 01:59 PM
apparao majji
could you please help in programming
Thu Jan 22 2015, 10:13 AM
avianash
hi my account is inactive plz help me
gaurav.k
Thu Jan 22 2015, 07:04 AM
not able top post any reply from my login... after pressing "post Reply "it takes me to a blank page
Thu Jan 22 2015, 04:06 AM
frankie
friend, that modification should be done in the program so that led up and down oscillation is one blink, thanks
Wed Jan 21 2015, 07:16 PM
1
-1'

Downloads

Comments

nawfel
Sat Jan 17 2015, 07:27 AM
Rohi123
Sat Jan 10 2015, 11:00 AM
safakarici
Fri Jan 09 2015, 08:55 PM
Nikita_Pinjare
Thu Jan 08 2015, 03:10 PM
mayank058
Wed Jan 07 2015, 05:43 AM
Overeating
Tue Jan 06 2015, 05:56 AM
trancebreaker11
Sun Jan 04 2015, 07:42 AM
akash474001
Thu Jan 01 2015, 05:49 AM

Online

Guests: 40, Members: 0 ...

most ever online: 182184
(Members: , Guests: 182184) on 06 Aug 2010: 05:37 AM

Members: 37573
Newest member: nawfel
Forum Activity
mayank058 Avatar
Posted By mayank058
Thu Jan 22 2015, 12:16 PM
dear sir, Now i want to generate a si...
mayank058 Avatar
Posted By mayank058
Tue Jan 20 2015, 06:40 AM
dear sir, Now its working properly. Th...
ajay_bhargav Avatar
Posted By ajay_bhargav
Tue Jan 20 2015, 04:36 AM
ajay_bhargav Avatar
Posted By ajay_bhargav
Tue Jan 20 2015, 04:35 AM
I found another issue with your code:calling PWMIn...
mayank058 Avatar
Posted By mayank058
Mon Jan 19 2015, 05:47 AM
dear sir, Please do it for me..
PsySc0rpi0n Avatar
Posted By PsySc0rpi0n
Sun Jan 18 2015, 08:23 PM
But it's a way to debug to consider to the future ...
ajay_bhargav Avatar
Posted By ajay_bhargav
Sun Jan 18 2015, 06:04 AM
I remember i created small library for lpc23xx ser...
ajay_bhargav Avatar
Posted By ajay_bhargav
Sun Jan 18 2015, 06:00 AM
It's obviously a personal choice. Digging into map...
ajay_bhargav Avatar
Posted By ajay_bhargav
Sun Jan 18 2015, 05:58 AM
@karan123 I suggest you to create a new thread for...
mayank058 Avatar
Posted By mayank058
Fri Jan 16 2015, 06:55 AM
dear sir, I used all these methods.. w...