描述
buzzerequp2.4
KEYEQUP3.7
org00h;主程序起始地址
jmpstart;跳动主程序
org0bh;timer0中断起始地址
jmptim0;跳至timer0在mode1
start: MOV tmod,#00000001b;设timer0在mode1
MOV ie,#10000010b;中断使能
jbKEY,$;第一次按to?
calldelay1;消除抖动
jnbKEY,$;to放开?
MOV 31h,#00;按to次数计数指针初值为00h
start0:
MOV 30h,#lowsong;取简谱码指针(第1首)
next: MOV a,30h
MOV dptr,#table
MOV ca,@a+dptr;至相关页码,高4位为音符的高低
MOV r2,a;低4位为音符的节拍
jzend0;检查简谱码是否已结束(有无00?)
anla,#0fh;取节拍(低4位)
MOV r5,a;存入r5,节拍的时间
MOV a,r2
swapa
anla,#0fh;取音频值(高4位)
jnzsing;是否为0,是0则不发音
clrtr0
jmpd1
sing:deca;因0不列入
MOV 22h,a;存入(22h)
rla;乘2
MOV dptr,#table
MOV ca,@a+dptr;至table取码,取t的值
MOV th0,a;取到的高位字节存入th0
MOV 21h,a;取到的高位字节存入(21h)
MOV a,22h;再载入取到的音符码
rla;乘2
inca;加1
MOV ca,@