⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dianziqin.asm

📁 简易电子琴设计
💻 ASM
字号:
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 		;判断是否有键按下,没有就跳转
	LCALL DELY10MS 
	MOV A,P2 		;消除抖动和干扰
	ANL A,#0FH 
	XRL A,#0FH 
	JZ NOKEY1 		
	MOV A,P2 		;确定有键按下以后的处理
	ANL A,#0FH 
	CJNE A,#0EH,NK1 	;是否为第四行第一列的键被按下
	MOV KEYBUF,#0 		;保存列号
	LJMP DK1 
NK1: 	CJNE A,#0DH,NK2 
	MOV KEYBUF,#1 
	LJMP DK1 
NK2: 	CJNE A,#0BH,NK3 
	MOV KEYBUF,#2 
	LJMP DK1 
NK3: 	CJNE A,#07H,NK4 
	MOV KEYBUF,#3 
	LJMP DK1 
NK4: 	NOP 
DK1: 				;第四行的处理
	MOV A,KEYBUF 
	MOV DPTR,#TABLE 
	MOVC A,@A+DPTR 
	MOV P0,A 
	MOV A,KEYBUF 
	MOV B,#2 		;Table1以字保存,所以散转
	MUL AB 
	MOV TEMP,A 
	MOV DPTR,#TABLE1 
	MOVC A,@A+DPTR 
	MOV STH0,A 		;送入高字节
	MOV TH0,A 
	INC TEMP 
	MOV A,TEMP 
	MOVC A,@A+DPTR 
	MOV STL0,A 		;送入低字节
	MOV TL0,A 
	SETB TR0 
DK1A: 	MOV A,P2 		;判断按键是否松开
	ANL A,#0FH 
	XRL A,#0FH 
	JNZ DK1A 
	CLR TR0 
NOKEY1: 
	MOV P2,#0FFH 
	CLR P2.5 
	MOV A,P2 
	ANL A,#0FH 
	XRL A,#0FH 
	JZ NOKEY2 
	LCALL DELY10MS 
	MOV A,P2 
	ANL A,#0FH 
	XRL A,#0FH 
	JZ NOKEY2 
	MOV A,P2 
	ANL A,#0FH 
	CJNE A,#0EH,NK5 
	MOV KEYBUF,#4 
	LJMP DK2 
NK5: 	CJNE A,#0DH,NK6 
	MOV KEYBUF,#5 
	LJMP DK2 
NK6: 	CJNE A,#0BH,NK7 
	MOV KEYBUF,#6 
	LJMP DK2 
NK7: 	CJNE A,#07H,NK8 
	MOV KEYBUF,#7 
	LJMP DK2 
NK8: 	NOP 
DK2: 
	MOV A,KEYBUF 
	MOV DPTR,#TABLE 
	MOVC A,@A+DPTR 
	MOV P0,A 
	MOV A,KEYBUF 
	MOV B,#2 
	MUL AB 
	MOV TEMP,A 
	MOV DPTR,#TABLE1 
	MOVC A,@A+DPTR 
	MOV STH0,A 
	MOV TH0,A 
	INC TEMP 
	MOV A,TEMP 
	MOVC A,@A+DPTR 
	MOV STL0,A 
	MOV TL0,A 
	SETB TR0 
DK2A: 	MOV A,P2 
	ANL A,#0FH 
	XRL A,#0FH 
	JNZ DK2A 
	CLR TR0 
NOKEY2: 
	MOV P2,#0FFH 
	CLR P2.6 
	MOV A,P2 
	ANL A,#0FH 
	XRL A,#0FH 
	JZ NOKEY3 
	LCALL DELY10MS 
	MOV A,P2 
	ANL A,#0FH 
	XRL A,#0FH 
	JZ NOKEY3 
	MOV A,P2 
	ANL A,#0FH 
	CJNE A,#0EH,NK9 
	MOV KEYBUF,#8 
	LJMP DK3 
NK9: 	CJNE A,#0DH,NK10 
	MOV KEYBUF,#9 
	LJMP DK3 
NK10: 	CJNE A,#0BH,NK11 
	MOV KEYBUF,#10 
	LJMP DK3 
NK11: 	CJNE A,#07H,NK12 
	MOV KEYBUF,#11 
	LJMP DK3 
NK12: 	NOP 
DK3: 
	MOV A,KEYBUF 
	MOV DPTR,#TABLE 
	MOVC A,@A+DPTR 
	MOV P0,A 
	MOV A,KEYBUF 
	MOV B,#2 
	MUL AB 
	MOV TEMP,A 
	MOV DPTR,#TABLE1 
	MOVC A,@A+DPTR 
	MOV STH0,A 
	MOV TH0,A 
	INC TEMP 
	MOV A,TEMP 
	MOVC A,@A+DPTR 
	MOV STL0,A 
	MOV TL0,A 
	SETB TR0 
DK3A: 	MOV A,P2
	ANL A,#0FH 
	XRL A,#0FH 
	JNZ DK3A 
	CLR TR0 
NOKEY3: 
	MOV P2,#0FFH 
	CLR P2.7 
	MOV A,P2 
	ANL A,#0FH 
	XRL A,#0FH 
	JZ NOKEY4 
	LCALL DELY10MS 
	MOV A,P2 
	ANL A,#0FH 
	XRL A,#0FH 
	JZ NOKEY4 
	MOV A,P2 
	ANL A,#0FH 
	CJNE A,#0EH,NK13 
	MOV KEYBUF,#12 
	LJMP DK4 
NK13: 	CJNE A,#0DH,NK14 
	MOV KEYBUF,#13 
	LJMP DK4 
NK14: 	CJNE A,#0BH,NK15 
	MOV KEYBUF,#14 
	LJMP DK4 
NK15: 	CJNE A,#07H,NK16 
	MOV KEYBUF,#15 
	LJMP DK4 
NK16: 	NOP 
DK4: 
	MOV A,KEYBUF 
	MOV DPTR,#TABLE 
	MOVC A,@A+DPTR 
	MOV P0,A 
	MOV A,KEYBUF 
	MOV B,#2 
	MUL AB 
	MOV TEMP,A 
	MOV DPTR,#TABLE1 
	MOVC A,@A+DPTR 
	MOV STH0,A 
	MOV TH0,A 
	INC TEMP 
	MOV A,TEMP 
	MOVC A,@A+DPTR 
	MOV STL0,A 
	MOV TL0,A 
	SETB TR0 
DK4A: 	MOV A,P2 
	ANL A,#0FH 
	XRL A,#0FH 
	JNZ DK4A 
	CLR TR0 
NOKEY4: JNB P1.0,MUSIC
	LJMP WAIT 

MUSIC:
	MOV	R3,#00H
NEXT:
	MOV	A,R3
	MOV	DPTR,#TABLE2
	MOVC	A,@A+DPTR
	JZ	MUSIC
	MOV	R7,A
	INC	R3
	MOV	A,R3
	MOVC	A,@A+DPTR
	MOV	R2,A
	ACALL	SONG
	INC	R3
	SJMP	NEXT


;===============================================================================	
;===  歌曲播放子程序 ===
SONG:
	MOV	A,R2					; 取出节拍
	RL	A
	JNZ	KEEP
	MOV	A,#01H
KEEP:
	MOV	R2,A
REPEAT:
	ACALL	EIGHTH
	DJNZ	R2,REPEAT
	RET
	
;===============================================================================	
;===  产生1/8拍延时子程序  ===		
EIGHTH:
	MOV	A,R7					; 查表取出廷时参数,保存到R4
	MOV	DPTR,#DELAY_T
	MOVC	A,@A+DPTR
	MOV	R4,A
	MOV	A,R7					; 查表取出1/8拍周期数,保存到R5
	MOV	DPTR,#S_PARA
	MOVC	A,@A+DPTR
	MOV	R5,A
NEXTCYC:
	ACALL	SOUND
	DJNZ	R5,NEXTCYC
	RET
	
;===============================================================================	
;===  发声子程序 ===	
SOUND:
	SETB	SPK
	ACALL	SDELAY
	CLR	SPK
	ACALL	SDELAY
	RET
	
;===============================================================================	
;===  延时子程序  ===
SDELAY:
	MOV	A,R4					; 廷时值在R4内
	MOV	R0,A
XL2:
	MOV	R1,#03H
DL1:
	NOP
	DJNZ	R1,DL1
	DJNZ	R0,XL2
	RET
;===============================================================================	
;===  1/8拍周期表  ===
S_PARA:
	DS	1DH
	DB	15H,16H,00
	DB	19H,00H,1CH,00H,1FH,21H,00H,25H
	DB	00H,29H,2CH,00H,31H,34H,37H,00H
	DB	3EH,41H,00H,49H,00H,52H,57H,00H
	DB	62H
	
;===============================================================================	
;===  延时参数表  ===
DELAY_T:
	DS	1DH
	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	1AH

DELY10MS: 
	MOV R6,#10 
D1: 	MOV R7,#248 
	DJNZ R7,$ 
	DJNZ R6,D1 
	RET 
INT_T0: 
	MOV TH0,STH0 
	MOV TL0,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,2402H,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	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -