STC12C5A6OS2和SD7218M 组成的8位显示电路
单片机晶振为11.0592Mhz, SD7218为20Mhz;
地址为A2=0,A1=0,A0=0,SDA和SCL有10K上拉地址
...............
STA:
SETB VSDA ;启动I2C总线
SETB VSCL
LCALL DELAY
JB VSDA,STA1
SETB FLAG.1
STA1:
CLR VSDA
LCALL DELAY
CLR VSCL
RET
STOP:
CLR VSDA ;停止I2C总线数据传送
SETB VSCL
LCALL DELAY
SETB VSDA
RET
GEARET:
RET
SENDLH:
MOV A, TXBUF ;发送一个字节,由高位到低位发送
MOV R3,#08H
SENDL:
MOV C,ACC.7
MOV VSDA,C
LCALL DELAY
SETB VSCL
LCALL DELAY
CLR VSCL
LCALL DELAY
RL A
DJNZ R3,SENDL
MOV 31H,#50
SETB VSDA ;检查应答位是否正常
SETB VSCL
CLR 28H.0
NOP
NOP
NOP
NOP
NOP
NOP
NOP
WRACK:
MOV C,VSDA
MOV F0,C
JNB F0, GEARET ;检查ACK信号是否正常
DJNZ 31H,WRACK ;没有应答继续检测
SETB 28H.0 ;置ACK出错标志位
RET
WRIETLED:
LCALL STA ;写8个LED8数据,总线启动
JNB FLAG.1,WRIET1
LJMP ERRSTOP
WRIET1:
MOV A,#50H ;送SD7218地址
MOV TXBUF,A
LCALL SENDLH ;调用发送一个字节子程序
JNB 28H.0,WRIET2
LJMP ERRSTOP ;ACK信号不正常则退出?
WRIET2:
MOV R2,#DECODE ;送多字节数据且译码命令
MOV TXBUF,R2
LCALL SENDLH
JNB 28H.0,WRIET3 ;通用标志位出错吗?否,为0转
LJMP ERRSTOP ;SDA线被箝位为低电平则退出
WRIET3:
MOV R0,#DIG1
MOV R1,#08H
WRIET4:
MOV A,@R0
MOV TXBUF,A
LCALL SENDLH ;调用发送一个字节子程序
JNB 28H.0,WRIET5
LJMP ERRSTOP ;ACK信号不正常则退出?
WRIET5:
INC R0
INC R2
DJNZ R1, WRIET4
LCALL STOP ;应答信号正常调用关闭IIC总线子程序
RET
ERRSTOP:
LCALL STOP ;应答信号出错调用关闭IIC总线子程序
RET
......................
请各位大虾给看看,是那一句程序出错了。程序运行到写完地址后,就没有正确的应答信号,退出写程序。延时时间为30us, |