NOPNOP(50);
SetSCL(0);
SetSDA(0);
}
voidCheck_Ack()//器件应答信号检查
{SetSDA(1);
SetSCL(1);
F_Flag=0;
DDRB=DDRB&0xFD;
if((PINB&0x02)==0)
{SetSCL(0);
NOPNOP(50);}
else
{F_Flag=1;
SetSCL(0);
NOPNOP(50);}
DDRB=DDRB|0x02;
}
voidWrite_Bit0()//向IIC总线写0
{SetSDA(0);
SetSCL(1);
NOPNOP(50);
SetSCL(0);
}
voidWrite_Bit1()//向IIC总线写1
{SetSDA(1);
SetSCL(1);
NOPNOP(50);
SetSCL(0);
SetSDA(0);
}
voidWrite_Byte(ucharData)//向IIC总线写一字节数据
{uchari;
for(i=0;i《8;i++)
{if((Data&0x80)》0)
Write_Bit1();
else
Write_Bit0();
Data《《=1;
}
}
ucharRead_Byte()//从IIC总线读一字节数据
{ucharnn=0xff;
ucharj;
for(j=0;j《8;j++)
{SetSDA(1);
SetSCL(1);
DDRB=DDRB&0xFB;
if((PINB&0x02)==0)
{nn《《=1;
nn=(nn&0xfe);
SetSCL(0);}
else
{nn《《=1;
nn=(nn|0x01);
SetSCL(0);}
}
DDRB=DDRB|0x02;
return(nn);
}
//****************************写N个字节子程序**********************//
//函数参数说明:
//Slave:IIC器件地址,如上文定义的SD2303
//Address:起始地址
//Array:读数据存放的数组
//Number:读取的字节数
voidWrite_Nbyte(ucharSlave,ucharAddress,uchar*Array,ucharNumber)
{uchark;
writ:do//开始-》写IIC器件地址-》检查应答位
{Start();
Write_Byte(Slave);
Check_Ack();
}while(F_Flag==1);
do
{Write_Byte(Address《《4);//送起始地址-》检查应答位
Check_Ack();
}while(F_Flag==1);
for(k=0;k{Write_Byte(*Array);
Array++;
Check_Ack();}//检查应答位
Stop();
}
//****************************写一个字节子程序**********************//
//函数参数说明:
//Slave:IIC器件地址,如上文定义的SD2303
//Address:IIC器件寄存器地址
//Data:数据
voidWrite_1byte(ucharSlave,ucharAddress,ucharData)
{writ:do//开始-》写IIC器件地址-》检查应答位
{Start();
Write_Byte(Slave);
Check_Ack();
}while(F_Flag==1);
do
{Write_Byte(Address《《4);//送起始地址-》检查应答位
Check_Ack();
}while(F_Flag==1);
Write_Byte(Data);
Check_Ack();//检查应答位
Stop();//停止信号
}
//***************************读N个字节子程序***********************//
//函数参数说明:
//Slave:IIC器件地址,如上文定义的SD2303