I2c程序 51系列及 AVR系列
void Write_Bit1() //写1bit数据:1
{Set_SDA(1); //SDA=1;
Set_SCL(1); //SCL=1;
delay(100);
Set_SCL(0); //SCL=0;
Set_SDA(0); //SDA=0;
}
void Write_Byte(uchar Da
{uchar i;
for(i=0;i<8;i++)
{if(Da
else Write_Bit0();
Da
}
uchar Read_Byte() //读一字节数据:返回值即读的数据
{uchar Read_Da
uchar j;
for (j=0;j<8;j++)
{Set_SDA(1);
Set_SCL(1);
DDRA &=0xbf;
if((PINA & 0x40)==0)
{Read_Da
Read_Da
Set_SCL(0);}
else
{Read_Da
Read_Da
Set_SCL(0);}}
DDRA |=0x40;
return(Read_Da
}
//***************************写一字节数据****************************//
//向从地址为Slave的IIC器件的Address地址写一字节数据Da
void Write_1byte(uchar Slave,uchar Address,uchar Da
{Start(); //开始
Write_Byte(Slave); //写I2C器件地址
do Check_Ack(); //检查应答位
while(Ack_Flag==1);
Write_Byte(Address); //送寄存器地址
do Check_Ack(); //检查应答位
while(Ack_Flag==1);
Write_Byte(Da
do Check_Ack(); //检查应答位
while(Ack_Flag==1);
Stop(); //停止
}
//***************************写两字节数据****************************//
//向从地址为Slave的IIC器件的Address地址开始写两字节数据Da
void Write_2byte(uchar Slave,uchar Address,uchar Da
{Start(); //开始
Write_Byte(Slave); //写I2C器件地址
do Check_Ack(); //检查应答位
while(Ack_Flag==1);
Write_Byte(Address); //送寄存器地址
do Check_Ack(); //检查应答位
while(Ack_Flag==1);
Write_Byte(Da
do Check_Ack(); //检查应答位
while(Ack_Flag==1);
Write_Byte(Da
do Check_Ack(); //检查应答位
while(Ack_Flag==1);
Stop(); //停止信号
}
//***************************读一字节数据****************************//
//从从地址为Slave的IIC器件的Address地址处读一字节数据
uchar Read_1byte(uchar Slave,uchar Address)
{uchar da
do{
Start(); //开始信号
Write_Byte(Slave); //写I2C器件地址
Check_Ack(); //检查应答位
}while(Ack_Flag);
do{
Write_Byte(Address); //写寄存器地址
Check_Ack(); //检查应答位
}while(Ack_Flag);
do{
Start(); //开始
Write_Byte(Slave+1); //写I2C器件地址(+1表示为读操作)
Check_Ack(); //检查应答位
}while(Ack_Flag);
da
Nack(); //读完发送一个Not Ack应答
Stop(); //停止
return da
}
I2c程序51系列AVR系 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)