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

📄 电子琴+心图.asm

📁 在PC机上 利用dos 环境 开发一个电子琴和电子钟的界面
💻 ASM
📖 第 1 页 / 共 2 页
字号:
.486
;-----------------------------------------------------------------------
DATA_ORGATRON	SEGMENT
;--------------六类歌曲频率和节拍定义------------------------------------------
mus_freq1 	dw 	330,294,262,330,294,262,330,294,330,262,330,440,392,330
         	dw 	392,440,440,392,440,392,330,294,262,294,330,294,262,294,-1
mus_time1 	dw 	40*9,40*9,80*9,40*9,40*9,80*9,40*9,40*9,40*9,40*9,40*9,40*9,80*9,20*9,20*9  
         	dw 	40*9,40*9,40*9,40*9,80*9,20*9,20*9,40*9,40*9,40*9,40*9,40*9,80*9
mus_freq2	dw	330,294,262,294,3 dup(330)
		dw	3 dup(294),330,392,392
		dw	330,294,262,294,4 dup(330)
		dw	294,294,330,294,262,-1
mus_time2	dw	6 dup(10*25),10*50
		dw	2 dup(10*25,10*25,10*50)
		dw	12 dup(10*25),10*100
mus_freq3	dw	330,392,330,294,330,392,330,294,330
         	dw	330,392,330,294,262,294,330,392,294,-1
mus_time3 	dw 	3 dup(2*25*10),1*25*10,1*25*10,2*25*10,1*25*10,1*25*10,4*25*10
         	dw 	2 dup(2*25*10,2*25*10,1*25*10,1*25*10),4*10*25
mus_freq4	dw 	392,330,330,349,294,294,262,294,330,349,4 dup(392),330,330,349,294,294
     		dw 	262,330,392,392,3 dup(330),5 dup(294),330,349,5 dup(330),349,392
     		dw 	392,330,330,349,294,294,262,330,392,392,262,-1
mus_time4	dw 	2 dup(25*10,25*10,50*10),4 dup(25*10),3 dup(25*10,25*10,50*10)
     		dw 	3 dup(6 dup(25*10),50*10)
    	 	dw 	2 dup(25*10,25*10,50*10),4 dup(25*10),100*10	
mus_freq5	dw 	262,262,392,392,440,440,392,349,349,330,330,294,294,262
     		dw 	2 dup(392,392,349,349,330,330,294)
     		dw 	262,262,392,392,440,440,392,349,349,330,330,294,294,262,-1
mus_time5 	dw 	3 dup(6 dup(25*10),50*10,6 dup(25*10),50*10)
mus_freq6	dw 	7 dup(330),392,262,294,330,4 dup(349),2 dup(330),330,294,294,262,294,392
     		dw 	7 dup(330),392,262,294,330,4 dup(349),2 dup(330),392,392,349,294,262,-1   
mus_time6  	dw 	2 dup(25*10,25*10,50*10),4 dup(25*10),100*10,2 dup(25*10,25*10,50*10)
     		dw 	4 dup(25*10),2 dup(50*10),2 dup(25*10,25*10,50*10)
     		dw 	4 dup(25*10),100*10,2 dup(25*10,25*10,50*10),4 dup(25*10),100*10
;---------------高中低音频率表---------------------
LOWD		DW	131,147,165,175,196,220,247
MID		DW	262,294,330,349,392,440,494
HGH		DW	523,587,659,697,783,879,987
;---------------21个琴键----------------------------
ORGATRON_KEY	DB	'Q','W','E','R','U','I','O'
		DB	'A','S','D','F','J','K','L'
		DB	'Z','X','C','V','M',',','.'
;--------------------------------------------------
KEY_FIGURE	DB	00H,01H,02H,03H,04H,05H,06H
		DB	07H,08H,09H,10D,11D,12D,13D
		DB	14D,15D,16D,17D,18D,19D,20D
KEY_PICTURE	DB	?
full db 0
buff1 db '   Welcome you to run this programme!'
      db '                                     '
      db '           *****Please press any key*****$'
buff2 db '       My heart beats with yours!'
      db '             ***** Please q to quit *****$'
DATA_ORGATRON	ENDS
;------------------------------------------------------------------------
STACK_ORGATRON	SEGMENT
		DW	100 DUP(?)
STACK_ORGATRON	ENDS
;------------------------------------------------------------------------
CODE_ORGATRON	SEGMENT
	ASSUME	DS:DATA_ORGATRON,CS:CODE_ORGATRON,SS:STACK_ORGATRON
MAIN_ORGATRON	PROC	FAR
START_ORGATRON:	
	PUSH	DS
	SUB	AX,AX
	PUSH	AX
	MOV	AX,DATA_ORGATRON
	MOV	DS,AX
MAIN_MUSIC:
	CALL    FAR PTR MUSIC_ORGATRON
	CALL	FAR PTR	MUSIC_YANZOU
	CALL	FAR PTR MAIN
;------------设置循环模式-----------------------------------
	;MOV	AH,1H	
	;INT	16H
	;JZ	MAIN_MUSIC
	;MOV	AH,0           ;是否有键按下
	;INT	16H
	;JZ	MAIN_MUSIC	
	;CMP	AL,0DH         ;是回车键则退出
	;JNE	MAIN_MUSIC
	;JMP	MAIN_RETURN
	MOV	AH,4CH
	INT	21H
;----------------------------------------------------------------------	
;-------按T、Y、G、H、B、N键,分别播放六首歌曲,回车键返回!-----------
MUSIC_ORGATRON	PROC	FAR
	PUSH	BP
	PUSH	SI
	PUSH	AX
	PUSH	DI
	PUSH	BX
ms1: 	                     ;歌曲类型识别程序
	mov	ah,1
	int	16h
	jz	ms1
	mov	ah,0
	int	16h
	cmp	al,'/'    ;%%%%%%%%%%%%下划线/,歌曲播放模式结束%%%%%%%%%%%
	jnz	r_r
	JMP	RR_RETURN
r_r:	cmp	al,'T'
	jnz	ms2
ms11:	lea     si,mus_freq1
	lea	bp,ds:mus_time1
	jmp	freq
ms2:	
	cmp	al,'Y'
	jnz	ms3
ms21:	lea     si,mus_freq2
	lea	bp,ds:mus_time2
	jmp	freq
ms3:	
	cmp	al,'G'
	jnz	ms4
ms31:	lea     si,mus_freq3
	lea	bp,ds:mus_time3
	jmp	freq
ms4:	
	cmp	al,'H'
	jnz	ms5
ms41:	lea     si,mus_freq4
	lea	bp,ds:mus_time4
	jmp	freq
ms5:	
	cmp	al,'B'
	jnz	ms6
ms51:	lea     si,mus_freq5
	lea	bp,ds:mus_time5
	jmp	freq
ms6:	
	cmp	al,'N'
	jnz	pan_duan
ms61:	lea     si,mus_freq6
	lea	bp,ds:mus_time6
	jmp	freq
pan_duan: 
	cmp	al,'/'
	jnz	ms1
	JMP	RR_RETURN
freq:
	mov	di,[si]
	cmp	di,-1
	je	ms1
	mov	bx,ds:[bp]
	call   far ptr soundf
	add	si,2
	add	bp,2
	mov	ah,1h
	int	16h
	jz	rr
	mov	ah,0
	int	16h
	cmp	al,'T'
	jnz	r1
	call	far ptr delay
	jmp	ms11
r1:	cmp	al,'Y'
	jnz	r2
	call	far ptr delay
	jmp	ms21
r2:	cmp	al,'G'
	jnz	r3
	call	far ptr delay
	jmp	ms31
r3:	cmp	al,'H'
	jnz	r4
	call	far ptr delay
	jmp	ms41
r4:	cmp	al,'B'
	jnz	r5
	call 	far ptr delay
	jmp	ms51
r5:	cmp	al,'N'
	jnz	r6
	call	far ptr delay
	jmp	ms61
r6:	cmp	al,'/'    ;%%%%%%%%%%%%下划线/,歌曲播放模式结束%%%%%%%%%%%
	jnz	rr
	JMP	RR_RETURN
rr:	jmp	freq
;--------------------------------------------------------
RR_RETURN:
	POP	BX
	POP	DI
	POP	AX
	POP	SI
	POP	BP
	RET
MUSIC_ORGATRON	ENDP
;----------------------------------------------------------------
;--------------------------------------------------------
;------------------演奏模式------------------------------
;--------------------------------------------------------
MUSIC_YANZOU	PROC	FAR
	PUSH	AX
	PUSH	BX
	PUSH	SI
	PUSH	DI
	PUSH	BP
	PUSH	CX
;------------------小键盘简化模式------------------
 NEW:	MOV	AH,1H
	INT	16H
	JZ	NEW
	MOV	AH,0           ;是否有键按下
	INT	16H
	JZ	NEW	
	CMP	AL,'*'         ;是*键则返回
	JNE	SLOW
	JMP	RETURN_R1
 SLOW:	CMP	AL,20H	       ;查询按键是否为低音键
	JNZ	SHIGH          ;按键是空格键吗?否则转至查询高音键
	LEA	BX,LOWD
   GO:	MOV	AH,0           ;是空格键则查询下一按键
	INT	16H
	CMP	AL,'1'         ;按键范围控制
	JB	GO
	CMP	AL,'7'
	JA	GO
	AND	AL,0FH         ;按键ASCII码处理
	MOV	AH,0
	MOV	SI,AX
;%%%%%%%%%%%%%图形返回参数处理%%%%%%%%%%%%%%%%
	PUSH	BX
	MOV	BX,AX
	ADD	BX,13
	MOV	KEY_PICTURE,BL
	POP	BX
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	JMP	JSPL           ;转至频率计算程序段
SHIGH:	LEA	BX,HGH         ;查询是否为高音键
	CMP	AL,21H
	JNZ	SH1
	MOV	SI,1
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	MOV	KEY_PICTURE,0
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	JMP	JSPL
 SH1:	CMP	AL,40H         ;是否是SHIFT_2
	JNZ	SH2
	MOV	SI,2
;%%%%%%%%%%%%%高音图形返回参数%%%%%%%%%%%%%%%%
	MOV	KEY_PICTURE,1
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	JMP	JSPL
 SH2:	CMP	AL,23H         ;是否是SHIFT_3到;是否是SHIFT_5键
	JB	SH5
	CMP	AL,25H
	JA	SH5
	MOV	AH,0
	MOV	SI,AX
	SUB	SI,20H
;%%%%%%%%%%%%%图形返回参数处理%%%%%%%%%%%%%%%%
	PUSH	BX
	MOV	BX,SI
	SUB	BX,1
	MOV	KEY_PICTURE,BL
	POP	BX
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	JMP	JSPL
 SH5:	CMP	AL,5EH         ;是否是SHIFT_6
	JNZ	SH6
	MOV	SI,6
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	MOV	KEY_PICTURE,5
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	JMP	JSPL
 SH6:	CMP	AL,26H         ;是否是SHIFT_7
	JNZ	SMID
	MOV	SI,7
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	MOV	KEY_PICTURE,6
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	JMP	JSPL
 SMID:	LEA	BX,MID         ;查询是否为中音键
	CMP	AL,'1'         ;按键范围控制
	JB	RR_KEY
	CMP	AL,'7'
	JA	RR_KEY	
	AND	AL,0FH         ;按键ASCII码处理
	MOV	AH,0
	MOV	SI,AX
;%%%%%%%%%%%%%中音图形返回参数处理%%%%%%%%%%%%%%%%
	PUSH	BX
	MOV	BX,0H
	MOV	BL,6
	ADD	BL,AL
	MOV	KEY_PICTURE,BL
	POP	BX
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 JSPL:	SHL	SI,1           ;按键对应频率处理
	SUB	SI,2
	MOV	DI,[BX][SI]
	CALL	FAR PTR GEN_ORGATRON   ;调用发音子程序	
	JMP	NEW            ;接收下一按键
RR_KEY:
	CALL	FAR PTR KEY_ORGATRON
	JMP	NEW
RETURN_R1:
	POP	AX
	POP	BX
	POP	SI
	POP	DI
	POP	BP
	POP	CX
	RET
MUSIC_YANZOU	ENDP
;---------------演奏发音子程序-------------------------
GEN_ORGATRON	PROC	FAR
	PUSH	AX
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	DI
	MOV	AL,0B6H        ;定时器初始化
	OUT	43H,AL
	MOV	DX,12H
	MOV	AX,34DCH
	DIV	DI
	OUT	42H,AL
	MOV	AL,AH
	OUT	42H,AL         ;定时器送初值
	IN	AL,61H         ;开扬声器
	MOV	AH,AL
	OR	AL,3
	OUT	61H,AL
WAIT_1:	IN	AL,60H
DELAY_1:
	TEST	AL,80H         ;查询键是否开放
	JZ	WAIT_1          ;未开放继续等待
	MOV	AL,AH          ;键放开则关扬声器
	OUT	61H,AL        
	POP	DI	
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	RET
GEN_ORGATRON	ENDP
;------------迷你键盘模式------------------------
KEY_ORGATRON	PROC	FAR
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	DI
	PUSH	BP
	PUSH	SI
	;CMP	AL,'('
	;JNZ	RR1
	;JMP	RETURN_3
RR1:	LEA	SI,ORGATRON_KEY
	LEA	BP,KEY_FIGURE
	CMP	AL,[SI]
	JZ	Q_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	W_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	E_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	R_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	U_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	I_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	O_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	A_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	S_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	D_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	F_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	J_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	K_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	L_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	Z_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	X_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	C_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	V_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	M_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	K1_KEY
	INC	SI
	INC	BP
	CMP	AL,[SI]
	JZ	K2_KEY
	INC	SI
	INC	BP
	JMP	RETURN_ORGATRON	
Q_KEY:	MOV	DI,523
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON	
W_KEY:	MOV	DI,587
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
E_KEY:	MOV	DI,659
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
R_KEY:	MOV	DI,697
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
U_KEY:	MOV	DI,783
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
I_KEY:	MOV	DI,879
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
O_KEY:	MOV	DI,987
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
A_KEY:	MOV	DI,262
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON	
S_KEY:	MOV	DI,294
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
D_KEY:	MOV	DI,330
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
F_KEY:	MOV	DI,349
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
J_KEY:	MOV	DI,392
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
K_KEY:	MOV	DI,440
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
L_KEY:	MOV	DI,494
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
Z_KEY:	MOV	DI,131
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON	
X_KEY:	MOV	DI,147
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
C_KEY:	MOV	DI,165
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
V_KEY:	MOV	DI,175
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
M_KEY:	MOV	DI,196
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
K1_KEY:	MOV	DI,220
	CALL	FAR PTR GEN_ORGATRON
	JMP	RETURN_ORGATRON
K2_KEY:	MOV	DI,247
	CALL	FAR PTR GEN_ORGATRON
	;JMP	RETURN_ORGATRON
RETURN_ORGATRON:
	MOV	BL,[BP]
	MOV	KEY_PICTURE,BL ;返回图形输入参数代码
;RETURN_3:	
	POP	SI
	POP	BP
	POP	DI	
	POP	DX
	POP	CX
	POP	BX
	RET
KEY_ORGATRON	ENDP
;-----------------------------------------------------------------
;-----------------------------------------------------------------
;通用发声子程序
soundf	proc	far
	push	ax
	push	bx
	push	cx
	push	dx
	push	di
	mov	al,0B6h
	out	43h,al	
	mov	dx,12h
	mov	ax,348Ch
	div	di
	out	42h,al
	mov	al,ah
	out	42h,al
	in	al,61h
	mov	ah,al
	or	al,3
	out	61h,al
wait1:	mov	cx,663
	call	far ptr waitf
	dec	bx
	jnz	wait1
	mov	al,ah
	out	61h,al
	pop	di
	pop	dx
	pop	cx
	pop	bx
	pop	ax
	ret
soundf	endp
;-----------------------------------------------------------------
;(CX)=count of 15.08us 利用硬件产生精确延时
waitf	proc	far
	push	ax
waitf1:
	in	al,61h
	and	al,10h
	cmp	al,ah
	je	waitf1
	mov	ah,al
	loop	waitf1
	pop	ax
	ret
waitf	endp
;----------------------------------------------------------------
;去抖动延时程序
delay	proc	far
	PUSH	ECX
	mov	ecx,07000000h
delay1:	loopd	delay1
	POP	ECX
	ret
delay	endp
;----------------------------------------------------------------
;-----------------------------------------------------------------
;MAIN_RETURN:
main proc far
     assume cs:CODE_ORGATRON,ds:DATA_ORGATRON
start:
     push ds
     sub ax,ax
     push ax
     mov ax,data_ORGATRON
     mov ds,ax
     mov ah,00
     mov al,04
     int 10h
     mov ah,0bh
     mov bh,00
     mov bl,1
     int 10h
     mov ah,0bh
     mov bh,1
     mov bl,2
     int 10h
     mov dx,offset buff1               ;显示提示信息
     mov ah,09
     int 21h
     mov ah,08
     int 21h
     call clear                        ;cls
sss:
     call text                         ;display the text
     mov di,2
     mov al,1                          ;draw the big box
     mov cx,70
     mov dx,20
     mov bx,160
     call box
     mov cx,71 
     mov dx,21
     mov bx,158
again:
     mov al,1
     mov di,0
     call box
     call delay11
     mov al,0
     mov di,0
     call box
     inc cx
     inc dx
     sub bx,2
     cmp cx,94
     jnz again
     mov di,0                          ;draw the 2nd box
     mov cx,95
     mov dx,45
     mov al,1
     mov bx,110
     call box
     mov cx,96
     mov dx,46
     mov bx,108
again_00:
     mov al,1
     mov di,0
     call box
     call delay11
     call delay11

⌨️ 快捷键说明

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