📄 222.asm
字号:
;击球音乐*
;*********
;*****************************************MusicInit2 Begin
MusicInit2:
CLR RS1 ;使用第一套寄存器
SETB RS0
MOV TH0 ,#0D8H
MOV TL0 ,#0EFH
MOV TMOD,#01H
MOV IE ,#82H
MUSIC02:
MOV DPTR,#MusicTab3 ;表头地址送DPTR
MOV 20H ,#00H ;中断计数器清0
MUSIC12:
NOP
CLR A
MOVC A ,@A+DPTR
JZ END02 ;是00H,则结束
CJNE A ,#0FFH,MUSIC52 ;如果是休止符,往下执行
LJMP MUSIC32
MUSIC52:
NOP
MOV R6 ,A ;R6音符的频率
INC DPTR ; DPTR++
MOV A ,#0
MOVC A ,@A+DPTR ;取节拍代码送R7
MOV R7 ,A ;R7音符发音的时间
SETB TR0 ;启动计数
MUSIC22:
NOP
CPL P3.3 ;P3.3是音乐输出引脚
MOV A ,R6
MOV R3 ,A
LCALL DEL2
MOV A ,R7
CJNE A ,20H,MUSIC22 ;中断计数器(20H)=R7否?
;不等,则继续循环
MOV 20H ,#00H ;等于,则取下一代码
INC DPTR
LJMP MUSIC12
MUSIC32:
NOP ;休止100毫秒
CLR TR0
MOV R2 ,#0DH ;R2=13
MUSIC42:
NOP
MOV R3 ,#0FFH ;R3=255
LCALL DEL2
DJNZ R2 ,MUSIC42
INC DPTR
LJMP MUSIC12
END02:
CLR RS0 ;换回第0套寄存器
CLR RS1
RET
DEL2: ;
NOP
DEL32:
MOV R4 ,#02H
DEL42:
NOP
DJNZ R4 ,DEL42
NOP
DJNZ R3 ,DEL32
RET
;*****************************************MusicInit2 End
;*************
;得分奖励音乐*
;*************
;*****************************************Musicsuccess Begin
Musicsuccess:
CLR RS1 ;使用第一套寄存器
SETB RS0
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
MOV IE ,#82H
MUSIC04:
MOV DPTR,#MusicTab4 ;表头地址送DPTR
MOV 20H,#00H ;中断计数器清0
MUSIC14:
NOP
CLR A
MOVC A ,@A+DPTR
JZ END04 ;是00H,则结束
CJNE A ,#0FFH,MUSIC54 ;如果是休止符,往下执行
LJMP MUSIC34
MUSIC54:
NOP
MOV R6 ,A ;R6音符的频率
INC DPTR ; DPTR++
MOV A ,#0
MOVC A ,@A+DPTR ;取节拍代码送R7
MOV R7 ,A ;R7音符发音的时间
SETB TR0 ;启动计数
MUSIC24:
NOP
CPL P3.3 ;P3.3是音乐输出引脚
MOV A ,R6
MOV R3 ,A
LCALL DEL5
MOV A ,R7
CJNE A ,20H,MUSIC24 ;中断计数器(20H)=R7否?
;不等,则继续循环
MOV 20H,#00H ;等于,则取下一代码
INC DPTR
LJMP MUSIC14
MUSIC34:
NOP ;休止100毫秒
CLR TR0
MOV R2 ,#0DH ;R2=13
MUSIC44:
NOP
MOV R3 ,#0FFH ;R3=255
LCALL DEL5
DJNZ R2 ,MUSIC44
INC DPTR
LJMP MUSIC14
END04:
CLR RS0 ;换回第0套寄存器
CLR RS1
RET
DEL5: ;
NOP
DEL34:
MOV R4 ,#02H
DEL44:
NOP
DJNZ R4 ,DEL44
NOP
DJNZ R3 ,DEL34
RET
;*****************************************Musicsuccess End
;*****************************************MusicInit1 Begin
MusicInit1:
CLR RS1 ;使用第一套寄存器
SETB RS0
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
MOV IE ,#82H
MUSIC01:
MOV DPTR,#MusicTab2 ;表头地址送DPTR
MOV 20H,#00H ;中断计数器清0
MUSIC11:
NOP
CLR A
MOVC A ,@A+DPTR
JZ END01 ;是00H,则结束
CJNE A ,#0FFH,MUSIC51 ;如果是休止符,往下执行
LJMP MUSIC31
MUSIC51:
NOP
MOV R6 ,A ;R6音符的频率
INC DPTR ; DPTR++
MOV A ,#0
MOVC A ,@A+DPTR ;取节拍代码送R7
MOV R7 ,A ;R7音符发音的时间
SETB TR0 ;启动计数
MUSIC21:
NOP
CPL p3.3 ;P3.3是音乐输出引脚
MOV A ,R6
MOV R3 ,A
LCALL DEL1
MOV A ,R7
CJNE A ,20H,MUSIC21 ;中断计数器(20H)=R7否?
;不等,则继续循环
MOV 20H,#00H ;等于,则取下一代码
INC DPTR
LJMP MUSIC11
MUSIC31:
NOP ;休止100毫秒
CLR TR0
MOV R2 ,#0DH ;R2=13
MUSIC41:
NOP
MOV R3 ,#0FFH ;R3=255
LCALL DEL1
DJNZ R2 ,MUSIC41
INC DPTR
LJMP MUSIC11
END01:
CLR RS0 ;换回第0套寄存器
CLR RS1
RET
DEL1: ;
NOP
DEL31:
MOV R4 ,#02H
DEL41:
NOP
DJNZ R4,DEL41
NOP
DJNZ R3,DEL31
RET
;*****************************************MusicInit1 End
;*******
;数据表*
;*******
;*****************************************Tables Begin
;.....................................;Table for Music
MUSICTAB:
DB 18H, 30H, 1CH, 10H
DB 20H, 40H, 1CH, 10H
DB 18H, 10H, 20H, 10H
DB 1CH, 10H, 18H, 40H
DB 1CH, 20H, 20H, 20H
DB 1CH, 20H, 18H, 20H
DB 20H, 80H, 0FFH, 20H
DB 30H, 1CH, 10H , 18H
DB 20H, 15H, 20H , 1CH
DB 20H, 20H, 20H , 26H
DB 40H, 20H , 20H , 2BH
DB 20H, 26H, 20H , 20H
DB 20H, 30H , 80H , 0FFH
DB 20H, 20H, 1CH , 10H
DB 18H, 10H, 20H , 20H
DB 26H, 20H , 2BH , 20H
DB 30H, 20H ,00H
MusicTab2:
DB 14H,10H,12H,10H,10H,10H,12H,04H,10H,10H,12H,04H,10H,10H,12H,10H
DB 10H,10H,0DH,10H,0CH,10H,10H,10H,12H,04H,10H,10H,12H,04H,10H,10H
DB 12H,10H,14H,10H,21H,10H,10H,10H,0CH,10H,10H,10H
DB 12H,20H,14H,04H,12H,10H,10H,10H,12H,20H,14H,10H,12H,40H,0FFH
DB 18H,10H,20H,04H,18H,10H,20H,04H,18H,10H,1BH,10H,18H,10H,14H,20H,12H,10H
DB 10H,10H,12H,04H,10H,10H,12H,04H,10H,10H,12H,10H,10H,10H,1BH,10H,0FFH
DB 18H,10H,1BH,10H,18H,10H,14H,10H,12H,10H,10H,10H,12H,10H
DB 14H,10H,12H,60H,00H
MusicTab3:
DB 14H,10H,12H,60H,00H
MusicTab4:
DB 18H,10H,1BH,10H,18H,10H,14H,10H,12H,10H,10H,10H,12H,10H,00H
;*****************************************Tables End
;**********************
;MAX7219初始化及显示 *
;完成初始化后,LED全黑*
;**********************
;*****************************************LedInit Begin
;.................MAX7219初始化............begin
LedInit:CLR P0.1 ;CLK=0
CLR P0.2 ;LOAD=0
MOV A,#0CH ;关闭显示
MOV B,#00H
LCALL INPUT
MOV A,#09H ;非译码模式
MOV B,#00H
LCALL INPUT
MOV A,#0BH ;显示6*LED
MOV B,#05H
LCALL INPUT
MOV A,#0AH ;亮度占空比31/32
MOV B,#0FH ;显示测试寄存器为正常显示方式
LCALL INPUT
MOV A,#0FH ;显示测试寄存器为正常显示方式
MOV B,#00H
LCALL INPUT
MOV A,#0CH ;开始显示
MOV B,#01H
LCALL INPUT
;.................MAX7219显示.................
MOV R1,#06H ;置循环次数
DISP: MOV A,R1 ;DIG5~DIG0地址
MOV B,#00H ;SEG5~SEG0数据
LCALL INPUT ;LED显示
DJNZ R1,DISP
RET
INPUT: LCALL INPUTA ;传送寄存器地址字节
LCALL INPUTB ;传头寄存器数据字节
SETB P0.2 ;LOAD=1
NOP
NOP
CLR P0.2 ;LOAD=0
RET
INPUTA: MOV R0,#08H ;每个地址或数据均为八为二进制数,按位分八次送入
INPUT1: RLC A
JNC INLOW
SETB P0.0 ;DIN=1
NOP
INPUT2: SETB P0.1 ;CLK=1
NOP
NOP
CLR P0.1 ;CLK=0
DJNZ R0,INPUT1
RET
INLOW: CLR P0.0 ;DIN=0
SJMP INPUT2
INPUTB: MOV A,B
SJMP INPUTA
LedTab:DB 7EH,30H,6DH,79H,33H,5BH,5FH,70H,7FH,7BH,36H,77H,4EH,4FH,47H,37H,0EH,67H,00H,0B0H ;LED显示用字码表
; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, A, C, E, F, H, L, P, 黑,1.;
;.................MAX7219初始化...............end
;*****************************************LedInit End
;**********
;开机画面 *
;**********
;*****************************************ShowInit Begin
;.....初始化......;
ShowInit:MOV 20H,#00H ;清标志,00H开始扫描标志,01H为1帧,扫描结束标志
MOV A ,#0FFH ;端口初始化
MOV P1 ,A
MOV P2 ,A
MOV P3 ,A
MOV P0 ,A
CLR P1.6 ;串行寄存器输入打入输出控制位
CLR P1.3
MOV TMOD,#01H ;使用T0作16位定时器,行扫描用
MOV TH0,#0F8H ;定时器每次中断为1ms初值(24MHz)65536-1m*(24M/12)=63536
MOV TL0,#30H
MOV SCON,#00H ;串行口控制字,0方式传送显示字节
MOV IE ,#82H ;T0中断允许,总中断允许
MOV SP ,#70H
MOV DPTR,#ShowTab
LCALL MOVDISP ;向上滚动显示“欢迎”“光临”
;
;******************;
;多字滚动显示子程序;
;******************;
;每次8个字,入口是定义好DPTR值;
;
MOVDISP:MOV B ,#00H ;向上移动显示,查表偏址暂存(从00开始)
DISLOOP:MOV R3 ,#0EH ;移动速度,每一帧显示14次;R3越大,每幅画面停留的时间就越长
DISMOV: MOV R2 ,#00H ;第0行开始
MOV R1 ,B
SETB TR0 ;开扫描(每次一帧)
WAITMOV:JBC 01H,DISMOV1 ;标志为1扫描一帧结束(8ms为1帧,每行1ms)
AJMP WAITMOV
DISMOV1:DJNZ R3 ,DISMOV ;一帧重复显示(控制每个字向上移动的速度,14帧*8ms/帧=0.112s上移一行)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -