改了,不知行不行:
Pulse equ 10h ;脉冲
PulseCNT equ 50h ;脉冲计数
ToneHigh equ 40h ;高音调
ToneLow equ 41h ;低音调
Tone equ 42h ;音调
KeyBuf equ 54h
Speaker BIT P3.2
ORG 0000H
ljmp Start
org 000bh
LJMP Timer0Int
org 0100h
Start:
mov sp, #70h
mov TMOD, #01 ; Timer
mov IE, #82h ; EA=1, IT0 = 1
mov Tone,#0
MLoop:
call TestKey
jz MLoop
call GetKey
mov b, a
jz MLoop ; = 0, < 1
dec b
mov a, b
rl a ; a = a*2
mov b, a
mov dptr, #ToneTable
movc a, @a+dptr
mov ToneHigh, a
mov TH0, a
mov a, b
inc a
movc a, @a+dptr
mov ToneLow, a
mov TL0, a
SETB TR0
WAIT: MOV P1,#0FFH
MOV A,P1
;++++++++++++++++++++++++++++++++++++++++++++++++++++
DJNZ R5,waitk ;此处加入按键压下4秒的时间检测,调用延时
DJNZ R4,waitk ;调r3,r4值 达到4秒
DJNZ R3,waitk
LCALL MUSIC ;4秒到了,调音乐播放程序
LJMP MLOOP
;++++++++++++++++++++++++++++++++++++++++++++++++++++
waitk: CJNE A,#0FFH, WAIT;等松开
MOV R6,#10
ACALL DELAY
CLR TR0
LJMP MLOOP
Timer0Int: ;定时中断
push PSW
clr TR0
mov TH0, ToneHigh
mov TL0, ToneLow
setb TR0
mov C, Pulse
MOV Speaker,C
CPL Pulse
pop PSW
reti
ToneTable:
DW 64578,64686,64778,64821
DW 64898,64968,65029,65068
TestKey:
MOV P1, #0FFH
MOV A, P1
CPL A ; 读入键状态
ret
KeyTable:DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH ; 键码定义
GETKEY:
MOV R6,#10
ACALL DELAY
MOV A,P1
CJNE A,#0FFH,K01 ;确有键按下
;++++++++++++++++++++++++++++++++++++++++++++++++++++
CPL A
ret ;这句:LJMP MLOOP换成CPL A和RET
;++++++++++++++++++++++++++++++++++++++++++++++++++++
K01: MOV R3,#8 ;8个键
MOV R2,#0 ;键码
MOV B,A ;暂存键值
MOV DPTR,#KeyTable
K02: MOV A,R2
MOVC A,@A+DPTR ;从键值表中取键值
CJNE A,B,K04 ;键值比较
MOV A,R2 ;得键码
INC A
RET
K04: INC R2 ;不相等,到继续访问键值表
DJNZ R3,K02
MOV A,#0FFH ;键值不在键值中,即多键同时按下
;++++++++++++++++++++++++++++++++++++++++++++++++++++
CPL A
ret ;这句:LJMP MLOOP换成CPL A和RET
;++++++++++++++++++++++++++++++++++++++++++++++++++++
Delay: ; 延时子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, Delay
ret
;++++++++++++++++++++++++++++++++++++++++++++++++++++
;音乐播放程序
MUSIC:
mov a,#0
mov dptr, #xxx ;小星星
movc a, @a+dptr
jz waitk3 ;播完返回
inc dptr
mov ToneHigh, a
mov TH0, a
mov a, #0
movc a, @a+dptr
inc dptr
mov ToneLow, a
mov TL0, a
mov a, #0
movc a, @a+dptr
inc dptr
mov r3,a
mov a, #0
movc a, @a+dptr
inc dptr
mov r4,a
SETB TR0
WAIT2: MOV P1,#0FFH
MOV A,P1
DJNZ R5,waitk2 ;此处延时为音长
DJNZ R4,waitk2 ;调r3,r4值为发音持续时间
DJNZ R3,waitk2
LCALL MUSIC ;发音持续时间结束,调音乐播放程序
sjmp waitk3
waitk2: CJNE A,#0FFH, WAIT2;等松开
waitk3: CLR TR0
MOV R6,#10
ACALL DELAY
ret
RET
xxx: ;小星星
;DW 64578,64686,64778,64821;1 2 3 4
;DW 64898,64968,65029,65068;5 6 7 1
;DW格式:音符,时长,
DW 64578,60000,64578,60000,64898,60000,64898,60000;1 1 5 5
DW 64968,60000,64968,60000,64898,60000 ;6 6 5
DW 64821,60000,64821,60000,64778,60000,64778,60000;4 4 3 3
DW 64686,60000,64686,60000,64578,60000,0,0,0,0 ;2 2 1
;++++++++++++++++++++++++++++++++++++++++++++++++++++
END
GETKEY子程序有语法错误
下面这句:
CJNE A,#0FFH,K01 ;确有键按下
LJMP MLOOP ----------------------这里不能limp,要用ret