音符 频率(HZ) 简谱码(T值)
中 1 DO 523 64580
中 2 RE 587 64684
中 3 M 659 64777
中 4 FA 698 64820
中 5 SO 784 64898
中 6 LA 880 64968
中 7 SI 988 65030
采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:
TABLEDW64580,64684,64777,64820,64898,64968,65030
3.软件的设计
3.1设计方案1
源程序:
方案一:产生按键音符
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP BREAK
MAIN: MOV TMOD,#01H ;设置定时器0的工作方式
SETB EA
SETB ET0 ; 设置定时器0中断
SETB TR0 ; 启动定时器0
WAIT1: LCALL KEY ; 调用KEY子程序,判断有键按下否?第几个键?
CLR EA ;屏蔽中断
CJNE R3,#00H,WAIT1 ;如果R3=0,表示有键按下
MOV A,22H ;将22H里存放的按键号送给A
RL A ; 因为查表里都是字,所以得乘2查得数据
MOV DPTR,#TABLE ;指向表头
MOVC A,@A+DPTR ; 查表
MOV TH0,A ;将数据高位送TH0
MOV 21H,A ; 将高位备份
MOV A,22H ;将22H里存放的按键号送给A
RL A ;因为查表里都是字,所以得乘2查得数据
INC A ;取低位数据
MOVC A,@A+DPTR
MOV TL0,A
MOV 20H,A
WAIT2: LCALL KEY
SETB EA
CJNE R3,#00H,WAIT1
JMP WAIT2
KEY: MOV R3,#00H ; KEY子程序,判断有键按下否?第几个键?
MOV R1,#0FFH
MOV R0,#00H
MOV A,R1
MOV P2,A
MOV A,P2
CLR C
CPL C ;利用标志位CY来判断是哪个键按下
MOV R2,#08H
WAIT3: RLC A ;移位判断
JNC STORE
INC R0
DJNZ R2,WAIT3
STORE: MOV 22H,R0 ; 将按键号存22H,R3=0有键按下
MOV R3,#00H
RET
BREAK: PUSH ACC ; 中断产生方波,从P1.0口输出
PUSH PSW
MOV TL0,20H
MOV TH0,21H
CPL P1.0
POP PSW
POP ACC
RETI
TABLE: DW 65030,64968,64898,64820,64777,64684,64580 ; 7,6,5,4,3,2,1
END
3.2设计方案2
方案二:产生按键音符
ORG 0000H
SJMP START
ORG 000BH
AJMP INT_0
ORG 0030H
START: MOV P1,#00H
SETB EA
SETB ET0 ;计数器0
MOV TMOD,#02H
MOV TH1,#09CH
MOV TL1,#09CH ;定时器初植
CLR TR0 ;定时器不允许
SCAN: ;键盘扫描
MOV A,P2 ;判断键盘按下,跳到SCAN_1,若未按,继续扫描
CJNE A,#0FFH,SCAN_1
NOP