ORG 0000H
LJMP KEYP0
KEYP0: MOV R0,#00H
CLR TR0
SETB P2.4 ;關(guān)蜂鳴器
SETB P2.3 ;關(guān)數(shù)碼管
WU: MOV R0,P3 ;掃描鍵盤輸入
CJNE R0,#0FFH,KEYPO1 ;有輸入時(shí)跳轉(zhuǎn)
JMP WU
KEYPO1:CJNE R0,#0FBH,KEYPO2 ;輸入1音,非1音跳轉(zhuǎn)
SETB P2.4 ;關(guān)閉蜂鳴器
MOV R3,#200
MAIN01:MOV TMOD,#01H ;初始化,定時(shí)器0,工作方式1
MOV TL0,#21H ;寫入計(jì)數(shù)初值
MOV TH0,#0F9H
SETB TR0 ;啟動(dòng)計(jì)數(shù)
WAIT1:JNB TF0,WAIT1
CLR TF0
CPL P2.4 ;蜂鳴器響
CLR P2.3 ;數(shù)碼管顯示1
MOV A,#11111001B
MOV P0,A
DJNZ R3,MAIN01
LJMP KEYP0 ;返回程序KEYP0
KEYPO2:CJNE R0,#0F7H,KEYPO3 ; 輸入2音,非2音跳轉(zhuǎn)
SETB P2.4 ;蜂鳴器置于高電平
MOV R3,#200
MAIN02:MOV TMOD,#01H
MOV TL0,#0E1H ;寫入計(jì)數(shù)初值
MOV TH0,#0F9H
SETB TR0
WAIT2:JNB TF0,WAIT2
CLR TF0
CPL P2.4 ;蜂鳴器響
CLR P2.3 ;數(shù)碼管顯示2
MOV A,#10100100B
MOV P0,A
DJNZ R3,MAIN02
LJMP KEYP0
KEYPO3:CJNE R0,#0EFH,KEYPO4 ; 輸入3音,非3音跳轉(zhuǎn)
SETB P2.4 ;蜂鳴器置于高電平
MOV R3,#200
MAIN03:MOV TMOD,#01H
MOV TL0,#08CH
MOV TH0,#0FAH
SETB TR0
WAIT3:JNB TF0,WAIT3
CLR TF0
CPL P2.4
CLR P2.3
MOV A,#10110000B
MOV P0,A
DJNZ R3,MAIN03
LJMP KEYP0
KEYPO4:
CJNE R0,#0DFH,KEYPO5 ; 輸入4音,非4音跳轉(zhuǎn)
SETB P2.4
MOV R3,#200
MAIN04:MOV TMOD,#01H
MOV TL0,#0D8H
MOV TH0,#0FAH
SETB TR0
WAIT4:JNB TF0,WAIT4
CLR TF0
CPL P2.4
CLR P2.3
MOV A,#10011001B
MOV P0,A
DJNZ R3,MAIN04
LJMP KEYP0
KEYPO5: CJNE R0,#0F3H,KEYPO6 ; 輸入5音,非5音跳轉(zhuǎn)
SETB P2.4
MOV R3,#200
MAIN05:MOV TMOD,#01H
MOV TL0,#068H
MOV TH0,#0FBH
SETB TR0
WAIT5:JNB TF0,WAIT5
CLR TF0
CPL P2.4
CLR P2.3
MOV A,#10010010B
MOV P0,A
DJNZ R3,MAIN05
LJMP KEYP0
KEYPO6:CJNE R0,#0E7H,KEYPO7 ; 輸入6音,非6音跳轉(zhuǎn)
SETB P2.4
MOV R3,#200
MAIN06:MOV TMOD,#01H
MOV TL0,#0E9H
MOV TH0,#0FBH
SETB TR0
WAIT6:JNB TF0,WAIT6
CLR TF0
CPL P2.4
CLR P2.3
MOV A,#10000010B
MOV P0,A
DJNZ R3,MAIN06
LJMP KEYP0
KEYPO7:CJNE R0,#0CFH,KEYPO8 ; 輸入7音,非7音跳轉(zhuǎn)
SETB P2.4
MOV R3,#200
MAIN07:MOV TMOD,#01H
MOV TL0,#05BH
MOV TH0,#0FCH
SETB TR0
WAIT7:JNB TF0,WAIT7
CLR TF0
CPL P2.4
CLR P2.3
MOV A,#11111000B
MOV P0,A
DJNZ R3,MAIN07
LJMP KEYP0
KEYPO8:CJNE R0,#0DBH,KEYPO9 ; 輸入i音,非i音跳轉(zhuǎn)
SETB P2.4
MOV R3,#200
MAIN08:MOV TMOD,#01H
MOV TL0,#08FH
MOV TH0,#0FCH
SETB TR0
WAIT8:JNB TF0,WAIT8
CLR TF0
CPL P2.4
CLR P2.3
MOV A,#10000000B
MOV P0,A
DJNZ R3,MAIN08
LJMP KEYP0
KEYPO9:CJNE R0,#0EBH,KEYPO10 ;跳轉(zhuǎn)到第一首歌程序
LJMP MUSTART1
KEYPO10:CJNE R0,#0D7H,JIELI ;跳轉(zhuǎn)到第二首歌程序
LJMP MUSTART2
JIELI:JMP KEYP0 ;返回主程序
MUSTART1: ;歌曲1的播放程序
MOV R0,#00H ;節(jié)拍表指針置零
MOV R1,#00H ;音符表指針置零
RTAB:MOV A,R0
MOV DPTR,#RYTH
MOVC A,@A+DPTR ;查表法將一個(gè)節(jié)拍數(shù)據(jù)取出放R2計(jì)數(shù)器中
MOV R2,A
TTAB:MOV A,R1
MOV DPTR,#TONE
MOVC A,@A+DPTR
MOV R3,A ;取出音符表高8位
INC R1 ;指針加1
MOV A,R1
MOV DPTR,#TONE
MOVC A,@A+DPTR
MOV R4,A ;取出低8位
SETB P2.4 ;準(zhǔn)備輸出相應(yīng)音調(diào)的方波,關(guān)閉蜂鳴器
LOOP:MOV R5,#3BH
MAIN:MOV TMOD,#01H ;定時(shí)器0,工作方式1
MOV TL0,R4 ;傳入音符,作為及時(shí)T0的初始值
MOV TH0,R3
SETB TR0 ;允許定時(shí)器0計(jì)時(shí)
WAIT:JNB TF0,WAIT
CLR TF0
CPL P2.4
MAYA:JB P3.2,MAYB ;判斷P3.2口是否有為1
JB P3.4,MAYB ;判斷P3.4口是否有為1
LJMP RA ;P3.4口為0則跳轉(zhuǎn)到程序RA
MAYB:JB P3.3,JIELI ;判斷P3.3口是否有為1
JB P3.5,JIELI ;判斷P3.5口是否有為1
LJMP MUSTART2 ;P3.5口為0則放第二首歌
RA: DJNZ R5,MAIN ;無打斷則繼續(xù)放第一首歌
DJNZ R2,LOOP
INC R0 ;兩個(gè)表的指針都加1
INC R1
CJNE R1,#88,RTAB ;判斷是否取完
LJMP KEYP0
TONE:
DB 0FBH,68H,0FDH,6EH,0FDH,45H,0FCH,0EFH,0FCH,8FH,0FCH,8FH,0FCH,8FH,0FCH,5BH,0FCH,8FH
DB 0FCH,0EFH,0FDH,45H,0FBH,68H,0FBH,68H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0FBH,68H
DB 0FAH,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68H
DB 0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BH
DB 0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFH
RYTH:
DB 04,04,04,04,04,04,04,04,04,04
DB 04,05,04,04,04,04,04,04,04,04
DB 04,04,04,06,04,04,04,07,04,04
DB 04,04,04,06,04,04,04,07,04,04
DB 04,04,04,04
MUSTART2:
MOV R0,#00H
MOV R1,#00H
RTAB2:
MOV A,R1
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV R2,A
TTAB2: MOV A,R1
MOV DPTR,#TONE2
MOVC A,@A+DPTR
MOV R3,A
INC R1
MOV A,R1
MOV DPTR,#TONE2
MOVC A,@A+DPTR
MOV R4,A
SETB P2.4
LOOP2: MOV R5,#9BH
MAIN2:
MOV TMOD,#01H
MOV TL0,R4
MOV TH0,R3
SETB TR0
WAITR:JNB TF0,WAITR
CLR TF0
CPL P2.4
MAYA1:JB P3.3,MAYB1
JB P3.5,MAYB1
LJMP RB
MAYB1:JB P3.2,BACK
JB P3.4,BACK
LJMP MUSTART1
BACK:LJMP JIELI
RB: DJNZ R5,MAIN2
DJNZ R2,LOOP2
INC R0
INC R1
CJNE R1,#64,RTAB2
LJMP KEYP0
TONE2:
DB 0FBH,68H,0FDH,6EH,0FDH,45H,0FCH,0EFH,0FCH,8FH,0FCH,8FH,0FCH,8FH,0FCH,5BH,0FCH,8FH
DB 0FCH,0EFH,0FDH,45H,0FBH,68H,0FBH,68H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0FBH,68H
DB 0FAH,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68H
DB 0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BH
DB 0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFH
TABLE1:
DB 04,04,04,04,04,04,04,04,04,04
DB 04,05,04,04,04,04,04,04,04,04
DB 04,04,04,06,04,04,04,07,04,04
DB 04,04,04,06,04,04,04,07,04,04
DB 04,04,04,04
END
|