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

📄 222.asm

📁 单片机控制的乒乓游戏的全部程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
          MOV   28H,A
          MOV   A  ,26H
          ADD   A  ,B
          MOV   B  ,#3
          MUL   AB
          MOV   B  ,#10
          DIV   AB                 ;完成(26H)*3/10
          ADD   A  ,28H            ;完成(25H)*4/10+(26H)*3/10
          MOV   28H,A
          MOV   A  ,27H
          ADD   A  ,B
          MOV   B  ,#3
          MUL   AB
          MOV   B  ,#10
          DIV   AB
          ADD   A  ,28H            ;完成(25H)*4/10+(26H)*3/10+(27H)*3/10
          MOV   26H,A              ;完成对26H的修改
;..................................................接球成功,球现在返回
;......................先显示回球时的第一列的小灯
          SETB  P1.7               ;关行显示
          CLR   P1.6               ;为送列数据作准备
;.......................由R4确定发球方
          MOV   A  ,R4
          ANL   A  ,#04H           ;取R4的低四位
          MOV   R4 ,A
          CJNE  A  ,#0EH,ShootB2   ;R4不为XEH,即不是A发球,转
          MOV   R0 ,#7EH           ;R0为第一组列数据
          MOV   R1 ,#0FFH          ;R1为第二组列数据
          MOV   R2 ,#00H           ;R2为第一行数据
          LJMP  Shootout
ShootB2:  CJNE  A  ,#0DH,ShootC2   ;R4不为XDH,即不是B发球,转
          MOV   R0 ,#7EH           ;R0为第一组列数据
          MOV   R1 ,#0FFH          ;R1为第二组列数据
          MOV   R2 ,#07H           ;R2为第七行数据
          LJMP  Shootout2
ShootC2:  CJNE  A  ,#0BH,ShootD2   ;R4不为XBH,即不是C发球,转
          MOV   R0 ,#0FFH          ;R0为第一组列数据
          MOV   R1 ,#0FEH          ;R1为第二组列数据
          MOV   R2 ,#00H           ;R2为第一行数据
          LJMP  Shootout2
ShootD2:
          MOV   R0 ,#0FFH          ;R0为第一组列数据
          MOV   R1 ,#0FEH          ;R1为第二组列数据
          MOV   R2 ,#07H           ;R2为第七行数据
;......................送行列显示信号
Shootout2:MOV   SBUF,R1            ;串口0方式发送
WAITA2:   JBC   TI ,GO32           ;等待发送完毕
          AJMP  WAITA2
GO32:     MOV   SBUF,R0
WAITB2:   JBC   TI ,GO42
          AJMP  WAITB2             ;列数据送完了
GO42:     MOV   A  ,R2
          ORL   A  ,#0F0H
          MOV   R2 ,A
          MOV   A  ,P1
          ORL   A  ,#0FH
          ANL   A  ,R2
          MOV   P1 ,A              ;修改行数据
          SETB  P1.6               ;送列数据
          NOP
          NOP
          CLR   P1.7               ;开行扫描
;......................播放击球音乐
          ACALL MusicInit2         ;击球音乐
;......................检测有无改向
          MOV   27H,#00H           ;27H字节单元为击球改向所用的单位延迟时间间隔
CHECK3:   ACALL Delay10ms          ;单位延迟时间间隔10ms
          INC   27H
          MOV   A  ,26H            ;26H字节单元的内容作为击球改向上限次数
          CLR   C
          SUBB  A  ,27H
          JC    CHECK3             ;按键太晚了,超过上限,改向失败,转
          MOV   A  ,P1
          ORL   A  ,#0F0H
          XRL   A  ,R4
          JNZ   CHECK3             ;A为0表示按键没有改向,时间允许的范围内,继续查询
          MOV   28H,#00H           ;28H字节单元记录按键按下到解除所用延迟次数
;......................球返回
          ACALL Moveon             ;球向对手方移动
TAKEONEND1:ACALL Musicsuccess      ;得分奖励音乐
          RET                      ;一方接球失败,返回修改比分或局分
;*****************************************Shootback End











;**********************
;比分,局分修改及     *
;得分,胜负判定程序   *
;**********************
;*****************************************Score Begin
Score:   MOV  DPTR,#LedTab       ;指向LED数据表
;....................................哪一方得分判定
         MOV  A  ,R4             ;
         ANL  A  ,03H
         CJNE A  ,#03H,GETAB     ;R4不是C,D,即A,B方输球,C,D得分,转
;.......................A,B方得分
         INC  2AH
         CLR  C
         MOV  A  ,2AH
         CJNE A  ,10H,SCORE10
         CJNE A  ,11H,SCORE11
         MOV  A  ,2AH
         MOVC A  ,@A+DPTR
         MOV  B  ,A
         MOV  A  ,#02H
         LCALL INPUT             ;A,B方得分不超过9分,修改第二个LED的显示数据
         AJMP CHECKOUT1          ;转入修改R4
SCORE11: MOV  A  ,#02H
         MOV  B  ,#30H
         LCALL INPUT
SCORE10: MOV  A  ,#01H
         MOV  B  ,#30H
         LCALL INPUT             ;SCORE10修改第一个LED为1,SCORE11修改第一,二个LED为1
CHECKOUT1:MOV  A  ,2AH
         CJNE A  ,2EH ,GAMESCORE ;A,B方该局得分已满,转去对局分进行处理
         AJMP MODIFYR4
;.......................C,D方得分
GETAB:   INC  2BH
         CLR  C
         MOV  A  ,2BH
         CJNE A  ,10H,SCORE102
         CJNE A  ,11H,SCORE112
         MOV  A  ,2BH
         MOVC A  ,@A+DPTR
         MOV  B  ,A
         MOV  A  ,#06H
         LCALL INPUT             ;A,B方得分不超过9分,修改第二个LED的显示数据
         AJMP CHECKOUT2          ;转入修改R4
SCORE112:MOV  A  ,#06H
         MOV  B  ,#30H
         LCALL INPUT
SCORE102:MOV  A  ,#05H
         MOV  B  ,#30H
         LCALL INPUT             ;SCORE10修改第一个LED为1,SCORE11修改第一,二个LED为1
CHECKOUT2:MOV  A  ,2BH
         CJNE A  ,2EH ,GAMESCORE ;C,D方该局得分已满,转去对局分进行处理
         AJMP MODIFYR4

;.........................修改R4,实现交换发球
MODIFYR4:MOV  A  ,R7
         CJNE A  ,#00H,DOUBLE      ;是双打,转
         CPL  02H
         JB   02H,SINGLEC
         MOV  R4 ,0FEH             ;改为A键
         RET
SINGLEC: MOV  R4 ,0FBH             ;改为C键
         RET
DOUBLE:  CPL  02H
         JB   02H,DOUBLE2
         JB   03H,DOUBLE3
         MOV  R4 ,0F7H             ;改为D键
         RET
DOUBLE3: MOV  R4 ,0FDH             ;改为B键
         RET
DOUBLE2: CPL  03H
         JB   03H,DOUBLE4
         MOV  R4 ,0FBH             ;改为C键
         RET
DOUBLE4: MOV  R4 ,0FEH             ;改为A键
         RET
;.......................修改局分
GAMESCORE:MOV A  ,2AH
         CJNE A  ,2EH,GAMECD       ;C,D方得胜一局,转
         INC  2CH
         MOV  A  ,2CH
         CJNE A  ,2FH,GAMEAB       ;并未获胜,转
         AJMP GAMEWIN
GAMECD:  INC  2DH
         MOV  A  ,2DH
         CJNE A  ,2FH,GAMEAB       ;并未获胜,转
GAMEWIN: SETB 05H                  ;置获胜标志
         ACALL MusicInit1          ;胜利音乐
         ACALL MusicInit1          ;再来一次
         LCALL Showwin             ;胜利画面显示
         RET
GAMEAB:  SETB  04H
         MOV  B  ,7EH              ;送0
         MOV  A  ,01H
         ACALL INPUT
         MOV  B  ,7EH              ;送0
         MOV  A  ,02H
         ACALL INPUT
         MOV  B  ,7EH              ;送0
         MOV  A  ,05H
         ACALL INPUT
         MOV  B  ,7EH              ;送0
         MOV  A  ,06H
         ACALL INPUT
;*****************************************Score End









;**************延时子程序******************
; 设计的延时规格有:10ms,0.1s,0.2s,0.5s,1s *
; 动用了位30H,31H,32H,33H,34H,35H,        *
; 采用出入栈操作,                         *
; 对其在其他地方的使用均无影响            *
;******************************************
;*****************************************Delay Begin
;..............................................;10ms延时子程序
;
Delay10ms:
       PUSH 30H
       PUSH 31H
       MOV  30H,#63H
D1:
       MOV  31H,#63H
D2:
       DJNZ 31H,D2
       DJNZ 30H,D1
       POP 31H
       POP 30H
       RET
;
;.....................................;

;.....................................;100ms即0.1s延时子程序
;
Delay100ms:
       PUSH 32H
       MOV 32H,#10
Delay100ms2:
       ACALL Delay10ms
       DJNZ 32H,Delay100ms2
       POP 32H
       RET
;
;.....................................;

;.....................................;200ms即0.2s延时子程序
;
Delay200ms:
       PUSH 33H
       MOV 32H,#20
Delay200ms2:
       ACALL Delay10ms
       DJNZ  33H,Delay200ms2
       POP   33H
       RET
;
;.....................................;

;.....................................;500ms即0.5s延时子程序
;
Delay500ms:
       PUSH 34H
       MOV  34H,#50
Delay500ms2:
       ACALL Delay10ms
       DJNZ  34H,Delay500ms2
       POP   34H
       RET
;
;.....................................;

;.....................................;1s延时子程序
;
Delay1s:
       PUSH 35H
       MOV  35H,#100
Delay1s2:
       ACALL Delay10ms
       DJNZ  35H,Delay1s2
       POP   35H
       RET
;
;*****************************************Delay End







;*****************
;  四种音乐程序  *
;*****************

;***************
;开机音乐子程序*
;***************
;*****************************************MusicInit Begin
MusicInit:
       CLR  RS1                     ;使用第一套寄存器
       SETB RS0
       MOV  TH0 ,#0D8H
       MOV  TL0 ,#0EFH
       MOV  TMOD,#01H
       MOV  IE  ,#82H
MUSIC0:
       MOV  DPTR,#MusicTab          ;表头地址送DPTR
       MOV  20H ,#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 TR0                     ;启动计数
MUSIC2:
       NOP
       CPL  P3.3                    ;P3.3是音乐输出引脚
       MOV  A   ,R6
       MOV  R3  ,A
       LCALL DEL
       MOV  A   ,R7
       CJNE A,20H,MUSIC2            ;中断计数器(20H)=R7否?
                                    ;不等,则继续循环
       MOV  20H ,#00H               ;等于,则取下一代码
       INC  DPTR
       LJMP MUSIC1
MUSIC3:
       NOP                          ;休止100毫秒
       CLR  TR0
       MOV  R2  ,#0DH ;R2=13
MUSIC4:
       NOP
       MOV  R3  ,#0FFH ;R3=255
       LCALL DEL
       DJNZ R2  ,MUSIC4
       INC  DPTR
       LJMP MUSIC1
END0:
       CLR  RS0                     ;换回第0套寄存器
       CLR  RS1
       RET
DEL:                                ;
       NOP
DEL3:
       MOV  R4  ,#02H
DEL4:
       NOP
       DJNZ R4  ,DEL4
       NOP
       DJNZ R3  ,DEL3
       RET

;*****************************************MusicInit End

;*********

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -