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

📄 gangqin.txt

📁 数据库课程设计中的用键盘实现钢琴程序的!
💻 TXT
字号:
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 + -