Saturday, 6 December 2014

sbit scl=P3^0;
sbit sda=P3^1;
void i2c_start(void);
void i2c_write(unsigned char dat);
void i2c_ack(void);
void i2c_stop(void);
unsigned char i2c_read(void);
void i2c_noack(void);
void i2c_device_write(unsigned char sa, unsigned char addr,unsigned char dat);
unsigned char i2c_device_read(unsigned char sa,unsigned char dat);
///////////////////////////////////////////////////////
void i2c_start(void)
{
scl=1;
sda=1;
sda=0;
}

void i2c_write(unsigned char dat)
{
unsigned char i;
	for(i=0;i<=7;i++)
	{
	scl=0;
	sda=(dat&(0x80>>i))?1:0;
	scl=1;
	}
}

void i2c_ack(void)
{
scl=0;
sda=1;
scl=1;
scl=0;
}

void i2c_stop(void)
{
scl=0;
sda=0;
scl=1;
sda=1;
}

void i2c_device_write(unsigned char sa,unsigned char addr,unsigned char dat)
{
i2c_start();
i2c_write(sa);
i2c_ack();
i2c_write(addr);
i2c_ack();
i2c_write(dat);
i2c_ack();
i2c_stop();
//delay_ms(9);
}

unsigned char i2c_read(void)
{
unsigned char buff=0x00,i;
sda=1;
	for(i=0;i<=7;i++)
	{
	scl=1;
	if(sda)
	buff=buff|(0x80>>i);
	scl=0;
	}
	return buff;
}

void i2c_noack()
{
scl=0;
sda=1;
scl=1;
}

unsigned char i2c_device_read(unsigned char sa,unsigned char addr)
{
unsigned char buff;
i2c_start();
i2c_write(sa);
i2c_ack();
i2c_write(addr);
i2c_ack();
i2c_start();
i2c_write(sa|1);
i2c_ack();
buff=i2c_read();
i2c_noack();
i2c_stop();
return buff;
}

i2cdriver.c
#include<reg51.h>
#include"i2c.h"
char t _at_ 0x30;
main()
{
i2c_device_write(0xa0,0x00,'U');
t=i2c_device_read(0xa0,0x00);
while(1);
}