1、2,显示和发声子程序 3音乐播放子程序PROTEUS电路图五:程序KEYBUF EQU 30H STH0 EQU 31H STL0 EQU 32H TEMP EQU 33H SPK EQU P1.6 ; 蜂鸣器所在端口 ORG 0000H LJMP START ORG 0BH LJMP INT_T0 START: MOV TMOD,#01H SETB ET0 SETB EA WAIT: MOV P2,#0FFH CLR P2.4 ;从第四行开始扫描 MOV A,P2 ANL A,#0FH ;屏蔽高四位,高四位为行,低四位为列 XRL A,#0FH JZ NOKEY1 ;判断是否有键按下,没有就
2、跳转 LCALL DELY10MS MOV A,P2 ;消除抖动和干扰 ANL A,#0FH JZ NOKEY1 确定有键按下以后的处理 CJNE A,#0EH,NK1 ;是否为第四行第一列的键被按下 MOV KEYBUF,#0 ;保存列号 LJMP DK1 NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 NK4: NOP DK1: ;第四行的处理 MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR
3、MOV P0,A MOV B,#2 ;Table1以字保存,所以散转 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOV STH0,A ;送入高字节 MOV TH0,A INC TEMP MOV A,TEMP MOV STL0,A ;送入低字节 MOV TL0,A SETB TR0 DK1A: MOV A,P2 ;判断按键是否松开 JNZ DK1A CLR TR0 NOKEY1: CLR P2.5 JZ NOKEY2 CJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2 NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 NK
4、6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 NK8:DK2: MOV B,#2 MOV STH0,A MOV STL0,A DK2A: MOV A,P2 JNZ DK2A NOKEY2: CLR P2.6 JZ NOKEY3 CJNE A,#0EH,NK9 MOV KEYBUF,#8 LJMP DK3 NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9 NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 NK11: CJNE A,#07H,NK12 MOV K
5、EYBUF,#11 NK12:DK3:DK3A: MOV A,P2 JNZ DK3A NOKEY3: CLR P2.7 JZ NOKEY4 CJNE A,#0EH,NK13 MOV KEYBUF,#12 LJMP DK4 NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13 NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14 NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15 NK16:DK4:DK4A: JNZ DK4A NOKEY4: JNB P1.0,MUSIC LJMP WAIT MUSIC: MOV R3,#00H
6、NEXT: MOV A,R3 MOV DPTR,#TABLE2 MOVC A,A+DPTR JZ MUSIC ;如果检测到0000时,再执行一遍 MOV R7,A INC R3 MOV R2,A ACALL SONG SJMP NEXT;= 歌曲播放子程序 =SONG: MOV A,R2 ; 取出节拍 RL A JNZ KEEP MOV A,#01HKEEP:REPEAT: ACALL EIGHTH DJNZ R2,REPEAT RET= 产生1/8拍延时子程序 = EIGHTH: MOV A,R7 ; 查表取出廷时参数,保存到R4 MOV DPTR,#DELAY_T MOV R4,A 查表取
7、出1/8拍周期数,保存到R5 MOV DPTR,#S_PARA MOV R5,ANEXTCYC: ACALL SOUND DJNZ R5,NEXTCYC= 发声子程序 = SOUND: SETB SPK ACALL SDELAY CLR SPK= 延时子程序 =SDELAY: MOV A,R4 ; 廷时值在R4内 MOV R0,AXL2: MOV R1,#03HDL1: NOP DJNZ R1,DL1 DJNZ R0,XL2= 1/8拍周期表 =S_PARA: DS 1DH DB 15H,16H,00 DB 19H,00H,1CH,00H,1FH,21H,00H,25H DB 00H,29H,
8、2CH,00H,31H,34H,37H,00H DB 3EH,41H,00H,49H,00H,52H,57H,00H DB 62H = 延时参数表 =DELAY_T: DB 7EH,77H,00H DB 6AH,00H,5EH,00H,54H,4FH,00H,46H DB 00H,3FH,3BH,00H,35H,32H,2FH,00H DB 2AH,27H,00H,23H,00H,1FH,1DH,0C0H DB 1AHDELY10MS: MOV R6,#10 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET INT_T0: MOV TH0,STH0 MOV TL
9、0,STL0 CPL P1.6 RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H TABLE1: DW 64021,64103,64260,64400 DW 64524,64580,64684,64777 DW 64820,64898,64968,65030 DW 65058,65110,65157,65178 = 歌曲表 =TABLE2: DW 2202H,2902H,2902H,2902H,2906H,2702H ;我从山中来 DW 2502H,2702H,2502H,2402
10、H,2208H ;带着兰花草 DW 2E02H,2E02H,2E02H,2E02H,2E06H,2C02H ;种在小园中 DW 2902H,2C02H,2D02H,2A02H,2908H ;祈祷花开早 DW 2902H,2E02H,2E02H,2C02H,2906H,2702H ;一日看三回 DW 2502H,2702H,2502H,2402H,2206H,1D02H ;看得花时过 DW 1D02H,2502H,2502H,2402H,2206H,2902H ;兰花却依然 DW 2702H,2502H,2402H,2002H,2208H ;苞也无一个 DW 0000H ; END 六:调试与运行程序写完后,存在一些缺点和错误,经过调试后,能正常发声,但是不能显示键值,经过和同学探讨发现用错了数码管,最后把数码管改成共阴极后,终于也能显示键值了。而且在运行歌曲时,由于CPU不够用,导致发声的时候失真。运行仿真结果:
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2