奇怪,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;
- }
|