⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 123.asm

📁 基于AT89C51的单片机乒乓球游戏机设计。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*************************************;
       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 + -