ORG 0000H
LJMP KEYP0
KEYP0: MOV R0,#00H
CLR TR0
SETB P2.4 ;关蜂鸣器
SETB P2.3 ;关数码管
WU: MOV R0,P3 ;扫描键盘输入
CJNE R0,#0FFH,KEYPO1 ;有输入时跳转
JMP WU
KEYPO1:CJNE R0,#0FBH,KEYPO2 ;输入1音,非1音跳转
SETB P2.4 ;关闭蜂鸣器
MOV R3,#200
MAIN01:MOV TMOD,#01H ;初始化,定时器0,工作方式1
MOV TL0,#21H ;写入计数初值
MOV TH0,#0F9H
SETB TR0 ;启动计数
WAIT1:JNB TF0,WAIT1
CLR TF0
CPL P2.4 ;蜂鸣器响
CLR P2.3 ;数码管显示1
MOV A,#11111001B
MOV P0,A
DJNZ R3,MAIN01
LJMP KEYP0 ;返回程序KEYP0
KEYPO2:CJNE R0,#0F7H,KEYPO3 ; 输入2音,非2音跳转
SETB P2.4 ;蜂鸣器置于高电平
MOV R3,#200
MAIN02:MOV TMOD,#01H
MOV TL0,#0E1H ;写入计数初值
MOV TH0,#0F9H
SETB TR0
WAIT2:JNB TF0,WAIT2
CLR TF0
CPL P2.4 ;蜂鸣器响
CLR P2.3 ;数码管显示2
MOV A,#10100100B
MOV P0,A
DJNZ R3,MAIN02
LJMP KEYP0
KEYPO3:CJNE R0,#0EFH,KEYPO4 ; 输入3音,非3音跳转
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音跳转
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音跳转
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音跳转
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音跳转
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音跳转
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 ;跳转到第一首歌程序
LJMP MUSTART1
KEYPO10:CJNE R0,#0D7H,JIELI ;跳转到第二首歌程序
LJMP MUSTART2
JIELI:JMP KEYP0 ;返回主程序
MUSTART1: ;歌曲1的播放程序
MOV R0,#00H ;节拍表指针置零
MOV R1,#00H ;音符表指针置零
RTAB:MOV A,R0
MOV DPTR,#RYTH
MOVC A,@A+DPTR ;查表法将一个节拍数据取出放R2计数器中
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 ;准备输出相应音调的方波,关闭蜂鸣器
LOOP:MOV R5,#3BH
MAIN:MOV TMOD,#01H ;定时器0,工作方式1
MOV TL0,R4 ;传入音符,作为及时T0的初始值
MOV TH0,R3
SETB TR0 ;允许定时器0计时
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则跳转到程序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 ;无打断则继续放第一首歌
DJNZ R2,LOOP
INC R0 ;两个表的指针都加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
|