buzzer equ p2.4
KEY EQU P3.7
org 00h ;主程序起始地址
jmp start ;跳动主程序
org 0bh ;timer0中断起始地址
jmp tim0 ;跳至timer0在mode1
start: MOV tmod,#00000001b ;设timer0在mode1
MOV ie,#10000010b ;中断使能
jb KEY,$ ;第一次按to?
call delay1 ;消除抖动
jnb KEY,$ ;to放开?
MOV 31h,#00 ;按to次数计数指针初值为00h
start0:
MOV 30h,#low song ;取简谱码指针(第1首)
next: MOV a,30h
MOV dptr,#table
MOV c a,@a+dptr ;至相关页码,高4位为音符的高低
MOV r2,a ;低4位为音符的节拍
jz end0 ;检查简谱码是否已结束(有无00?)
anl a,#0fh ;取节拍(低4位)
MOV r5,a ;存入r5,节拍的时间
MOV a,r2
swap a
anl a,#0fh ;取音频值(高4位)
jnz sing ;是否为0,是0则不发音
clr tr0
jmp d1
sing: dec a ;因0不列入
MOV 22h,a ;存入(22h)
rl a ;乘2
MOV dptr,#table
MOV c a,@a+dptr ;至table取码,取t的值
MOV th0,a ;取到的高位字节存入th0
MOV 21h,a ;取到的高位字节存入(21h)
MOV a,22h ;再载入取到的音符码
rl a ;乘2