;注意时序,时间要求 SDA EQU P1.1 SCL EQU P1.3 ORG 0 LJMP START1 START: MOV R0,#40H MOV A,#46H FF: MOV @R0,A INC R0 DEC A JNZ FF MOV DPH,#2 MOV DPL,#1 MOV R2,#16 MOV R0,#40H LCALL WR16 DDD: SJMP DDD START1: MOV DPH,#2 MOV DPL,#1 MOV R2,#16 MOV R0,#41H LCALL RD16 SJMP DDD ;---------------------------------------------------------- ;WR16子程序:写多字节到24C16 ;入口参数:DPH:页地址,DPL:单元地址,R2:写入个数,R0:写入数据起址 ;---------------------------------------------------------- WR16: CLR SCL SETB SDA SETB SCL CLR SDA ;启动,注意时间要求 WR16A: MOV A,DPH RL A ORL A,#0A0H LCALL SDBYTE ;送写命令 CLR SCL SETB SDA SETB SCL JB SDA,WR16A ;是否响应 WR16B: MOV A,DPL LCALL SDBYTE ;送单元地址 CLR SCL SETB SDA SETB SCL JB SDA,WR16B ;是否响应 WR16C: MOV A,@R0 LCALL SDBYTE CLR SCL SETB SDA SETB SCL JB SDA,WR16C INC R0 DJNZ R2,WR16C ;页写入 CLR SCL CLR SDA SETB SCL SETB SDA ;停止 RET ;---------------------------------------------------------- ;RD16子程序:从24C16读多字节 ;入口参数:DPH:页地址,DPL:单元地址,R2:读个数,R0:暂存数据起址 ;---------------------------------------------------------- RD16: CLR SCL SETB SDA SETB SCL CLR SDA ;开始 RD16A: MOV A,DPH RL A ORL A,#0A0H LCALL SDBYTE ;送写命令 CLR SCL SETB SDA SETB SCL JB SDA,RD16A ;响应 RD16B: MOV A,DPL LCALL SDBYTE CLR SCL SETB SDA SETB SCL JB SDA,RD16B CLR SCL SETB SDA SETB SCL CLR SDA RD16C: MOV A,DPH RL A ORL A,#0A1H LCALL SDBYTE CLR SCL SETB SDA SETB SCL JB SDA,RD16C RC1: CLR SCL SETB SDA ;读引脚 LCALL RCBYTE MOV @R0,A INC R0 CLR SCL ;---- CLR SDA SETB SCL ;应答 DJNZ R2,RC1 CLR SCL SETB SDA SETB SCL ;非应答 CLR SCL CLR SDA SETB SCL SETB SDA ;停止 RET ;---------------------------------------------------------- ;SDBYTE子程序:送一个字节到SDA ;入口参数:要传送的数A ;局部参数:R7 ;---------------------------------------------------------- SDBYTE: MOV R7,#8 ;R7控制循环次数 SL1: CLR SCL ;置低SCL RLC A MOV SDA,C SETB SCL ;给SCL一个上升沿 DJNZ R7,SL1 RET ;---------------------------------------------------------- ;RCBYTE子程序:从SO接收一个字节 ;出口参数:接收到的字节A ;局部参数:R7 ;---------------------------------------------------------- RCBYTE: MOV R7,#8 ;R7控制循环次数 RL1: CLR SCL SETB SCL MOV C,SDA ;读引脚 RLC A DJNZ R7,RL1 ;先接收低位 RET END