主题:我的单片机汇编程序--贪食蛇
电路板4元
89c51 7元
8×8的ped板 10元(被骗了吗)
三极管 2元
晶振 1元
程序价钱无法估计
我的程序是用20h-27h做屏幕的对应点 刚好64个bit
显示模块读出20h-27h的数据 显示出来
28h和以上每个字节 记录点的坐标(28h是蛇的尾部)
每次运动将28h数据的对应坐标 在屏幕上请零,使尾部消失
从 29h-> 28h 30h->29h …………
然后把新的头部放到高位 对应的坐标置1
org 00h
ljmp main
org 0bh
ljmp time
org 30h
main: mov sp,#0a0h
lcall rst1
stp1: lcall show
sjmp stp1
rst1: clr rs0
clr rs1
mov r0,#20h
mov r1,#08h
mov a,#00h
mloop: mov @r0,a
inc r0
djnz r1,mloop
mov r3,#0fbh
mov r2,#2bh
mov dpl,#63h
mov 28h,#03h
mov 29h,#13h
mov 2ah,#23h
mov 2bh,#33h
mov 2ch,#43h
mov 2dh,#53h
mov 23h,#4fh
mov p1,#0ffh
mov tmod,#22h
mov th0,#00h
mov th1,#11h
mov ie,#00h
setb ea
setb et0
setb tr0
setb tr1
ret
show: setb rs0 ;显示模块
setb rs1
mov r1,#08h
mov r0,#20h
mov p2,#080h
loop: mov a,@r0
inc r0
cpl a
mov p0,a
lcall delay
mov a,p2
rr a
mov p2,a
djnz r1,loop
ret
delay: push psw
setb rs0
clr rs1
mov r2,#05h
wait: djnz r3,$
mov r3,#0f0h
djnz r2,wait
pop psw
ret
time: push psw ;时间中断模块
push acc
clr rs0
clr rs1
djnz r6,out
mov r6,#0ffh
djnz r7,out
lcall move
mov r7,#010h
out: pop acc
pop psw
reti
move: clr p3.0 ;运动模块
mov a,28h
lcall pset ;清除尾部
mov a,r2
mov r0,a
mov a,@r0
mov b,#10h
div ab
mov r4,a
mov r5,b
mov a,p1 ;按键接收模块
cjne a,#0ffh,go2
go1: mov a,r3
ljmp nxt0
go2: mov a,r3
n0: jb acc.0,n1
jb p1.2,n1
sjmp go1
n1: jb acc.2,n2
jb p1.0,n2
sjmp go1
n2: jb acc.3,n3
jb p1.1,n3
sjmp go1
n3: jb acc.1,n4
jb p1.3,n4
sjmp go1
n4: mov a,p1
nxt0: jb acc.0,nxt1
dec r4
ljmp actn
nxt1: jb acc.2,nxt2
inc r4
ljmp actn
nxt2: jb acc.1,nxt3
inc r5
ljmp actn
nxt3: dec r5
actn: clr c
mov r3,a
mov p1,#0ffh
cjne r4,#08h,checkx ;出界判断
ljmp stay
checkx: jnc stay
clr c
cjne r5,#08h,checky
ljmp stay
checky: jnc stay
actn1: mov a,r4
mov b,#10h
mul ab
add a,r5
mov r4,a
mov a,dpl ;吃东西判断
clr c
subb a,r4
cjne a,#00h,cpar
inc r2 ;蛇身增长
mov a,r2
mov r0,a
mov a,r4
mov @r0,a
lcall new ;产生新的食物
ret
cpar: mov r0,#29h ;自身碰撞检测
mov a,r2
subb a,r0
mov r1,a
dec r1
blop: mov a,@r0
clr c
subb a,r4
cjne a,#00h,tmp
ljmp stay
tmp: inc r0
djnz r1,blop
mov a,r2 ;坐标的移位
subb a,#28h
mov r6,a
mov r0,#28h
mov r1,#29h
block: mov a,@r1
mov @r0,a
inc r0
inc r1
djnz r6,block
mov a,r4
mov @r0,a
setb p3.0 ;画出蛇头
mov a,r2
mov r0,a
mov a,@r0
lcall pset
ret
stay: clr tr0
ret
pset: push psw 画点 消点模块
setb rs0
clr rs1
mov b,#010h
div ab
mov r4,a
inc r4
mov r5,b
mov a,#20h
add a,r5
mov r0,a
jb p3.0,stb1
mov a,#07fh
sjmp left1
stb1: mov a,#080h
left1: rl a
djnz r4,left1
jb p3.0,stb2
anl a,@r0
sjmp ok
stb2: orl a,@r0
;here1: sjmp $
ok: mov @r0,a
pop psw
ret
new: clr tr1 ;食物产生模块
mov r5,tl1
begin: inc r5
mov a,r5
anl a,#77h
mov r4,a
mov r0,#28h
mov a,r2
subb a,r0
mov r1,a
inc r1
nlop: mov a,@r0
clr c
subb a,r4
cjne a,#00h,ntmp
ljmp begin
ntmp: inc r0
djnz r1,nlop
mov dpl,r4
mov a,r4
setb p3.0
lcall pset
setb tr1
ret
end