📄 rw2401.asm
字号:
public _read2401
public _r2401
public _write2401
public _w2401
public _rd42401
public _w42401
pro2401 segment code
rseg pro2401
SDA equ p1.7
Scl equ p1.6
;*****************************************************
;从24C01读一字节
;入口参数: R7 地址
;出口参数: R7 读出数据
;-----------------------------------------------------
_r2401:
PUSH ACC
PUSH 07H
MOV R7,#255
DJNZ R7,$
MOV R7,#255
DJNZ R7,$
MOV R7,#255
DJNZ R7,$
POP 07H
CLR ET0
LCALL LSTART
MOV A,#0A0H ;发送写命令
LCALL LSEND
MOV A,R7 ;写地址
LCALL LSEND
LCALL LSTART
MOV A,#0A1H ;发送读命令
LCALL LSEND
LCALL LREAD ;读出数据到A
MOV R7,A
LCALL LSTOP
POP ACC
SETB ET0
RET
;*****************************************************
;从24C01读两字节
;入口参数: R7 地址
;出口参数: R7 读出数据低位
; R6 读出数据高位
;-----------------------------------------------------
_read2401:
PUSH ACC
PUSH 07H
MOV R7,#255
DJNZ R7,$
MOV R7,#255
DJNZ R7,$
MOV R7,#255
DJNZ R7,$
POP 07H
CLR ET0
LCALL LSTART
MOV A,#0A0H
LCALL LSEND ;发送写命令
MOV A,R7
LCALL LSEND ;写地址
LCALL LSTART
MOV A,#0A1H
LCALL LSEND ;发送读命令
LCALL LREAD
MOV R6,A ;读出数据高位
LCALL LREAD
MOV R7,A ;读出数据低位
LCALL LSTOP
POP ACC
SETB ET0
RET
;*****************************************************
;从24C01读四字节
;入口参数: R7 地址
;出口参数: R6,R7 读出数据低位
; R4,R5 读出数据高位
;-----------------------------------------------------
_rd42401:
PUSH ACC
PUSH 07H
MOV R7,#255
DJNZ R7,$
MOV R7,#255
DJNZ R7,$
MOV R7,#255
DJNZ R7,$
POP 07H
CLR ET0
LCALL LSTART
MOV A,#0A0H
LCALL LSEND ;发送写命令
MOV A,R7
LCALL LSEND ;写地址
LCALL LSTART
MOV A,#0A1H
LCALL LSEND
LCALL LREAD
MOV R4,A
LCALL LREAD
MOV R5,A ;发送读命令
LCALL LREAD
MOV R6,A ;读出数据高位
LCALL LREAD
MOV R7,A ;读出数据低位
LCALL LSTOP
POP ACC
SETB ET0
RET
;************************************************
;写24C01一字节
;入口参数:R7 地址
; R5 数据
;------------------------------------------------
_w2401:
PUSH ACC
PUSH 07H
MOV R7,#255
DJNZ R7,$
MOV R7,#255
DJNZ R7,$
MOV R7,#255
DJNZ R7,$
POP 07H
CLR ET0
LCALL LSTART
MOV A,#0A0H ;发送写命令
LCALL LSEND
MOV A,R7 ;地址
LCALL LSEND ;写入地址
MOV A,R5
LCALL LSEND ;写入数据
LCALL LSTOP
POP ACC
SETB ET0
RET
;************************************************
;写24C01两字节
;入口参数: R7 地址
; R5 数据低位
; R4 数据高位
;------------------------------------------------
_write2401:
PUSH ACC
PUSH 07H
MOV R7,#255
DJNZ R7,$
MOV R7,#255
DJNZ R7,$
MOV R7,#255
DJNZ R7,$
POP 07H
CLR ET0
LCALL LSTART
MOV A,#0A0H
LCALL LSEND ;发送写命令
MOV A,R7
LCALL LSEND ;写地址
MOV A,R4
LCALL LSEND ;写入数据高位
MOV A,R5
LCALL LSEND ;写入数据低位
LCALL LSTOP
POP ACC
SETB ET0
RET
;************************************************
;写24C01四字节
;入口参数: R7 地址
; R5 数据低位
; R4 数据高位
;------------------------------------------------
_w42401:
PUSH ACC
PUSH 07H
MOV R7,#255
DJNZ R7,$
MOV R7,#255
DJNZ R7,$
MOV R7,#255
DJNZ R7,$
POP 07H
CLR ET0
LCALL LSTART
MOV A,#0A0H
LCALL LSEND ;发送写命令
MOV A,R7
LCALL LSEND ;写地址
MOV A,R2
LCALL LSEND
MOV A,R3
LCALL LSEND
MOV A,R4
LCALL LSEND ;写入数据高位
MOV A,R5
LCALL LSEND ;写入数据低位
LCALL LSTOP
POP ACC
SETB ET0
RET
;************************************************
;24LC01子程序
;开始命令子程序
LSTART:
SETB SDA ;确认SDA高
NOP
SETB SCL ;SDA=SDA
NOP
NOP
CLR SDA ;产生开始条件
NOP
NOP
NOP
NOP
CLR SCL ;让SCL低
RET
;--------------------------------------------------
LSTOP:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
NOP
CLR SCL
NOP
RET
;------------------------------------------------------
;向01发送数据
;INPUT=ACC
LSEND:
PUSH 07H
MOV R7,#08H
CLR SCL
SLOOP:
RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
CLR SCL
DJNZ R7,SLOOP
SETB SDA
SETB SCL
NOP
CLR SCL
POP 07H
RET
;--------------------------------------------------
;读取一个字节
LREAD:
PUSH 05H
MOV R5,#08H ;之所以为8 在结束时产生一个无效位(即ACK位)
CLR SCL ;Scl
LRE1:
SETB SDA
NOP
NOP
SETB SCL
NOP
MOV C,SDA ;SDA
RLC A
NOP
NOP
CLR SCL
DJNZ R5,LRE1
CLR SDA ;问不产生应答条件 TTTT
NOP
SETB SCL
POP 05H
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -