我都用C了,这里转网上的一个程序,仅供参考:
SDA EQU P0.1
SCL EQU P0.0
ORG 0
LJMP START
START: MOV R0,#40H
MOV A,#46H
FF: MOV @R0,A
INC R0
DEC A
JNZ FF
MOV DPH,#6
MOV DPL,#0
MOV R2,#32
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
|