📄 lvdaoqu.asm
字号:
ORG 00H ;主程序起始地址
JMP START ;跳至主程序
ORG 0BH ;TIMER0中断起始地址
JMP TIM0 ;跳至TIMER0中断子程序
START: MOV TMOD,#00000001B ;设TIMER0在MODEL
MOV IE,#10000010B ;中断使能
START0: MOV 30H,#00 ;取简谱码谱指针
NEXT: MOV A,30H ;简谱码指针载入A
MOV DPTR,#TABLE ;至TABLE取简谱码
MOVC A,@A+DPTR
MOV R2,A ;取到的简谱码暂存于R2
JZ END0 ;是否取到OO(结束码)?
ANL A,#0FH ;不是,则取低4位(节拍码)
MOV R5,A ;将节拍码存入R5
MOV A,R2 ;将取到的简谱码再载入A
SWAP A ;高低4位交换
ANL A,#0FH ;取低4位(音符码)
JNZ SING ;取到的音符码是否为O?
CLR TR0 ;是,则不发音
JMP D1 ;跳至DI
SING: DEC A ;取到的音符码减1(不含O)
MOV 22H,A ;存入(22H)
RL A ;乘2
MOV DPTR,#TABLEL ;至TABLEI取相对的高位字节计数值
MOVC A,@A+DPTR
MOV TH0,A ;取到的高位字节存入TH0
MOV 21H,A ;一 ;取到的高位字节存入(21H)
MOV A,22H ;再载入取到的音符码
RL A ;乘2
INC A ; 力I{L
MOVC A,@A+DPTR ;至TABLEI取相对的低位字节计数值
MOV TL0,A ;取到的低位字节存入TL0
MOV 20H,A ;取到的低位字节存入(20H)
SETB TR0 ;启动TIMER0
D1: CALL DELAY ;基本单位时间L/4拍187毫秒
INC 30H ;取简谱码指针加1
JMP NEXT ;取F一个码
END0: CLR TR0 ;停止TIMER0
JMP START0 ;重复循环
TIM0: PUSH ACC ;将A的值暂存于堆栈
PUSH PSW ;将PSW的值暂存于堆栈
MOV TL0,20H ;重设计数值
MOV TH0,21H
CPL P1.0 ;将P10位反相
POP PSW ;至堆栈取回PSW的值
POP ACC ;至堆栈取回A的值
RETI ;返回主程序
DELAY: MOV R7,#02 ;187毫杪
D2: MOV R4,#187
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY ;决定节拍
RET
TABLEL:
DW 64021,64103,64260,64400
DW 64524,64580,64684,64777
DW 64820,64898,64968,65030
DW 65058,65110,65157
TABLE:
;1
DB 0A2H,0B2H,0D2H,0B2H,0A4H,082H,0D2H
DB 082H,0A2H,82H,72H,88H
DB 72H,82H,0A2H,82H,72H,62H,42H,62H
DB 38H,38H
;2
DB 0A4H,02H,0B2H,0A4H,84H
DB 72H,82H,72H,62H,72H,84H,72H
DB 64H,62H,12H,34H,02H,42H
DB 38H,38H
;3
DB 44H,02H,32H,44H,64H
DB 72H,82H,72H,62H,72H,84H,0A2H
DB 72H,74H,82H,0A4H,02H,0B2H
DB 0A8H,0A8H
;4
DB 082H,0B4H,0A2H,84H,82H,72H
DB 62H,72H,82H,0A2H,88H
DB 72H,74H,62H,42H,32H,32H,62H
DB 78H,78H
; 5
DB 82H,84H,72H,82H,0A2H,84H
DB 72H,82H,72H,62H,48H
DB 32H,0A2H,82H,0F2H,0A2H,0B2H,82H,72H
DB 68H,68H
;6
DB 0B2H,0B2H,0B2H,0A2H,82H,84H,02H
DB 72H,74H,62H,42H,32H,42H,62H
DB 78H,78H
DB 0A2H,0B2H,0A2H,72H,82H,84H,82H
;7
DB 72H,74H,62H,44H,64H
DB 0A8H,0A4H,02H,0A2H
DB 0A2H,0B1H,0A1H,82H,0A2H,084H,0B2H,0C2H
DB 0A2H,0B2H,0A2H,82H,78H
;8
DB 84H,72H,62H,44H,02H,62H
DB 72H,81H,71H,62H,72H,84H,02H,0A2H
DB 0B4H,02H,82H,74H,82H,72H
DB 68H,68H
DB 00
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -