电子琴的仿真我在本科阶段的一个课程设计题目,以51单片机为核心,电子琴按键是4乘4的矩阵式键盘,代码是用汇编语言写的,都是原创。
仿真
代码
51单片机源程序:
- //附录一 程序清单
- BUFF EQU 30H
- STH0 EQU 31H
- STL0 EQU 32H
- TEMP EQU 33H
- ORG 0000H
- LJMP START
- ORG 000BH
- LJMP INT_T0
- ORG 001BH
- LJMP TIM1
- START:MOV TMOD,#01H
- SETB ET0
- SETB EA
- MAIN:MOV P1,#0FFH ;置为高电平
- CLR P1.4 ;扫第一行
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY1 ;为零无键按下转移
- LCALL DELY10MS
- MOV A,P1 ;到底有没有键按下啊,去抖
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY1
- MOV A,P1
- ANL A,#0FH
- CJNE A,#0EH,KK1 ;相等说明这回是真有键按下了,不骗人 00001110第一列
- MOV BUFF,#0 ;给个键值
- LJMP NDK1 ;终于出声音了巴拉巴拉巴拉巴拉
- KK1:CJNE A,#0DH,KK2 ;第二列00001101
- MOV BUFF,#1
- LJMP NDK1
- KK2:CJNE A,#0BH,KK3 ;第三列00001011
- MOV BUFF,#2
- LJMP NDK1
- KK3:CJNE A,#07H,KK4 ;第四列0000 0111
- MOV BUFF,#3
- LJMP NDK1
- KK4:NOP ;空
- ;下面都是一样的套路扫描第二三四行,复制三遍OK
- KKEY1:MOV P1,#0FFH
- CLR P1.5 ;扫第二行
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY2
- LCALL DELY10MS
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY2
- MOV A,P1
- ANL A,#0FH
- CJNE A,#0EH,KK5
- MOV BUFF,#4
- LJMP NDK1
- KK5:CJNE A,#0DH,KK6
- MOV BUFF,#5
- LJMP NDK1
- KK6:CJNE A,#0BH,KK7
- MOV BUFF,#6
- LJMP NDK1
- KK7:CJNE A,#07H,KK8
- MOV BUFF,#7
- LJMP NDK1
- KK8:NOP
- KKEY2:MOV P1,#0FFH
- CLR P1.6 ;扫第三行
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY3
- LCALL DELY10MS
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY3
- MOV A,P1
- ANL A,#0FH
- CJNE A,#0EH,KK9
- MOV BUFF,#8
- LJMP NDK1
- KK9:CJNE A,#0DH,KK10
- MOV BUFF,#9
- LJMP NDK1
- KK10:CJNE A,#0BH,KK11
- MOV BUFF,#10
- LJMP NDK1
- KK11:CJNE A,#07H,KK12
- MOV BUFF,#11
- LJMP NDK1
- KK12:NOP
- KKEY3:MOV P1,#0FFH
- CLR P1.7 ;扫第四行
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY4
- LCALL DELY10MS
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY4
- MOV A,P1
- ANL A,#0FH
- CJNE A,#0EH,KK13
- MOV BUFF,#12
- LJMP NDK1
- KK13:CJNE A,#0DH,KK14
- MOV BUFF,#13
- LJMP NDK1
- KK14:CJNE A,#0BH,KK15
- MOV BUFF,#14
- LJMP NDK1
- KK15:CJNE A,#07H,KK16
- MOV BUFF,#15
- LJMP NDK1
- KK16:NOP
- NDK1: MOV A,BUFF ;给键值
- MOV DPTR,#TABLE
- MOVC A,@A+DPTR ;到表里找到它段码
- MOV P0,A ;给数码管数码管
- MOV A,BUFF
- RL A
- MOV TEMP,A
- MOV DPTR,#TABLE1
- MOVC A,@A+DPTR ;到表里找到它的T/2
- MOV STH0,A
- MOV TH0,A
- INC TEMP
- MOV A,TEMP
- MOVC A,@A+DPTR
- MOV STL0,A
- MOV TL0,A ;给定时器高低位
- SETB TR0
- NDK1A: MOV A,P1 ;松手了吗亲 ,不松手继续出声
- ANL A,#0FH
- XRL A,#0FH
- JNZ NDK1A
- CLR TR0
- KKEY4: MOV A,#0FFH
- MOV P2,A
- MOV A,P2
- JB ACC.0,KKEY5 ;中断按下了吗,按下就唱歌了,想好了再按
- LCALL DELY10MS
- MOV A,P2
- JB ACC.0,KKEY5
- MOV BUFF,#16
- MOV P0,#7FH
- LJMP START22
- START22:MOV A,BUFF
- CJNE A,#16,KKEY5
- LJMP START2
- KKEY5: LJMP MAIN
- START2:MOV TMOD,#10H ;准备播放音乐
- MOV IE,#88H
- START0: MOV 30H,#00
- NEXT: MOV A,30H
- MOV DPTR,#TAB ;拿到简谱码表
- MOVC A,@A+DPTR
- MOV R2,A
- JZ EN0
- ANL A,#0FH
- MOV R5,A ;节拍放入R5
- MOV A,R2
- SWAP A
- ANL A,#0FH
- JNZ SING
- CLR TR1
- LJMP D1
- SING: DEC A
- MOV 23H,A
- RL A
- MOV DPTR,#TAB1
- MOVC A,@A+DPTR
- MOV TH1,A
- MOV 24H,A
- MOV A,23H
- RL A
- INC A
- MOVC A,@A+DPTR
- MOV TL1,A
- MOV 25H,A
- SETB TR1
- D1: CALL DELAY1
- INC 30H
- JMP NEXT
- EN0: CLR TR1
- LJMP START
- TIM1: PUSH ACC
- PUSH PSW
- MOV TL1,25H
- MOV TH1,24H
- CPL P3.0
- CPL P3.1
- POP PSW
- POP ACC
- RETI
- DELAY1: MOV R4,#02 ;187MS
- DELAY2: MOV R3,#187
- DELAY3: MOV R2,#248
- DJNZ R2,$
- DJNZ R3,DELAY3
- DJNZ R4,DELAY2
- DJNZ R5,DELAY1
- RET
- DELY10MS:MOV R6,#10 ;10MS
- D10: MOV R7,#248
- DJNZ R7,$
- DJNZ R6,D10
- RET
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
全部资料下载地址:
电子琴仿真及程序代码.rar
(329.4 KB, 下载次数: 84)
|