📄 123.asm
字号:
;*************************************;
DPARM EQU 33H ;定义延时参数地址
DisBuf EQU 6AH ;定义显示缓冲区首址
;缓冲区长6个字节6A-6F
Lheading EQU F0 ;左方上下方向标志位
Rheading EQU F1 ;右方上下方向标志位
;*************************************;预定义 EndMain:
;R0 缓冲区首地址
;R1 显示数时次数
;R2 作为左方比分,整个PLAY中都要用到
;R3 作为右方比分,整个PLAY中都要用到
;10H 即第二套的R0作为右方局分,整个PLAY中都要用到
;R6 作为难度参数DPARM的传输工具
;R5 移位循环次数
;R4 作为左方的局数
;R7 作为本方三格内
;**********************************************;中断入口程
ORG 0000H
LJMP MAIN
ORG 001BH ;定时器1(T1) TF0
INC 21H ;中断服务,中断计数器加1
MOV TH1,#0D8H
MOV TL1,#0EFH ;装极数值,形成10毫秒中断
RETI
ORG 0030H
;*************************************;
MAIN:
MOV P0,#00H ;全部置0
MOV P1,#00H
MOV 6AH ,#00H ;记分牌全0显示
MOV 6BH ,#00H
MOV 6CH ,#00H
MOV 6DH ,#00H
MOV 6EH ,#00H
MOV 6FH ,#00H
LCALL Display
NOP
NOP
ACALL Init ;开机界面
CLR Lheading ;初始左方上下状态位
CLR Rheading ;初始右方上下状态位
MOV SP,#70H ;初始化堆栈
MOV R2,#00H ;初始化左拍
MOV R3,#00H ;初始化右拍
MOV R4,#00H ;初始化左局分
MOV 10H,#00H ;初始化右局分
MOV R7,#00H ;初置移位计数器
ACALL InitSpeed ;初始化速度
Play:
JB P2.3,Jump1 ;等待左上拍开球
JB P2.2,Jump2 ;等待左下拍开球
JB P2.6,Jump3 ;等待右上拍开球
JB P2.7,Jump4 ;等待右下拍开球
AJMP Play
Jump1:
ACALL MusicInit2
AJMP Rmovru ;左上拍发球
Jump2:
ACALL MusicInit2
AJMP Rmovrd ;左下拍发球
Jump3:
ACALL MusicInit2 ;右上拍发球
AJMP Ymovlu
Jump4:
ACALL MusicInit2 ;右下拍发球
AJMP Ymovld
;**************初始化速度*************
InitSpeed:
MOV A,P2
ANL A,#03H
MOV B,#30H
MUL AB
JZ S
MOV R6,A
RET
S: MOV R6,#10 ;难度4时,赋值10
RET
;**************InitSpeed End************
;*************************************;Delay Begin
; ********20MS延时子程序*******
Delay20:
PUSH 30H
PUSH 31H
MOV 30H,#63H
D1:
MOV 31H,#63H
D2:
DJNZ 31H,D2
DJNZ 30H,D1
POP 31H
POP 30H
RET
;.....................................;1S延时子程序
Delay1S:
PUSH 32H
MOV 32H,#50
Delay1S2:
ACALL Delay20
DJNZ 32H,Delay1S2
POP 32H
RET
;*************************************;Delay End
;***********开机界面及音乐*************
Init:
MOV R0,#06H
MOV R1,#DisBuf
kjiemian:
MOV P0 ,#3CH
MOV P1,#0C3H
ACALL Delay1S ;左右方前两位亮
MOV P0,#0C3H
MOV P1,#3CH
ACALL Delay1S ;左右方两位移亮
MOV P0,#0FH
ACALL Delay1S ;左上亮
MOV P1,#0F0H
ACALL Delay1S ;右下亮
MOV P0,#0F0H
ACALL Delay1S ;左下亮
MOV P1,#0FH
ACALL Delay1S ;右上亮
MOV P0,#0FH
MOV P1,#0F0H
ACALL Delay1S ;左斜全亮
MOV P0,#0F0H
MOV P1,#0FH
ACALL Delay1S ;右斜全亮
MOV P0,#0FFH
MOV P1,#0FFH
ACALL Delay1S ;全亮
MOV P0,#00H
MOV P1,#00H
ACALL Delay1S ;全灭
MOV P0,#0FFH ;同上
MOV P1,#0FFH
ACALL Delay1S
MOV P0,#00H
MOV P1,#00H
ACALL MusicInit
RET
;********开机音乐子程序*****
MusicInit:
PUSH PSW
SETB RS1
CLR RS0
MOV TH1,#0D8H
MOV TL1,#0EFH
MOV TMOD,#10H
MOV IE,#88H
MUSIC0:
MOV DPTR,#MUSICTAB ;表头地址送DPTR
MOV 21H,#00H ;中断计数器清0
MUSIC1:
NOP
CLR A
MOVC A,@A+DPTR
JZ END0 ;是00H,则结束
CJNE A,#0FFH,MUSIC5 ;如果是休止符,往下执行
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A ;R6音符的频率
INC DPTR ; DPTR++
MOV A,#0
MOVC A,@A+DPTR ;取节拍代码送R7
MOV R7,A ;R7音符发音的时间
SETB TR1 ;启动计数
MUSIC2:
NOP
CPL P3.2 ;P3.2是音乐输出引脚
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,21H,MUSIC2 ;中断计数?(21H)=R7否?
;不等,则继续循环
MOV 21H,#00H ;等于,则取下一代码
INC DPTR
LJMP MUSIC1
MUSIC3:
NOP ;休止100毫秒
CLR TR1
MOV R2,#0DH ;R2=13
MUSIC4:
NOP
MOV R3,#0FFH ;R3=255
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0: POP PSW
RET
DEL: ;
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
;*************************************;左上右移
Rmovru:
LCALL InitSpeed
MOV P1 ,#00H ;熄灭
MOV P0,#00H
MOV A,#10H
MOV R5,#04H
Rmovru1:
RR A
MOV P0, A
MOV DPARM ,R6 ;延时系数
Rmovru2:
LCALL Delay20 ;20msDELAY
JB P2.4 ,Rmovru3 ;方向键按下改变左侧方向标志
CPL Lheading ;方向标志置反
Rmovru3:
JB P2.6 ,Rmovru5 ;右方提前按键左方得分
JB P2.7 ,Rmovru5
DJNZ DPARM ,Rmovru2 ;延时未结束则继续延时
DJNZ R5 ,Rmovru1 ;延时结束是否已经移了四次,没有则跳转到移位显示
JB Lheading , Rmovru4 ;读方向标志是否为0,是的话跳转到
AJMP Ymovrd ;跳到右下右移
Rmovru4:
AJMP Ymovru ;调到右上右移
Rmovru5:
INC R2 ;左方局分加一
AJMP JUSTICER ;
;*****************************************;左上右移END
;*****************************************;左下右移BEGIN
Rmovrd:
LCALL InitSpeed
MOV P1 ,#00H
MOV P0,#00H
MOV A,#08H
MOV R5,#04H
Rmovrd1:
RL A
MOV P0,A
MOV DPARM ,R6 ;延时系数
Rmovrd2:
LCALL DELAY20 ;20msDELAY
JB P2.4 ,Rmovrd3 ;方向键按下改变左侧方向标志
CPL Lheading ;方向标志置反
Rmovrd3:
JB P2.6 ,Rmovrd5 ;右方提前按键左方得分
JB P2.7 ,Rmovrd5
DJNZ DPARM ,Rmovrd2 ;延时未结束则继续延时
DJNZ R5 ,Rmovrd1 ;延时结束是否已经移了四次,没有则跳转到移位显示
JB Lheading , Rmovrd4 ;读方向标志是否为0,是的话跳转到
AJMP Ymovru ;跳到右上右移(跳)
Rmovrd4:
AJMP Ymovrd ;调到右下右移
Rmovrd5:
INC R2 ;左方局分加一
AJMP Justicer ;
;*****************************************;左下右移END
;*****************************************;右上右移BEGIN
Ymovru:
LCALL InitSpeed
MOV P1,#00H ;关行选,黑屏,准备刷新
MOV P0,#00H
MOV A,#10H
MOV R5,#01H
MOV R7,#03H
Ymovru1:
RR A
MOV P1 ,A
INC R5
CJNE R5 , #02H,Ymovru4
Ymovru2:
MOV DPARM ,R6 ;延时系数
Ymovru3:
LCALL DELAY20 ;20msDELAY
JB P2.6 ,Ymovru6 ;右方提前按键左方得分
JB P2.7 ,Ymovru6
DJNZ DPARM ,Ymovru3 ;延时未结束则继续延时
AJMP Ymovru1 ;右移
Ymovru4:
MOV DPARM ,R6 ;延时系数
Ymovru5: LCALL DELAY20
JB P2.6 ,Ymovru7 ;又没有击中球
NOP
NOP
DJNZ DPARM,Ymovru5
DJNZ R7,Ymovru1
Ymovru6:
INC R2 ;没有击中或提前击
AJMP JUSTICER ;
Ymovru7:
AJMP Ymovlu ;跳转到右上左移
;*****************************************;右上右移END
;*****************************************;右下右移BEGIN
Ymovrd:
LCALL InitSpeed
MOV P1 ,#00H ;灯熄灭
MOV P0,#00H
MOV A,#08H
MOV R5 ,#01H
MOV R7,#03H
Ymovrd1:
RL A
MOV P1,A
INC R5
CJNE R5 , #02H,Ymovrd4 ;没有传到最后三列
;已经到了最后三列
Ymovrd2:
MOV DPARM ,R6 ;延时系数
Ymovrd3:
LCALL DELAY20 ;20msDELAY
JB P2.6 ,Ymovrd6 ;右方提前按键左方得分
JB P2.7 ,Ymovrd6
DJNZ DPARM ,Ymovrd3 ;延时未结束则继续延时
AJMP Ymovrd1 ;右移
Ymovrd4:
MOV DPARM ,R6 ;延时系数
Ymovrd5: LCALL Delay20
JB P2.7 ,Ymovrd7 ;有没有击中球
NOP
NOP
DJNZ DPARM,Ymovrd5
DJNZ R7, Ymovrd1 ;最后三次循环
Ymovrd6:
INC R2 ;左方局分加一
AJMP Justicer ;
Ymovrd7:
AJMP Ymovld ;右下左移
;*****************************************;右下右移END
;*****************************************;右上左移BEGIN
Ymovlu:
LCALL InitSpeed
MOV P1 ,#00H ;关行选,黑屏,准备刷新
MOV P0,#00H
SETB C
MOV R5,#04H
CLR A
Ymovlu1:
RLC A
MOV P1,A
MOV DPARM ,R6 ;延时系数
Ymovlu2:
LCALL DELAY20 ;20msDELAY
JB P2.5 ,Ymovlu3 ;方向键按下改变左侧方向标志
CPL Rheading ;方向标志置反
Ymovlu3:
JB P2.2 ,Ymovlu5 ; 左方提前按键右方得分
JB P2.3 ,Ymovlu5
DJNZ DPARM ,Ymovlu2 ;延时未结束则继续延时
DJNZ R5 ,Ymovlu1 ;延时结束是否已经移了四次,没有则跳转到移位显示
JB Rheading,Ymovlu4 ;读方向标志是否为0,是的话跳转到
AJMP Rmovld ;跳到左下左移
Ymovlu4:
AJMP Rmovlu ;到左上左移
Ymovlu5:
INC R3 ;右方局分加一
AJMP Justicer ;
;*****************************************;右上左移END
;*****************************************;右下左移BEGIN
Ymovld:
LCALL InitSpeed
MOV P1 ,#00H ;关行选,黑屏,准备刷新
MOV P0,#00H
SETB C
MOV R5,#04H
CLR A
Ymovld1:
RRC A
MOV P1,A
MOV DPARM ,R6 ;延时系数
Ymovld2:
LCALL Delay20 ;20msDELAY
JB P2.5 ,Ymovld3 ;方向键按下改变左侧方向标志
CPL Rheading ;方向标志置反
Ymovld3:
JB P2.2 ,Ymovld5 ;左方提前按键右方得分
JB P2.3 ,Ymovld5
DJNZ DPARM ,Ymovld2 ;延时未结束则继续延时
DJNZ R5 ,Ymovld1 ;延时结束是否已经移了四次,没有则跳转到移位显示
JB Rheading,Ymovld4 ;读方向标志是否为0,是的话跳转到
AJMP Rmovlu ;跳到左上左移
Ymovld4:
AJMP Rmovld ;调到左下左移
Ymovld5:
INC R3 ;右方局分加一
AJMP Justicer ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -