📄 at24c08存储练习.asm
字号:
#include <reg51.inc>
SDA EQU P2.0
SCL EQU P2.1
adder data 0aH ;器件地址
adderz data 0bH
ader data 0cH ;读写缓冲区
byte data 0eH ;字节数
ack bit 0f0h
LDATA DATA 04dH
CNT DATA 070H
cnt1 data 080h
ORG 0000H
LJMP MAIN
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;开始子程序
start: setb SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;结束子程序
STOP: CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
NOP
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;应答子程序
MACK:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;非应答子程序
NOMACK:
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;~~~~~~~~~~~~~~~~~~~~
; 非应答检查重器件应答
CACK:
SETB SDA
NOP
NOP
SETB SCL
CLR ACK
NOP
NOP
MOV C,SDA
JC CEND
SETB ACK
CEND:
NOP
CLR SCL
NOP
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;发送字节程序
;传送的数据给A
;入口A
;使用的变量:R0,PSW,ACC
WRBYTE:
PUSH 00H
PUSH psw
push acc
MOV R0,#08H ;循环8次
WLP: RLC A ;取数
jc send1 ;是1发1
sjmp send0 ;是0发0
wlp1: djnz r0,wlp ;判断完成标志
nop
pop acc
POP psw
POP 00H
ret
send1: setb SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
send0: CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
SJMP WLP1
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;读取字节程序
;读出值给ACC
;每取一字节要发送一应答/非应答
;出口R2
;;使用的变量:R0,PSW,ACC
RDBYTE:
PUSH 00h
push psw
push acc
MOV R0,#08H
RLP: SETB SDA
NOP
SETB SCL
NOP
NOP
MOV C,SDA
MOV A,R2
CLR SCL
RLC A
MOV R2,A
NOP
NOP
NOP
DJNZ R0,RLP
pop acc
pop psw
POP 00H
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;所有清零子程序
;入口参数重器件地址:adder,子地址:adderz,
;字节数cnt,页数cnt1(不同的器件输入不同的字节或页数)
;LDATA,写入数据变量
;使用的寄存器;acc,psw,r0,
clerzero:
push acc
push psw
push adder
push adderz
wrbytead:
mov adder,#10100000b
LCALL start
mov a,adder
lcall WRBYTE
lcall CACK
jnb ack,endby
mov a,adderz
lcall WRBYTE
lcall CACK
wrbyted:
mov a,LDATA
lcall WRBYTE
lcall CACK
jnb ack,endby
inc adderz
DJNZ CNT,wrbyted
lcall STOP
mov cnt,#8
lcall delay
djnz cnt1,wrbytead
pop adderz
pop adder
pop psw
pop acc
ret
endby:
lcall STOP
pop adderz
pop adder
pop psw
pop acc
ret
;~~~~~~~~~~~~~~~~~~~~~~~~~
delay:
mov r5,#20
ms: mov r6,#97
djnz r6,$
djnz r5,ms
ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;写数据子程序
;入口参数;入口参数重器件地址:adder,子地址:adderz,
;字节数cnt,页数cnt1(不同的器件输入不同的字节或页数)
;LDATA;数据存放区
;r1;数据存放区起始地址
;使用的寄存器;acc,psw,r0,
writer:
push acc
push psw
push adder
push adderz
writepage:
mov adder,#10100000b
LCALL start
mov a,adder
lcall WRBYTE
lcall CACK
jnb ack,endw
mov a,adderz
lcall WRBYTE
lcall CACK
writerd:
mov a,@r1
lcall WRBYTE
lcall CACK
jnb ack,endw
inc r1
inc adderz
lcall stop
lcall delay
djnz cnt,writepage
pop adderz
pop adder
pop psw
pop acc
ret
endw:
lcall stop
pop adderz
pop adder
pop psw
pop acc
ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;写数据子程序
;入口参数;入口参数重器件地址:adder,子地址:adderz,
;字节数cnt,
;LDATA;数据存放区
;r1;数据存放区起始地址
;使用的寄存器;acc,psw,r0,r2
read:
push acc
push psw
push adder
push adderz
push 01h
mov adder,#10100000b
LCALL start
mov a,adder
lcall WRBYTE
lcall CACK
jnb ack,endr
mov a,adderz
lcall WRBYTE
lcall CACK
mov adder,#10100001b
LCALL start
mov a,adder
lcall WRBYTE
lcall CACK
jnb ack,endr
readd:
lcall RDBYTE
mov a,r2
mov @r1,a
lcall MACK
inc r1
DJNZ CNT,readd
ljmp aaa
aaa: lcall NOMACK
endr:
lcall STOP
pop 01h
pop adderz
pop adder
pop psw
pop acc
ret
;无子地址写数据
;入口参数;数据ACC,器件地址SLA
;占用:A,R0,CY
IWRBYTE:
push acc
push psw
push adder
push adderz
push 01h
iwbloop:
lcall start
mov adder,#10100000b
mov a,adder
lcall WRBYTE
lcall cack
jnb ack,retwrb
mov a,#0ffh
lcall wrbyte
lcall cack
retwrb:
lcall stop
pop 01h
pop adderz
pop adder
pop psw
pop acc
ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
data01:
mov cnt,#20
mov r1,#LDATA
mov a,#16
data00: mov @r1,a
inc r1
add a,#1
djnz cnt,data00
ret
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
org 0200h
MAIN: mov adder,#00h
mov adderz,#00h
mov ader,#00h
mov byte,#00h
MOV CNT,#00H
MOV CNT1,#00H
mov sp,#31h
startm: mov r7,#4
mov cnt,#16
mov ader,#00h
mov LDATA,#0FFH
cjne r7,#1,rd1
lcall writer1
rd1: cjne r7,#2,wrn
lcall read1
wrn: cjne r7,#3,rdn
lcall writern
rdn: cjne r7,#4,startm
lcall readn
writer1:
mov cnt,#1
mov LDATA,#0FFH
mov r1,#LDATA
mov adderz,ader
lcall writer
lcall exit
read1:
mov cnt,#1
mov r1,#LDATA
mov adderz,ader
lcall read
lcall exit
writern:
lcall data01
mov cnt,#16
mov r1,#LDATA
mov adderz,ader
lcall writer
lcall exit
readn:
mov cnt,#16
mov r1,#LDATA
mov adderz,ader
lcall read
lcall exit
exit:
jmp $
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -