📄 通过串口读写at24c01a.asm
字号:
first equ p2.5;第一位数码管控制
second equ p2.4;第二位数码管控制
dispbuf equ 5eh;5E,5F是显示缓冲区
rec bit 00h;接受到数据标志
recbuf equ 21h;从21H开始的3字节接收缓冲区
count equ 24h;软件计数器
vscl bit p3.4;串行时钟
vsda bit p3.5;串行数据
;wp bit p3.7
sla equ 50h;寻址字节存放单元
numbyt equ 51h;传送字节数存放单元
mtd equ 52h;发送数据缓冲区
mrd equ 52h;接受数据缓冲区
slaw equ 0a0h ; 写命令子
slar equ 0a1h;读命令字
org 00h
jmp main
org 0023h
ljmp recive
org 30h
main:mov sp,#5fh
mov tmod,#00100000b;定时器1工作方式2
mov th1,#0fdh
mov tl1,#0fdh
orl pcon,#10000000b;SMOD=1
setb tr1;定时器1工作
mov scon,#01000000b;串口工作方式1
mov dispbuf,#0h
mov dispbuf+1,#0h;开机显示0
mov count,#0;清缓冲计数器
setb ren;允许接收
setb ea
setb es
clr rec;清接数据的标志
main1:
call disp;调用显示程序
jb rec,progrec;如果收到数据标志是1,则转到处理程序
jmp main1
progrec:
clr rec
mov r0,#recbuf
mov a,@r0
cjne a,#0,progrec1;接收是0,是写片命令
inc r0
mov a,@r0
mov r1,#mtd;发送数据缓冲区首址
mov @r1,a;地址放在发送数据缓冲区第一位
inc r0
inc r1
mov a,@r0;接收到的第3个字节是待写入的数据
mov b,#16
div ab
mov dispbuf,a
mov dispbuf+1,b
mov a,@r0
mov @r1,a
;clr wp
clr ea
mov numbyt,#2
mov sla,#slaw;准备写入数据
call wrnbyt
setb ea
;setb wp
jmp main1
progrec1:
cjne a,#1,main1;接收是1,是读片命令
inc r0
mov a,@r0
mov r1,#mrd
mov @r1,a
mov sla,#slaw
;clr wp
mov numbyt,#1
call wrnbyt;送出地址信号
mov sla,#slar
mov numbyt,#1
call rdnbyt;随机读
;setb wp
mov sbuf,a;送往主机
mov b,#16
div ab
mov dispbuf,a
mov dispbuf+1,b
jmp main1
recive:
push acc
push psw
jb ri,rec1;接收中断转
jb ti,rec3;接收发送退出
rec1:clr ri
mov a,#recbuf
add a,count
mov r0,a
mov a,sbuf
mov @r0,sbuf
mov b,#16
div ab
mov dispbuf,a
mov dispbuf+1,b
inc count
mov a,count
cjne a,#3,rec2
mov count,#0
setb rec;已收到3个数据
jmp rec4
rec2:
clr rec
rec3:
clr ti
rec4:pop psw
pop acc
reti
disp:;显示程序
push acc
push psw
mov a,dispbuf
mov dptr,#tab
movc a,@a+dptr
mov p0,a
clr first
lcall delay
setb first
mov a,dispbuf+1
movc a,@a+dptr
mov p0,a
clr second
lcall delay
setb second
pop psw
pop acc
ret
delay:push psw
setb rs0
mov r7,#50
d1:mov r6,#50
djnz r6,$
djnz r7,d1
pop psw
ret
tab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh
;viic软件包程序
sta:setb vsda
setb vscl
nop
nop
nop
nop
clr vsda
nop
nop
nop
nop
clr vscl
ret
stop:
clr vsda
setb vscl
nop
nop
nop
nop
setb vsda
nop
nop
nop
nop
clr vsda
clr vscl
ret
mack:
clr vsda
setb vscl
nop
nop
nop
nop
clr vscl
setb vsda
ret
mnack:
setb vsda
setb vscl
nop
nop
nop
nop
clr vscl
clr vsda
ret
cack:
setb vsda
setb vscl
clr f0
mov c,vsda
jnc cend
setb f0
cend:clr vscl
ret
wrbyt:
mov r0,#08h
wlp:rlc a
jc wr1
ajmp wr0
wlp1:djnz r0,wlp
ret
wr1:setb vsda
setb vscl
nop
nop
nop
nop
clr vscl
clr vsda
ajmp wlp1
wr0:clr vsda
setb vscl
nop
nop
nop
nop
clr vscl
ajmp wlp1
rdbyt:mov r0,#08h
rlp:setb vsda
setb vscl
mov c,vsda
mov a,r2
rlc a
mov r2,a
clr vscl
djnz r0,rlp
ret
wrnbyt:
mov r3,numbyt
lcall sta
mov a,sla
lcall wrbyt
lcall cack
jb f0,wrnbyt
mov r1,#mtd
wrda:mov a,@r1
lcall wrbyt
lcall cack
jb f0,wrnbyt
inc r1
djnz r3,wrda
lcall stop
ret
rdnbyt:mov r3,numbyt
lcall sta
mov a,sla
lcall wrbyt
lcall cack
jb f0,rdnbyt
rdn:mov r2,#mrd
rdn1:lcall rdbyt
mov @r1,a
djnz r3,ack
lcall mnack
lcall stop
ret
ack:lcall mack
inc r1
sjmp rdn1
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -