/*以struct write
{uchar add; 要写的器件地址
uchar sub_add; 要写的器件的子地址
uchar data_byte; 要写的数据
}write_data;
struct read
{uchar add; 要读的器件地址
uchar sub_add; 要读的器件的子地址
uchar data_byte; 读出来的数据保存的地址
}read_data;
为结构体
*/
#include<AT89X52.h>
#include<INTRINS.h>
sbit SD=P2^1;
sbit SCL=P2^0;
#define uchar unsigned char
#define uint unsigned char
unsigned char code disc[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
struct write
{uchar add;
uchar sub_add;
uchar data_byte;
}write_data;
struct read
{uchar add;
uchar sub_add;
uchar data_byte;
}read_data;
void I2C_START(void)
{SD=1;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SD=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
void I2C_STOP(void)
{SD=0;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SD=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
void I2C_SEND_ASK(void)
{SCL=0;
SD=0;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
SD=0;
}
void I2C_SEND_NASK(void)
{SCL=0;
_nop_();
SD=1;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
SD=0;
}
void I2C_CHECK_ASK(void)
{SD=1;
_nop_();
_nop_();
SCL=1;
_nop_();
F0=0;
if(SD==1) {F0=1;SCL=0;}
else SCL=0;
_nop_();
_nop_();
SD=0;
}
void I2C_WRITE_BYTE(uchar w)
{ uchar i,j;
SCL=0;
for(i=0;i<8;i++)
{
if((w&0x80)==0x80){SD=1;}
else {SD=0;}
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
SD=0;
w=_crol_(w,1);
}
}
I2C_read_BYTE(void)
{ uchar i,a=0xff,b=0x80,c=0x7f;
SCL=0;
for(i=0;i<8;i++)
{ SD=1;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
if(SD==1){a=(a|b);}
else {a=(a&c);}
_nop_();
_nop_();
_nop_();
SCL=0;
SD=1;
a=_crol_(a,1);
}
SD=0;
read_data.data_byte=a;
}
void I2C_WRITE(void)
{
lopw: I2C_START();
I2C_WRITE_BYTE(write_data.add);
I2C_CHECK_ASK();if(F0==1) goto lopw;
I2C_WRITE_BYTE(write_data.sub_add);
I2C_CHECK_ASK();if(F0==1) goto lopw;
I2C_WRITE_BYTE(write_data.data_byte);
I2C_CHECK_ASK();if(F0==1) goto lopw;
I2C_STOP();
}
void I2C_READ(void)
{
lopr: I2C_START();
I2C_WRITE_BYTE(read_data.add);
I2C_CHECK_ASK();if(F0==1) goto lopr;
I2C_WRITE_BYTE(read_data.sub_add);
I2C_CHECK_ASK();if(F0==1) goto lopr;
I2C_STOP();
lopr1:I2C_START();
I2C_WRITE_BYTE((read_data.add)|0x01);
I2C_CHECK_ASK();if(F0==1) goto lopr1;
I2C_READ_BYTE();
I2C_SEND_NASK();
I2C_STOP();
}
main()
{
write_data.add=0xa0;
write_data.sub_add=0x00;
write_data.data_byte=0x06;
I2C_WRITE();
read_data.add=0xa0;
read_data.sub_add=0x00;
I2C_READ();
P0=disc[( read_data.data_byte)&0x0f];
P2_2=0;
}