📄 music.asm
字号:
;好使的程序
;先闪烁8下
;唱生日快乐歌两次
;跑马闪烁
;再来一遍
ORG 0000H
AJMP START
ORG 000BH
JMP TIM0
ORG 0030H
START: LCALL SD ;闪灯程序
MOV P1,#00H ;演奏时保持灯全亮
MAIN: ;唱歌主程序
MOV TMOD,#01H ;设定时方式
MOV IE,#82H ;开中断
START0:
MOV 30H,#00H ;
NEXT:MOV A,30H
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;查表取音调和节拍
MOV R2,A
JZ END0 ;为零,不进行处理.
ANL A,#0FH
MOV R5,A ;将节拍存入R5
MOV A,R2
SWAP A
ANL A,#0FH
JNZ SING ;根据音调决定是否演奏.
CLR TR0
JMP D1
SING:DEC A
MOV 22H,A ;将音调存入22H.
RL A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR ;根据音调决定定时器初值.
MOV TH0,A ;放入TH0
MOV 21H,A
MOV A,22H
RL A
INC A
MOVC A,@A+DPTR
MOV TL0,A ;放入TL0
MOV 20H,A
SETB TR0 ;启动定时
D1: CALL DELAY
INC 30H
JMP NEXT
END0:CLR TR0
JMP TT ;决定是否重新演奏音乐,即音乐的次数
TIM0: ;定时器中断服务程序
PUSH ACC
PUSH PSW
MOV TL0,20H ;重赋初值.
MOV TH0,21H
CPL P3.1
POP PSW
POP ACC
RETI
DELAY:MOV R7,#02H ;延时子程序
D2: MOV R4,#187
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY
RET
TABLE1: ;决定音调的定时初值.
DW 64260,64400,64524,64580
DW 64684,64777,64820,64898
DW 64968,65030,65058,65110
DW 65157,65178,65217
TABLE: ;决定音调和节拍的表格,不同的歌曲只是此表不同
;1
DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H,82H,01H,81H,94H,84H,0C4H,0B4H,04H
;2
DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H,0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H
;3
DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H,82H,01H,81H,94H,84H,0C4H,0B4H,04H
;4
DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H,0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00
TT: MOV A,#0FEH
LCALL LOP1
LCALL LOP2
LCALL LOP3
LCALL LOP4
LJMP START
RET
TY:MOV P1,#0FFH ;一定要有下面部分不然程序会停在lop1,灭灯程序不要
LCALL DELAYX
LCALL DELAYX
LCALL DELAYX
;必须加上返回主函数,不然程序会顺序执行DELAY子程序
SD: MOV 23H,#8 ;23,闪灯5CI程序,闪烁次数
LCALL MAIN1
RET
MAIN1:
MOV P1,#00H
LCALL DELAYX
LCALL DELAYX
MOV P1,#0FFH
LCALL DELAYX
LCALL DELAYX
DJNZ 23H,MAIN1 ;会顺序执行
RET
LOP1:MOV 25H,#168 ;168跑马灯的次数,一圈为8,21圈
ZP:MOV P1,A
RL A
LCALL DELAYX
DJNZ 25H,ZP
RET
LOP2:MOV 27H,#168 ;跑马的次数
FP:MOV P1,A
RR A
LCALL DELAYX
DJNZ 27H,FP
RET
LOP3:MOV 29H,#16
ZP1:MOV P1,A
RL A
LCALL DELAYX
DJNZ 29H,ZP1
RET
LOP4:MOV 31H,#16
FP1:MOV P1,A
RR A
LCALL DELAYX
DJNZ 31H,FP1
RET
DELAYX:MOV R1,#200
D1X: MOV R6,#200
D2X: DJNZ R6,D2X
DJNZ R1,D1X
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -