#include "REG52.H"
#include "intrins.h"
#include "ABSACC.h"
#define HIGH 1
#define LOW 0
sbit SCL= P1^3;
sbit SDA= P1^4;
static void delay(void)
{
unsigned char i;
for(i=0;i<200;i++) _nop_() ;
}
static void I2C_Start(void)
{
SDA=HIGH;SCL=HIGH;delay();
SDA=LOW;delay();SCL=LOW;
}
static void I2C_Stop(void)
{
SDA=LOW;SCL=HIGH;delay();
SDA=HIGH;delay();SDA=LOW;
SCL=LOW;
}
static void I2C_Mack(void)
{
SDA=LOW;SCL=HIGH;delay();
SCL=LOW;SDA=HIGH;
}
static void I2C_Mnack(void)
{
SDA=HIGH;SCL=HIGH;delay();
SCL=LOW;
}
static bit I2C_Cack(void)
{
SDA=HIGH;delay();SCL=HIGH;
if(!SDA){
SCL=LOW;
return(1);
}
else return(0);
}
static void I2C_WrByte(unsigned char value)
{
unsigned char i=8;
while(i--)
{
SDA=(bit)(value&0x80);
//SDA=(value&0x80)>>8;
value=value<<1;
delay();
SCL=HIGH;delay();
SCL=LOW;
}
}
unsigned char I2C_WrNByte(unsigned char chip_addr,unsigned char addr,unsigned char *p_data, unsigned char num)
{
register unsigned char i;
I2C_Start();
I2C_WrByte(chip_addr);
if(I2C_Cack())
{
I2C_WrByte(addr);
if(!I2C_Cack()) return(0);
for(i=0;i<num;i++)
{
I2C_WrByte(*p_data++);
if(!I2C_Cack()) return(0);
}
delay();
I2C_Stop();
delay();delay();delay();delay();delay();
return(1);
}
else return(0);
}
static unsigned char I2C_RdByte(void)
{
unsigned char Data=0;
unsigned char i=8;
SDA=HIGH;
while(i--)
{
Data=Data<<1;
SCL=HIGH;
delay();
if(SDA) Data++;
SCL=LOW;
delay();
}
return(Data);
}
unsigned char I2C_RdNByte(unsigned char chip_addr,unsigned char addr,unsigned char *p_data,unsigned char num)
{
register unsigned char i;
I2C_Start();
I2C_WrByte(chip_addr);
if(!I2C_Cack())return 0;
I2C_WrByte(addr);
if(!I2C_Cack())return 0;
I2C_Start();
I2C_WrByte(chip_addr+1);
if(!I2C_Cack())return 0;
for(i=0;i<num-1;i++)
{
*p_data=I2C_RdByte();
I2C_Mack();
p_data++;
}
*p_data=I2C_RdByte();
I2C_Mnack();
I2C_Stop();
return(1);
}