适合EEPROM存储和PCF8591A/D-D/A转换等。。
/*************************************************************************************
**************
**************************************************************************************/
#ifndef __I2C_H__
#define __I2C_H__
#include "I2C.h"
#define uchar unsigned char
#define uint unsigned int
sbit SCL = P2^1;
sbit SDA = P2^0;
//void delay()
//{;;}
void I2C_start()
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
//
void I2C_stop()
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
//
void I2C_respons()
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250))i++;
SCL=0;
delay();
}
//
void I2C_init()
{
SDA=1;
delay();
SCL=1;
delay();
}
uchar I2C_read_byte()
{
uchar i,k;
SCL=0;
delay();
SDA=1;
delay();
for(i=0;i<8;i++)
{
SCL=1;
delay();
k=(k<<1)|SDA;
SCL=0;
delay();
}
return k;
}
//
void I2C_write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
SCL=0;
delay();
}
SDA=1;
delay();
}
//
void I2C_write_process(uchar addr,uchar cmd,uchar dat)
{
I2C_start();
I2C_write_byte(addr);
I2C_respons();
I2C_write_byte(cmd);
I2C_respons();
I2C_write_byte(dat);
I2C_respons();
I2C_stop();
}
//
uint I2C_read_process(uchar addr,uchar cmd)
{
uint date;
I2C_start();
I2C_write_byte(addr);
I2C_respons();
I2C_write_byte(cmd);
I2C_respons();
I2C_start();
I2C_write_byte(addr+1);
I2C_respons();
date = I2C_read_byte();
I2C_respons();
I2C_stop();
return date;
}
#endif