?? music.asm
字號:
;程序:生日快樂歌!
$INCLUDE(C8051F020.INC)
ORG 0000H
LJMP START
ORG 0BH ;TIMER0中斷起始地址
JMP TIM0 ;跳至TIMER0中斷子程序
ORG 0100H
START:
mov WDTCN, #0deh ; disable watchdog timer 禁止看門狗定時器
mov WDTCN, #0adh
mov OSCXCN, #67h ; enable external crystal 外部晶振
; oscillator at 22.1184MHz
clr A ; wait at least 1ms 延時1ms
djnz acc, $ ; wait ~512us
djnz acc, $ ; wait ~512us
orl OSCXCN, #80h
PORTINIT: mov XBR2, #044h ; 弱上拉允許,交叉開關允許
MOV TMOD,#00000001B ;設TIMER0在MODE1
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 ;是否取到00(結束碼)?
ANL A,#0FH ;不是,則取低4位(節拍碼)
MOV R5,A ;將節拍碼存入R5
MOV A,R2 ;將取到的簡譜碼再載入A
SWAP A ;高低4位交換
ANL A,#0FH ;取低4位(音符碼)
JNZ SING ;取到的音符碼是否為0?
CLR TR0 ;是,則不發音
JMP D1 ;跳至D1
SING: DEC A ;取到的音符碼減1(不含0)
MOV 22H,A ;存入(22H)
RL A ;乘2
MOV DPTR,#TABLE1 ;至TABLE1取相對的高位字節計數值
MOVC A,@A+DPTR
MOV TH0,A ;取到的高位字節存入TH0
MOV 21H,A ;取到的高位字節存入(21H)
MOV A,22H ;再載入取到的音符碼
RL A ;乘2
INC A ;加1
MOVC A,@A+DPTR ;至TABLE1取相對的低位字節計數值
MOV TL0,A ;取到的低位字節存入TL0
MOV 20H,A ;取到的低位字節存入(20H)
SETB TR0 ;啟動TIMER0
D1: CALL DELAY ;基本單位時間1/4拍187毫秒
INC 30H ;取簡譜碼指針加1
JMP NEXT ;取下一個碼
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
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
DB 0B4H,0A4H,04H
DB 82H,01H,81H,94H,84H
DB 0C4H,0B4H,04H
;2
DB 82H,01H,81H,0F4H,0D4H
DB 0B4H,0A4H,94H
DB 0E2H,01H,0E1H,0D4H,0B4H
DB 0C4H,0B4H,04H
;3
DB 82H,01H,81H,94H,84H
DB 0B4H,0A4H,04H
DB 82H,01H,81H,94H,84H
DB 0C4H,0B4H,04H
;4
DB 82H,01H,81H,0F4H,0D4H
DB 0B4H,0A4H,94H
DB 0E2H,01H,0E1H,0D4H,0B4H
DB 0C4H,0B4H,04H
DB 00
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -