C51 while()循环问题 下面这个while()循环是怎么跳出来的?
正在学习C51编程,下面是别人运行通的一段代码,是通过模拟IIC总线向某器件,指定地址reg1,reg2写入数据dat。不理解其中的while循环是如何结束的?程序中调用...
正在学习C51编程,下面是别人运行通的一段代码,是通过模拟IIC总线向某器件,指定地址reg1,reg2写入数据dat。不理解其中的while循环是如何结束的?程序中调用的函数 b1=SendIic_Mlx(i); b2=SendIic_Mlx(reg1);b3=SendIic_Mlx(reg2); b3=SendIic_Mlx(reg2); b4=SendIic_Mlx(dat); 返回值都为1,while循环是如何结束?请指教。
bit WriteReg_Mlx(uchar reg1,uchar reg2,uchar dat) //向mlx中指定地址reg1,reg2中写入数据dat
{
uchar i;
bit b1=1,b2=1,b3=1,b4=1;
i=MLX_I2C_ADDRESSS;
while((b1==1)||(b2==1)||(b3==1)||(b4==1))
{
StartIic_Mlx; // I2C起始
b1=SendIic_Mlx(i); // 写I2C器件地址
b2=SendIic_Mlx(reg1); //写入寄存器地址1
b3=SendIic_Mlx(reg2); //写入寄存器地址2 寄存器地址16位数据,需要写入两个寄存器
b4=SendIic_Mlx(dat); //向指定芯片的指定寄存器地址写入数据dat
}
EndIic_Mlx; // I2C结束
return(!bScanErr); //line 6-----bit bScanErr=0 返回(bit)1
}
bit SendIic_Mlx(uchar cData)//写入一字节数据
{ //将要写入的数据cData(8位)依次从最高位到最低位传递给数据线mlxsda,
//并返回写入完毕校验位bit_ack = 1
uchar data i;
bit bit_ack;
for(i=0;i<8;i++)//将数据cData依次传递给mlxsda
{
mlxsda=(bit)(cData&0x80); //mlxsda=(cdata & 1000 0000);执行完成之后,cdata要么是0x80,要么是0x00,
//如果是0x80,则表示cdata该位上为1,
//如果是0x00表示cdata该位上是0
mlxscl=1; //执行完8次循环之后,将要写入的数据(cdata)
cData<<=1; //从最高位到最低位依次赋值给 mlxsda
Wait;
mlxscl=0;
Wait;
}
mlxsda=1;
Wait;
Wait;
mlxscl=1; /*检测ACK*/ //应答
Wait;
Wait;
Wait;
bit_ack=mlxsda; // 写入完毕,此时,bit_ack = 1
mlxscl=0;
return(bit_ack); //此时返回写入完毕校验位(1) 展开
bit WriteReg_Mlx(uchar reg1,uchar reg2,uchar dat) //向mlx中指定地址reg1,reg2中写入数据dat
{
uchar i;
bit b1=1,b2=1,b3=1,b4=1;
i=MLX_I2C_ADDRESSS;
while((b1==1)||(b2==1)||(b3==1)||(b4==1))
{
StartIic_Mlx; // I2C起始
b1=SendIic_Mlx(i); // 写I2C器件地址
b2=SendIic_Mlx(reg1); //写入寄存器地址1
b3=SendIic_Mlx(reg2); //写入寄存器地址2 寄存器地址16位数据,需要写入两个寄存器
b4=SendIic_Mlx(dat); //向指定芯片的指定寄存器地址写入数据dat
}
EndIic_Mlx; // I2C结束
return(!bScanErr); //line 6-----bit bScanErr=0 返回(bit)1
}
bit SendIic_Mlx(uchar cData)//写入一字节数据
{ //将要写入的数据cData(8位)依次从最高位到最低位传递给数据线mlxsda,
//并返回写入完毕校验位bit_ack = 1
uchar data i;
bit bit_ack;
for(i=0;i<8;i++)//将数据cData依次传递给mlxsda
{
mlxsda=(bit)(cData&0x80); //mlxsda=(cdata & 1000 0000);执行完成之后,cdata要么是0x80,要么是0x00,
//如果是0x80,则表示cdata该位上为1,
//如果是0x00表示cdata该位上是0
mlxscl=1; //执行完8次循环之后,将要写入的数据(cdata)
cData<<=1; //从最高位到最低位依次赋值给 mlxsda
Wait;
mlxscl=0;
Wait;
}
mlxsda=1;
Wait;
Wait;
mlxscl=1; /*检测ACK*/ //应答
Wait;
Wait;
Wait;
bit_ack=mlxsda; // 写入完毕,此时,bit_ack = 1
mlxscl=0;
return(bit_ack); //此时返回写入完毕校验位(1) 展开
1个回答
展开全部
这句:
bit_ack=mlxsda; // 写入完毕,此时,bit_ack = 1
不要以为bit_ack = 1,它是等于总线mlxsda的状态。这个状态是由对方发送来的。
如果SendIic_Mlx()返回1,表示对方没有应答,也就是没有成功。
所以就循环,直到所有b1,b2,b3,b4都 返回0,才说明这4个数据都发送成功了。数据完全正确,于是循环结束。
当然这样的程序是“不健状”的,因为一旦IIC总线开路或总线器件故障,这就 是一个死循环,造成单片机无响应。应该采用定时,时间到还不成功,就退出。
bit_ack=mlxsda; // 写入完毕,此时,bit_ack = 1
不要以为bit_ack = 1,它是等于总线mlxsda的状态。这个状态是由对方发送来的。
如果SendIic_Mlx()返回1,表示对方没有应答,也就是没有成功。
所以就循环,直到所有b1,b2,b3,b4都 返回0,才说明这4个数据都发送成功了。数据完全正确,于是循环结束。
当然这样的程序是“不健状”的,因为一旦IIC总线开路或总线器件故障,这就 是一个死循环,造成单片机无响应。应该采用定时,时间到还不成功,就退出。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询