基于单片机的带存储的电子琴

更新时间:2024-04-16 09:10:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

ORG 00H SJMP MAIN ORG 0BH

LJMP TIME0 ;定时器0中断服务程序 ORG 1BH

LJMP TIME1 ;定时器1中断服务程序 ORG 30H MAIN: MOV SP,#5FH MOV 9H,#0 MOV 0AH,#0

MOV DPTR,#1000H MOV TMOD,#11H MOV IE,#8AH LOOP: CLR TR0 CLR TR1 AAA: JB P3.3,LOOP5 MOV A,#0 MOVX @DPTR,A

LCALL DELAY1 JNB P3.3,$ LCALL DELAY1

LJMP SING0 LOOP5: JB P3.2,LOOP4 LCALL DELAY1 JNB P3.2,$ LCALL DELAY1

LJMP SING0 LOOP4: CLR P3.1 MOV R0,#4 MOV R3,#11101111B MOV R2,#11111111B NLINE: MOV A,R3 MOV P1,A MOV A,P1 ORL A,#0F0H

CJNE A,#0FFH,KEYIN MOV A,R3 RL A MOV R3,A

DJNZ R0,NLINE LJMP LOOP KEYIN: MOV R2,A

LCALL DELAY1 LCALL TRANF ;存储器6264首地址

;设定定时器0和定时器1的工作方式为1 ;开中断T0、T1 ;关中断T0 ;关中断T1 ;未按键转

;按了键则转\写入6264中,以表示结束音乐 ;消除按键抖动 ;转复奏音乐

;未按键转扫描按键 ;消除按键抖动 ;转复奏音乐 ;奏音乐指示灯亮 ;扫描键盘子程序 ;判断有无按键,有则转 无按键继续扫描

将扫描码转成按键码

; ; ANL A,#0FH ;屏蔽高四位 SWAP A ;半字节对换

MOV 09H,A ;存放于09H单元中 SWAP A ;09H为音符码节拍工作 CJNE A,#0,ZZZ ;音符码不为0的则转

CLR TR1 ;为0则关中断1,不发出声音 SETB TR0 ;开中断0 LJMP ZZZZ ZZZ: DEC A MOV 22H,A CLR C RLC A PUSH DPH PUSH DPL

MOV DPTR,#TABLE1 MOVC A,@A+DPTR

MOV TH1,A MOV 21H,A MOV A,22H CLR C RLC A

INC A MOVC A,@A+DPTR POP DPL POP DPH MOV TL1,A MOV 20H,A

MOV TH0,#0A4H MOV TL0,#0H

SETB TR0 SETB TR1 ZZZZ: LCALL NOPEN CLR TR0 CLR TR1 MOV A,0AH CLR C RRC A CLR C RRC A CLR C RRC A

CJNE A,#0FH,NODE SJMP DDD NODE: JC DDD

;到TABLE1取相应的高字节值 ;高字节值存入TH0和21H ;取低字节并存在TL0和22H ;1/32节拍初值 ;开中断0 ;开中断1

;等待按键放开 ;关中断T0 ;关中断T1

;(0AH)单元中表示按键时间长短 MOV A,#0FH DDD: ORL 09H,A MOV 0AH,#0 WWW: MOV A,09H SETB P3.1

MOVX @DPTR,A ;写6264 LCALL DELAY1 ;延时151ms INC DPTR LJMP LOOP

DELAY1:MOV R7,#3 MOV R6,#0 S1: DJNZ R6,$ DJNZ R7,S1 RET

NOPEN: MOV A,P1 ORL A,#0F0H CJNE A,#0FFH,NOPEN LCALL DELAY1 RET

TRANF: MOV B,#0 MOV A,R2 C1: RRC A JNC C2 INC B INC B INC B INC B LJMP C1 C2: MOV A,R3 RR A RR A RR A RR A C3: RRC A JNC C4 INC B LJMP C3

C4: MOV A,B RET

TIME0: INC 0AH MOV TH0,#0A4H MOV TL0,#0H RETI

SING0: SETB P3.1 ;延时15ms ;等待键盘按键盘放开 ;消除键盘抖动 ;将扫描码转换成按键盘子程序 ;(A)=(B)为按键码 ;按键盘时间长短,中断服务程序 重载初值 ;复奏时指示灯灭

; NEXT: MOV DPTR,#1000H ;到片外ROM处取简码指针 NEXTX: MOVX A,@DPTR PUSH DPH PUSH DPL

MOV R2,A ;取到的简码暂存于R2中 JZ ENDF ;取到\则结束 ANL A,#0FH ;否,取低四位节拍码 MOV R5,A ;将节拍码存于R5中 MOV A,R2 ;取高4位简符码 SWAP A ANL A,#0FH

JNZ SING CLR TR1 SJMP DLY1 SING: DEC A MOV 22H,A

RL A MOV DPTR,#TABLE1 MOVC A,@A+DPTR

MOV TH1,A MOV 21H,A MOV A,22H RL A

INC A MOVC A,@A+DPTR MOV TL1,A MOV 20H,A SETB TR1 DLY1: INC R5 ACALL DELAY

POP DPL POP DPH INC DPTR

SJMP NEXTX ENDF: CLR TR1 CLR TR0

LJMP MAIN TIME1: PUSH ACC PUSH PSW

MOV TL1,20H MOV TH1,21H

CPL P3.0 POP PSW POP ACC

;取到的是非0,则转向SING子程序 ;取到0则不发声 ;到TABLE1取高字节计数值 ;高字节存入TH0和21H ;取低字节并存入TL0和20H ;基本单元时间为1/4拍187s ;取下一个码 ;停止定时器 ;循环

;定时器1中断服务程序 重装计数器 ;发音 ; RETI

DELAY: MOV R7,#187 ;187ms延时子程序 DLY2: MOV R4,#02 DLY3: MOV R3,#248 DJNZ R3,$ DJNZ R4,DLY3 DJNZ R7,DLY2 DJNZ R5,DELAY RET

TABLE1:

DW 63628,63835,64021,64103,64260,64400,64524 DW 64580,64684,64777,64820,64898,64968,65030 DW 65058,65110,65157,65178,65217,65252,65283 END

本文来源:https://www.bwwdw.com/article/0c1p.html

Top