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

📄 piano.txt.asm

📁 可以实现钢琴的发声问题
💻 ASM
字号:
DATA SEGMENT 
DAT DB 0, 45, 75, 100, 125, 157, 190, 222, 252 
HEIGHT DB 0, 40, 70, 100, 130, 160, 190, 220, 250 
DATA ENDS 

CODE SEGMENT 
ASSUME CS:CODE, DS:DATA 

START: MOV AX,DATA 
MOV DS,AX 


MOV AH,0 ; 图形方式:每屏幕字符数80×25, 16色 
MOV AL,12H 
INT 10H 
MOV AH,6 ; 清屏 
MOV AL,0 
MOV CH,0 
MOV CL,0 
MOV DH,18H 
MOV DL,4FH 
INT 10H 



MOV SI,451 
MOV DX,480 
REDRAW:MOV DI,16 
ADD DI,48 
MOV CX,16 

SUB DX,1 
CMP DX,SI 
JB LL 
MOV BL,0 
PAINT: MOV AL,9 
MOV AH,0CH 
MOV BH,0 
INT 10H 
INC CX 
CMP CX,DI 
JBE PAINT 
ADD DI,80 
ADD CX,32 
INC BL 
CMP BL,7 
JBE PAINT 
JMP REDRAW 


LL: 
MOV AL,80H ;对8255进行初始化工作,A口、B口均为输出状态工作与方式0 
OUT 63H,AL 
MOV AL,0B7H ;对计数器8253进行初始化工作,选2号计数器,且先读写低8位后高8位,工作与模式3 
OUT 43H,AL 

PP: MOV AH,01H 
INT 16H 
JZ PP 

SUB AL,30H 
CMP AL,09H ;AL中的参数将传递到SOUND子程序去 
JAE OVER1 

CALL SOUND 

JMP PP 

OVER1:JMP OVER 


SOUND PROC NEAR 
PUSH AX 
PUSH BX 
PUSH CX 
PUSH DX 
PUSH SI 

MOV AH,0 
MOV SI,AX ; 保护AL于SI中,以待后用,作为参数传递 
MOV BX,OFFSET DAT 
XLAT 

MOV DI,AX 
MOV DX,12H 
MOV AX,34DCH 
DIV DI 
OUT 42H,AL 
MOV AL,AH 
OUT 42H,AL 
IN AL,61H 
OR AL,3 
OUT 61H,AL ;此时喇叭将在计数器输出的频率工作发声,且CPU得以解放可执行下面的绘图工作 

CALL PIANO 

MOV AL,0 
OUT 61H,AL 

MOV AL,0H 
MOV AH,0CH 
INT 21H 

POP SI 
POP DX 
POP CX 
POP BX 
POP AX 
RET 

SOUND ENDP 

PIANO PROC NEAR 
PUSH AX 
PUSH BX 
PUSH CX 
PUSH DX 
PUSH DI 

MOV AX,SI 
MOV BH,AL ;BH中表示按得是什么键, 
MOV BL,0 
PUSH BX 
MOV BX,OFFSET HEIGHT 
XLAT 
POP BX ;BH中表示按得是什么键, 
MOV AH,0 
PUSH AX ;AX中的为键柱的高度 

MOV DX,450 
MOV CX,10 
DEC BH 
MOV AL,BH 
MOV BL,80 
MUL BL 
ADD CX,AX ;CX中为键柱的起始横坐标 

;;;;;;;;;; 
POP AX ;AX中的为键柱的高度 
INC BH ;BH中表示按得是什么键, 
;;;;;;;;;; 

MOV SI,CX 
ADD SI,32 ;SI中为横坐标的边界 
MOV DI,DX 

SUB DI,AX ;DI中为纵坐标的边界 


OK: PUSH SI 
SUB SI,32 
MOV CX,SI 
POP SI 
SB: MOV AL,0EH 
MOV AH,0CH 
MOV BH,0 
INT 10H 
INC CX 
CMP CX,SI 
JBE SB 
DEC DX 
CMP DX,DI 
JAE OK 

PUSH BX 
PUSH CX 
MOV BX,5000 
DELAY:MOV CX,0FfFH 
DL10MS:LOOP DL10MS 
DEC BX 
JNZ DELAY 
POP CX 
POP BX 



MOV DX,DI 
MOV DI,450 
GO: PUSH SI 
SUB SI,32 
MOV CX,SI 
POP SI 
CA: MOV AL,0H 
MOV AH,0CH 
MOV BH,0 
INT 10H 
INC CX 
CMP CX,SI 
JBE CA 
INC DX 
CMP DX,DI 
JBE GO 


POP DI 
POP DX 
POP CX 
POP BX 
POP AX 

RET 

PIANO ENDP 

OVER: MOV AH,4CH 
INT 21H 

CODE ENDS 
END START

⌨️ 快捷键说明

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