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

📄 cx.txt

📁 按键发声
💻 TXT
字号:
外甥让我帮他做个用汇编实现的钢琴发声程序,可惜偶汇编早已忘的干干净净,所以只能来求   
  各位了!!!:   我的qq是153534454,如果大家对题目不清楚的话加我qq,谢谢!   
    
  现在给出代码,下面代码是完整的,但是是实现8个键的程序,现在要求改为实现有9个键的程序,   
  发声音阶:1,2,3,4,5,6,7,1+,2+,(其中1+,2+表示升一个音阶)   
  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 + -