永发信息网

把语言通计算机当钢琴用怎么弄,

答案:2  悬赏:30  手机版
解决时间 2021-03-08 00:41
  • 提问者网友:人傍凄凉立暮秋
  • 2021-03-07 14:16
把语言通计算机当钢琴用怎么弄,
最佳答案
  • 五星知识达人网友:胯下狙击手
  • 2021-03-07 15:23
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 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

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯