📄 222.asm
字号:
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 + -