下面是我想把46H,47H两个字节写入24C02 再重新读出到26H和27H中 可是读出的结果是26H,27H的内容都为47H中的内容。。。。。 实在不得其解 我的目标是对24C02进行16个字节的读写 希望那位大哥帮个忙啊 SDA EQU P3.7 ;定义24C02SDA对应引脚 SCL EQU P1.0 ;定义24C02SCL对应引脚 ;----------------------------------------------------- ORG 0000H AJMP MAIN MAIN: MOV SP,#60H MOV 46H,#16H MOV 47H,#33H ACALL WR_24C02 ACALL RD_24C02 SLEEP: ACALL DELAY0.5S MOV PCON,#02H ;置CPU为掉电方式 ;=========写子程序========== WR_24C02: ACALL WRITE_24C02A ACALL DELAY ACALL WRITE_24C02B ACALL DELAY RET ;=========读子程序==================== RD_24C02: ACALL READ_24C02A ACALL READ_24C02B RET ;=========写入数据===================== WRITE_24C02A: ACALL START ;发送IC总线起始条件 MOV A,#0A0H ;24C02总线地址 ACALL SENTBYTE ;发送24C02器件总线地址 MOV A,#00H ;取存储地址 ACALL SENTBYTE MOV A,46H ;去发送的数据 ACALL SENTBYTE ;发送一次数据 ACALL DELAY10 ACALL STOP ;发送IC总线停止条件 RET WRITE_24C02B: ACALL START ;发送IC总线起始条件 MOV A,#0A0H ;24C02总线地址 ACALL SENTBYTE ;发送24C02器件总线地址 MOV A,#01H ;取存储地址 ACALL SENTBYTE MOV A,47H ;去发送的数据 ACALL SENTBYTE ;发送一次数据 ACALL DELAY10 ACALL STOP ;发送IC总线停止条件 RET ;============读数据============== READ_24C02A: ACALL START ;发送IC总线起始条件 MOV A,#0A0H ACALL SENTBYTE ;24C02总线地址 MOV A,#00H ;取存储地址 ACALL SENTBYTE ;发送24C02器件总线地址 ACALL START ;发送IC总线重复起始条件 MOV A,#0A1H ;24C02总线地址 ACALL SENTBYTE ;发送被控制总线地址 ACALL RCVBYTE ;接受数据 MOV 26H,A ;接受的数据送入P1口 ACALL STOP ;发送IC总线停止条件 RET READ_24C02B: ACALL START ;发送IC总线起始条件 MOV A,#0A0H ; ACALL SENTBYTE ;24C02总线地址 MOV A,#00H ;取存储地址 ACALL SENTBYTE ;发送24C02器件总线地址 ACALL START ;发送IC总线重复起始条件 MOV A,#0A1H ;24C02总线地址 ACALL SENTBYTE ;发送被控制总线地址 ACALL RCVBYTE ;接受数据 MOV 27H,A ;接受的数据送入P1口 ACALL STOP ;发送IC总线停止条件 RET ;=================总线起始条件子程序============================ START: SETB SDA ;发送起始条件的数据信号 NOP NOP NOP SETB SCL ;发送起始条件的时钟信号 NOP NOP NOP CLR SDA ;发送起始信号 NOP NOP NOP CLR SCL ;钳住IC总线准备发送或接受数据 RET ;==================发送子程序================== SENTBYTE: MOV R0,#08H ;送数8位 SENTB: RLC A ;要发送的数据左移,发送入位C MOV SDA,C NOP NOP NOP SETB SCL ;置时钟线为高,通知被控制开始接受数据位 NOP NOP NOP CLR SCL ;钳住总线准备接受下一个数据位 DJNZ R0,SENTB ;8位没发送完继续发送 NOP NOP SETB SDA ;8位发送完后释放数据为准备接受应答 NOP NOP SETB SCL ;开始接受应答信号 NOP NOP REP: MOV C,SDA JC REP NOP CLR SCL ;发送结束钳住总线准备下一步接受或发送数据或进行其他处理 RET ;=====================接收子程序================= RCVBYTE: SETB SDA ;置数据线为输入方式 MOV R0,#08H ;要传送的数据长度为8位 RCV: NOP CLR SCL ;置时钟线为低,准备接受数据 NOP NOP NOP NOP NOP SETB SCL ;置时钟线为高使数据线上数据有效 NOP NOP MOV C,SDA ;接收的数据位放入ACC RLC A NOP NOP DJNZ R0,RCV ;8位没接受完继续接受 CLR SCL ;8位接受完置时钟线和数据线 NOP NOP CLR SDA SETB SDA ;接受非应答信号 NOP NOP SETB SCL ;置时钟线为高,使应答位有效 NOP NOP SETB SDA NOP NOP NOP CLR SCL ;清时钟线钳住IC总线以便发送停止条件 RET ;====================停止条件子程序===================== STOP: CLR SDA ;发送停止条件的数据信号 NOP NOP NOP SETB SCL ;发送停止条件的时钟信号 NOP NOP NOP SETB SDA ;发送IC总线停止信号 NOP NOP NOP NOP RET DELAY0.5S: MOV R6,#30 0.5SL1: MOV R5,#250 0.5SL2: NOP DJNZ R5,0.5SL2 DJNZ R6,0.5SL1 RET DELAY5US: NOP NOP RET DELAY: MOV R0,#255 LPP1: MOV R1,#255 LPP2: NOP NOP NOP DJNZ R1,LPP2 DJNZ R0,LPP1 RET DELAY10: MOV 44H,#30H ;延时10毫秒等待数据写完 D1: MOV 45H,#50H D2: DJNZ 45H,D2 DJNZ 44H,D1 RET END
|