;按复位按键。 该程序可以记录存储复位的次数 UBADR EQU 40H BITCNT EQU 41H SUBADR EQU 42H SDA BIT P3.6 SCL BIT P1.5 ORG 00H JMP MAIN ORG 100H MAIN: MOV P2,0 ACALL READ_24C02 ;调用读24C02子程序 MOV DPTR,#TABLE MOV A,R7 MOVC A,@A+DPTR MOV P0,A ACALL DELAY INC R7 ACALL WRITE_24C02 ;;调用写24C02程序 ACALL DELAY ACALL DELAY JMP $ ;=================================== DELAY: MOV R0,#0FFH DELAY0: MOV R1,#0FFH DELAY1: NOP NOP NOP DJNZ R1,DELAY1 DJNZ R0,DELAY0 RET ;============================ WRITE_24C02: ACALL START ;发送IC总线起始条件 MOV A,#0A0H ;24C02总线地址 ACALL SENTBYTE ;发送24C02器件总线地址 JB F0,SENDRETURN ;出错返回 MOV A,SUBADR ;取存储地址 ACALL SENTBYTE JB F0,SENDRETURN MOV A,R7 ACALL SENTBYTE ;发送一次数据 JB F0,SENDRETURN ;出错返回 ACALL STOP ;发送IC总线停止条件 DELAY10: ;延时10MS等待数据写完 MOV 44H,30H D1: MOV 45H,#34H DJNZ 45H,$ DJNZ 44H,D1 SENDRETURN: RET ;======================================= READ_24C02: ;读24C02 ACALL START ;发送IC总线起始条件 MOV A,#0A0H ACALL SENTBYTE ;24C02总线地址 JB F0,RCVRETURN ;出错返回 MOV A,SUBADR ;取存储地址 ACALL SENTBYTE ;发送24C02器件总线地址 JB F0,SENDRETURN ;出错返回 ACALL START ;发送IC总线重复起始条件 MOV A,#0A0H ;24C02总线地址 SETB ACC.0 ;取总线读操作数 ACALL SENTBYTE ;发送被控制总线地址 JB F0,RCVRETURN ;出错返回 ACALL RCVBYTE ;接受数据 RCVRETURN: RET ;========================================= START: SETB SDA ;发送起始条件的数据信号 NOP NOP NOP SETB SCL ;发送起始条件的时钟信号 NOP ;起始条件建立时间大于4.7s NOP NOP CLR SDA ;发送起始信号 NOP ;起始条件锁定时间大于4s NOP NOP CLR SCL ; 钳住IC总线准备发送或接受数据 RET ;================================== STOP: CLR SDA ;发送停止条件的数据信号 NOP NOP NOP SETB SCL ;发送停止条件的时钟信号 NOP ;起始条件建立时间大于4s NOP NOP SETB SDA ;发送IC总线停止信号 NOP NOP NOP NOP RET ;=============================== SENTBYTE: ;送数8位 MOV BITCNT,#08H SENTB: RLC A ;要发送的数据左移,发送入位C MOV SDA,C NOP NOP NOP SETB SCL ;置时钟线为高,通知被控制开始接受数据位 NOP ;保证时钟高周期大于4s NOP NOP CLR SCL ;钳住总线准备接受下一个数据位 DJNZ BITCNT,SENTB ;8位没发送完继续发送 NOP NOP SETB SDA ;8位发送完后释放数据线准备收应答位 NOP NOP SETB SCL ;开始接受应答信号 NOP NOP CLR F0 ;预先清发送数据出错标志 JNB SDA,ACKEND ;判断是否接受应答信号正常转ACKEND SETB F0 ;未受到应答置位错误标志 ACKEND: NOP CLR SCL ;发送结束钳住总线准备下一步发送或接受数据或进行其他处理 RET ;================================= RCVBYTE: SETB SDA ;置数据线为输入方式 MOV BITCNT,#08H ;要传送的数据长度为8位 RCV: NOP CLR SCL ;置时钟线为低,准备接受数据 NOP ;时钟低周期大于4.7s NOP NOP NOP NOP SETB SCL ;置时钟线为高使数据线上数据有效 NOP NOP MOV C,SDA RLC A ;接受的数据位放入ACC NOP NOP DJNZ BITCNT,RCV ;8位没收完继续接受 CLR SCL ;8位接受完置时钟线和数据线 NOP NOP CLR SDA SETB SDA ;接受非应答信号 NOP NOP SETB SCL ;置时钟线为高使应答位有效 NOP ;时钟高周期大于4.7s NOP SETB SDA NOP NOP NOP CLR SCL ;清时钟线钳住IC总线以便发送停止条件 RET TABLE: DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f END