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

📄 电子琴+电子钟.asm

📁 在PC机上 利用dos 环境 开发一个电子琴和电子钟的界面
💻 ASM
📖 第 1 页 / 共 5 页
字号:
.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	?
;------------------------------------------------------
; TODO: 数据的定义及存储器的分配
ts1           DB        0
quitbuf       DB        'welcome you to run this programme.                                       '        
quitbuf2      DB        'C: change color;  B:extend the colck;  S:reduce the clock                '   
quitbuf3      DB        'press e to sound; Press q to quit !                                      '   
sigle         DB        80h                         
absx          DW        0  
absy          DW        0               
sut           DW        0
erroybz       DB        0  
r0            DW        90
x0            DW        320
y0            DW        245                                                                                                                                                                          

count0        db    0               
count_hour    DB        11              
count_minute  DB        11
yuanxinx      DW        0
yuanxiny      DW        0                           
             
s             DB        0
s2            DB        0              
s3            DB        0
hour          DW        0
hour2         DW        0              
minute        DW        0
minute2       DW        0              
second        DB        0 
second2       DB        0                                                       
sin_x         DW        0
sin_xx        DW        0 
x             DW        0
y             DW        0
x1            DW        0
              
xminy         DW        0
yminx         DW        0              
xmax          DW        0  
ymax          DW        0   
ymin          DW        0
xmin          DW        0  
sjx_xminy     DW        0
sjx_yminx     DW        0              
sjx_xmax      DW        0  
sjx_ymax      DW        0   
sjx_ymin      DW        0
sjx_xmin      DW        0     
yuanx         DW        0
yuany         DW        0                                                                                                                                                                     
y1            DW        0
x2            DW        0
y2            DW        0
x3            DW        0
y3            DW        0     
DIancolor     DB        0                                     
color         DB        2
color_hour    DB        2
color_min     DB        6
color_second  DB        9  
color4        DB        10
color5        DB        11
color6        DB        12 
backgroundcolor DB      1              
page1         DB        0
y2y1          DW        0    
x2x1          DW        0 
sjx_y2y1      DW        0    
sjx_x2x1      DW        0                                                                                         
                                                       
;------------------------------------------------------
DATA_ORGATRON	ENDS
;------------------------------------------------------------------------
STACK_ORGATRON	SEGMENT
	STACK_BUF DW        120 DUP(?)
    	TOP       EQU       $-STACK_BUF
	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 
;----------------------------------------------------------------------	
;-------按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

⌨️ 快捷键说明

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