//***************************************************************//
//i2c函数区24c01-24c16读写驱动程序
#define scl p1_2
#define sda p1_7
sbit a0=acc^0; //定义acc的位,利用acc操作速度最快
sbit a1=acc^1;
sbit a2=acc^2;
sbit a3=acc^3;
sbit a4=acc^4;
sbit a5=acc^5;
sbit a6=acc^6;
sbit a7=acc^7;
//***************************************************************//
void nop2()
{
_nop_();
}
//***************************************************************//
void s24(void)
{
sda=1; nop2();
scl=1; nop2();
sda=0; nop2();
scl=0; nop2();
}
void p24(void)
{
sda=0; nop2();
scl=1; nop2();
sda=1; nop2();
}
void ack24(void)
{
unsigned char n=0;
scl=1;nop2();
while(sda&&(n<10)) n++;
if (n==10) waring(); //iic应答出错,调用waring
scl=0;nop2();
}
unsigned char rd24(void)
{
sda=1;nop2();
scl=1;nop2();a7=sda;nop2();scl=0;nop2();
scl=1;nop2();a6=sda;nop2();scl=0;nop2();
scl=1;nop2();a5=sda;nop2();scl=0;nop2();
scl=1;nop2();a4=sda;nop2();scl=0;nop2();
scl=1;nop2();a3=sda;nop2();scl=0;nop2();
scl=1;nop2();a2=sda;nop2();scl=0;nop2();
scl=1;nop2();a1=sda;nop2();scl=0;nop2();
scl=1;nop2();a0=sda;nop2();scl=0;nop2();
sda=1;nop2();
return(acc);
}
void wd24(unsigned char dd)
{
acc=dd;
sda=a7;nop2();scl=1;nop2();scl=0;nop2();
sda=a6;nop2();scl=1;nop2();scl=0;nop2();
sda=a5;nop2();scl=1;nop2();scl=0;nop2();
sda=a4;nop2();scl=1;nop2();scl=0;nop2();
sda=a3;nop2();scl=1;nop2();scl=0;nop2();
sda=a2;nop2();scl=1;nop2();scl=0;nop2();
sda=a1;nop2();scl=1;nop2();scl=0;nop2();
sda=a0;nop2();scl=1;nop2();scl=0;nop2();
sda=1;nop2();
}
unsigned char read(unsigned int address){
unsigned char dd;
dd=((address&0x7ff)/256)<<1;
s24();wd24(0xa0|dd);ack24();wd24(address);ack24();
s24();wd24(0xa1|dd);ack24();dd=rd24();p24();delay(2);
return(dd);
}
void write(unsigned int address,unsigned char dd)
{
unsigned char ddd;
ddd=((address&0x7ff)/256)<<1;
s24();wd24(0xa0|ddd);ack24();wd24(address);ack24();
wd24(dd);ack24();p24();delay(2);
}
//***************************************************************//
看看俺写的iic读写函数,里面有一些偷懒了,比如,“无应答”我就没有用到,我认为没有用的必要,程序测试正常。