把语言通计算机当钢琴用怎么弄,
- 提问者网友:人傍凄凉立暮秋
- 2021-03-07 14:16
- 五星知识达人网友:胯下狙击手
- 2021-03-07 15:23
DAT DB 0, 45, 75, 100, 125, 157, 190, 222, 252
HEIGHT DB 0, 40, 70, 100, 130, 160, 190, 220, 250
DATA ENDSCODE SEGMENT
ASSUME CS:CODE, DS:DATASTART: 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,16SUB 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,ALPP: MOV AH,01H
INT 16H
JZ PPSUB AL,30H
CMP AL,09H ;AL中的参数将传递到SOUND子程序去
JAE OVER1CALL SOUNDJMP PPOVER1:JMP OVER
SOUND PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SIMOV AH,0
MOV SI,AX ; 保护AL于SI中,以待后用,作为参数传递
MOV BX,OFFSET DAT
XLATMOV 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 PIANOMOV AL,0
OUT 61H,ALMOV AL,0H
MOV AH,0CH
INT 21HPOP SI
POP DX
POP CX
POP BX
POP AX
RETSOUND ENDPPIANO PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DIMOV 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,DXSUB 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 OKPUSH 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 AXRETPIANO ENDPOVER: MOV AH,4CH
INT 21HCODE ENDS
END START
- 1楼网友:忘川信使
- 2021-03-07 16:40
编写程序,程序运行时使pc机成为一架可弹奏的“钢琴”。当按下数字键1~8时,依次发出1,2,3,4,5,6,7,i八个音调。按q键则退出“钢琴”状态。
要应用芯片8253定时器是pc机发出不同的声音。具体频率值与音符的对应关系见下表:
键入字符:1 2 3 4 5 6 7 8
音符 :1 2 3 4 4 6 7 8
频率值: 524 588 660 698 784 880 988 1048
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