回 帖 发 新 帖 刷新版面

主题:我的单片机汇编程序--贪食蛇

估计是有史以来最昂贵的贪食蛇

电路板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







回复列表 (共21个回复)

21 楼

先学控制小灯一闪一闪

我来回复

您尚未登录,请登录后再回复。点此登录或注册