📄 11.txt
字号:
ORG 00H ;初始化程序
AJMP START
ORG 0BH
LJMP TIM0
START: MOV TMOD,#00000001B ;主程序
MOV IE,#10000010B
JB P3.5, $ ;第一次有按键
CALL DELAY1
JNB P3.5, $
MOV 31H,#00 ;按键次数指针赋初值
START0: MOV 30H,#SONG1 ;取简谱码指针(第一首)
NEXT: MOV A,30H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R2,A
JZ END0 ;检查简谱码是否已结束
ANL A,#0FH ;取节拍码
MOV R5,A
MOV A,R2
SWAP A
ANL A,#0FH ;取音符码
JNZ SING ;是否为0,是0不发音
CLR TR0
AJMP D1
SING: DEC A ;因0不列入
MOV 22H,A
RL A
MOV DPTR,#TABLE ;至TABLE取定时器计数值
MOVC A,@A+DPTR
MOV TH0,A
MOV 21H,A
MOV A,22H
RL A
INC A
MOVC A,@A+DPTR
MOV TL0,A
MOV 20H,A
SETB TR0
D1: ACALL DELAY
INC 30H
AJMP NEXT ;取下一简谱码
END0: CLR TR0
MOV A,31H ;载入计次指针
XRL A,#00H
JNZ END1
JB P3.5,$
CALL DELAY1
JNB P3.5,$
INC 31H
MOV 30H,#SONG2 ;按第二次放第二首歌
JMP NEXT
END1:
MOV A,31H
XRL A,#01H
JNZ END2
JB P3.5,$
CALL DELAY1
JNB P3.5,$
INC 31H
MOV 30H,#SONG3 ;按第三次放第三首歌
JMP NEXT
END2:
MOV A,31H
XRL A,#02H
JNZ END3
JB P3.5,$
CALL DELAY1
JNB P3.5,$
INC 31H
MOV 30H,#SONG4 ;按第四次放第四首歌
JMP NEXT
END3:
MOV A,31H
XRL A,#03H
JNZ END4
JB P3.5,$
CALL DELAY1
JNB P3.5,$
INC 31H
MOV 30H,#SONG5 ;按第五次放第五首歌
JMP NEXT
END4:
MOV A,31H
XRL A,#04H
JNZ END5
JB P3.5,$
CALL DELAY1
JNB P3.5,$
INC 31H
MOV 30H,#SONG6 ;按第六次次放第六首歌
JMP NEXT
END5:
JMP START
TIM0: PUSH ACC ;定时器T0子程序
PUSH PSW
SETB RS0
CLR RS1
MOV TL0,20H
MOV TH0,21H
CPL P2.7
POP PSW
POP ACC
RETI
DELAY: ;延时子程序
MOV R7,#02
D2: MOV R4,#125
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY
RET
DELAY1:
MOV R4,#20
D4: MOV R3,#248
DJNZ R3,$
DJNZ R4,D4
RET
ORG 300H
;定时常数T值表
TABLE:
DW 64260,64400,64524,64580
DW 64684,64777,64820,64898
DW 64968,65030,65058,65110
DW 65157,65178,65217
;音符节拍码数据表
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -