我写了一段模拟I2C的程序,用S51测24C64和PCF8563的地址都有反映,惟独PCF8574没有反映.用PLC935的I2C口测PCF8574能通,表明地址无错. <br />不知道问题出在哪里了,是PCF8574的时序比较特殊吗?<br />我的程序如下,希望有经验的朋友指点指点.<br />ACK BIT 10H<br />SLA DATA 50H<br />SUBA DATA 51H<br />NUMBYTE DATA 52H<br />SDA BIT P3.5<br />SCL BIT P3.4<br />MTD EQU 30H<br />MRD EQU 40H<br />PCF8574 EQU 4AH<br /><br /><br /> ORG 0000H<br /> AJMP MAIN<br /> ORG 0080H<br />MAIN: MOV R4,#0F0H<br /> DJNZ R4,$<br /><br />WRPCF8574:<br /><br />;往8574写00H<br />IWRBYTE:<br /> MOV A,#4AH<br />IWBLOOP:<br /> LCALL START<br /> LCALL WRBYTE<br /> LCALL CACK<br /> JB ACK,RETWRB<br /> MOV A,#00H<br /> LCALL WRBYTE<br /> LCALL CACK<br /> LCALL STOP<br /> RET<br />RETWRB:<br /> POP A<br /> LCALL STOP<br />; LCALL WRONG<br /><br /><br /> SJMP $<br />WRONG:<br /> SJMP $<br /><br />;I2C总线开始<br />START:<br /> SETB SDA<br /> NOP<br /> NOP<br /> SETB SCL<br /> NOP<br /> NOP<br /> NOP<br /> NOP<br /> NOP<br /> NOP<br /> CLR SDA<br /> NOP<br /> NOP<br /> NOP<br /> NOP<br /> NOP<br /> NOP<br /> CLR SCL<br /> RET<br />;I2C总线结束<br />STOP:<br /> CLR SDA<br /> NOP<br /> SETB SCL<br /> NOP<br /> NOP<br /> NOP<br /> NOP<br /> NOP<br /> SETB SDA<br /> NOP<br /> NOP<br /> NOP<br /> NOP<br /> RET<br />;I2C从机应答<br />CACK:<br /><br /> SETB SDA<br /> NOP<br /> NOP<br /> SETB SCL<br /> NOP<br /> NOP<br /> CLR ACK<br /> JNB SDA,CEND<br /> SETB ACK<br />CEND:<br /> NOP<br /> CLR SCL<br /> RET<br /><br />;写1B数据<br />WRBYTE:<br /> MOV R0,#08H<br />WLP:<br /> RLC A<br /> JC WR1<br /> CLR SDA<br /> SJMP SENT<br /><br />WR1:<br /> SETB SDA<br /> NOP<br />SENT:<br /> NOP<br /> SETB SCL<br /> NOP<br /> NOP<br /> NOP<br /> NOP<br /> NOP<br /> CLR SCL<br /> DJNZ R0,WLP<br /> NOP<br /> NOP<br /> RET<br /><br /> END<br /><br /> |
|