奇怪,C语言位运算是编译器实现的,应当没问题。
要不楼主再看看SCL、SDA的波形,看SDA是在什么时候变化。
另有个建议,0x0001<<bitnum可能在某些时候会耗时较长,建议改成令一个变量初值为1,每个循环左移一次,
或采用移位寄存器的方式,即只让key2byte移位。
参考代码:
//------------------------------------------------
//IIC读取一字节数据
//------------------------------------------------
U8 IICRByte(void) //reentrant
{
U8 ret,i;
PSDA_H;
for(i=0;i<8;i++)//之前PSCL=0;
{
ret<<=1;
IICDelay(IIC_CT);//NOP();
PSCL_H;
IICDelay(IIC_CT);//NOP();
if(PINSDA)ret|=1;
PSCL_L;
}
return ret;
}
|