单片机电子琴设计 第3页
DO: NOP
RET
TIMOY: PUSH ACC
PUSH PSW
MOV TH0, #35H
MOV TL0, #36H
CPL P1.0
POP ACC
POP PSW
RETI
TABLE2: DW 64580, 64684, 64777, 64820, 64898, 64968, 65030
END
只要将这两个程序综合起来就可以完成设计要求了,注意因为在这两个程序分开考虑的时候都是用定时器0来完成的。而综合起来是只要改变其中一个为定时器1即可。程序如下:
ORG 0000H
SJMP BEGIN
ORG 000BH
LJMP TIM0
ORG 001BH
LJMP TIM1
BEGIN: MOV TMOD, #11H
MOV IE, #8AH
L1: CALL KEY
JB F0, L1 /没有键按下则继续扫描/
MOV A,R3
CJNE A,#07H, SOPP
SJMP REPE
SOPP: MOV DPTR,#TABLE2
MOVC A,@A+DPTR
MOV 35H, A / T值高字节放入35H中/
MOV TH1, A
MOV A, R3
RL A
INC A
MOVC A, @A+DPTR
MOV 36H, A / T值高字节放入36H中/
MOV TL1, A
SETB TR1
L2: CALL KEY
JB F0, L3
SJMP L2
L3: CPL TR1
SJMP L1
KEY: MOV R3, #00H /R3中的数表示是那个键按下/
JNB P2.0, LOOP
INC R3
JNB P2.1, LOOP
INC R3
JNB P2.2, LOOP
INC R3
JNB P2.3, LOOP
INC R3
JNB P2.4, LOOP
INC R3
JNB P2.5, LOOP
INC R3
JNB P2.6, LOOP
INC R3
JNC P2.7, LOOP
SETB F0
SJMP DO
LOOP:CLR F0
DO: NOP
RET
TIM1: PUSH ACC
PUSH PSW
MOV TH1, #35H
MOV TL1, #36H
CPL P1.0
POP ACC
POP PSW
RETI
REPE: MOV 30H, #00H /取简谱码指针/
NEXT: MOV A, 30H /简谱码指针存入A/
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV R2, A /音符码存入R2中/
CJNE A,#0FFH,GOOT /是否取到了规定的结束码 “FFH”/
SJMP END0
GOOT: INC 30H
MOV A, 30H
MOVC A, @A+DPTR
MOV R5, A /节拍数存放在R5中/
MOV A, R2 /音符码存入A中/
CJNE A, #24H, SING /取到的音符码是否为“24H”/
CLR TR0 /是,则不发音/
JMP D1
SING: MOV 31H, A /音符码存入31H中/
RL A
MOV DPTR, #TABLE1
MOVC A,@DPTR+A /找到TABLE1中对应的T值/
MOV 32H, A /取到T值的高字节存入32H中/,