一旦T1进入中断服务就将取反,CPL F0,同时也在每一个音符开始唱时,设置检验F0是否为一。
LCALL DELAY ;每个音符唱多久 JB F0,FOR
;是否暂停
中断延时 歌曲音频1 Y 检查位F0是否为0 N 进入循环 中断延时 歌曲音频2
歌曲播放\\暂停
6.3上一曲程序设计
通过外部中断0,INT0,下降沿触发方式,每次通过下降沿触发一次触发中断,将当前地址压栽,保护现场 PUSH DPH
PUSH DPL
判断是否指向第一曲
MOV A,22H ;曲目数送A
CJNE A,#1,QQ ;是否是第一首
;R7减4
回到上一曲首地址将R7减4 MOV A,R7
SUBB A,#4
通过查表,改变数码管显视相应歌曲的编号 MOV DPTR,#OUT_TAB
MOVC A,@A+DPTR
MOV OUT_NUM,A ;数码管显视相应歌曲的编号
14
OUT_TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH ;共阳
对即将播放的歌曲的几分拍进行调整,利用已经改变的首地址,调用节拍。最后中断返回
上一曲总程序:
LAST_SONG: PUSH ACC ;上一曲中断程序处理开始,保护现场 PUSH DPH
PUSH DPL
CLR EA ;关中断 MOV A,22H ;曲目数送A
CJNE A,#1,QQ ;是否是第一首
MOV 22H,#N ;是第一首歌曲
MOV B,#4 ;将R7指向最后一首歌曲
MOV A,#N-1 MUL AB MOV R7,A
AJMP BACK2 ;处理结束
QQ: DEC 22H MOV A,R7
SUBB A,#4 MOV R7,A
;R7减4
BACK2: MOV R4,#00H MOV A,22H
MOV DPTR,#OUT_TAB MOVC A,@A+DPTR
MOV OUT_NUM,A ;数码管显视相应歌曲的编号
;********************************************
MOV B,R0;对下首要演唱的歌曲的几分拍进行调整,同时对R0中的内容进行保护 MOV R4,#00H MOV R0,#30H
15
MOV A,R7 ADD A,R0 MOV R0,A MOV DPH,@R0 INC R0 MOV DPL,@R0 INC R0 MOV A,R4 INC R4
MOVC A,@A+DPTR
MOV 26H,A ;结果存入26H单元中 DEC R4 MOV R0,B
;R0中的内容恢复
;******************************************** POP DPL POP DPH POP ACC
SETB EA
RETI ;中断返回
;恢复现场
6.4下一曲程序设计
通过外部中断1,INT1,下降沿触发方式,每次通过下降沿触发一次触发中断,将当前地址压栈。
保护现场 PUSH DPH;
PUSH DPL;
判断是否是最后一曲
CJNE A,#N,Q ;是最后一首吗?
MOV R7,#00H
;是最后一首,则R7指向第一首,演唱第一首
通过查表,改变数码管显视相应歌曲的编号
16
MOV R4,#00H MOV A,22H
;数码管显视相应的歌曲编号
MOV DPTR,#OUT_TAB MOVC A,@A+DPTR MOV OUT_NUM,A
对下首要演唱的歌曲的几分拍进行调整,同时对R0中的内容进行保护 最后中断放回 下一曲总程序: T_SONG: PUSH ACC PUSH DPH
PUSH DPL
;关中断
;下一曲中断程序处理,保护现场
CLR EA
MOV A,22H
CJNE A,#N,Q MOV R7,#00H MOV 22H,#01H AJMP BACK
;不是最后一首,唱下一首,R7内容加4,歌曲数加1
;是最后一首吗?
;是最后一首,则R7指向第一首,演唱第一首
Q: INC 22H MOV A,R7
ADD A,#4 MOV R7,A
BACK: MOV R4,#00H MOV A,22H
;数码管显视相应的歌曲编号
MOV DPTR,#OUT_TAB MOVC A,@A+DPTR MOV OUT_NUM,A
;********************************************
MOV B,R0 ;对下首要演唱的歌曲的几分拍进行调整,同时对R0中的内容进行保护 MOV R4,#00H MOV R0,#30H
17
MOV A,R7 ADD A,R0 MOV R0,A MOV DPH,@R0 INC R0 MOV DPL,@R0 INC R0 MOV A,R4 INC R4
MOVC A,@A+DPTR
MOV 26H,A ;结果存入26H单元中 DEC R4 MOV R0,B
;恢复R0中的内容
;********************************************
POP DPL POP DPH POP ACC SETB EA
;恢复现场
RETI ;中断返回
18