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

📄 七键电子琴.asm

📁 本程序利用8254以及8255还有扬声器实现了一个简单的七键电子琴。通过按键盘上的相应的数字键
💻 ASM
字号:
dispmsg macro message       ;用来调用显示字符串的宏
     mov dx,offset message
     mov ah,9
     int 21h
     endm

data    segment 

freq1 dw 441,-1
time1 dw 800
freq2 dw 495,-1
time2 dw 800
freq3 dw 556,-1
time3 dw 800
freq4 dw 589,-1
time4 dw 800
freq5 dw 661,-1
time5 dw 800
freq6 dw 742,-1
time6 dw 800
freq7 dw 833,-1
time7 dw 800
data    ends   
    
code    segment   
  assume    cs:code,ds:data   
  ;main    proc    far   
  start:    
               mov    ax,data   
               mov    ds,ax      

                
        l0:   
              inputagain: mov ah,1       ;等待按键
              int 21h
              cmp al,'q'      ;输入是否q,是则退出
              je exit
              cmp al,'1'      ;数字<1?
              jb doagain
              je  play1
              cmp al,'2' 
              je  play2
              cmp al,'3'
              je  play3
              cmp al,'4'      
              je  play4
              cmp al,'5' 
              je  play5
              cmp al,'6'
              je  play6
              cmp al,'7'      ;数字>7?
              je  play7
              ja doagain  
      doagain:jmp inputagain
              
              play1:mov    si,offset    freq1   
                    mov    di,offset    time1 
                    jmp l1 
              play2:mov    si,offset    freq2   
                    mov    di,offset    time2 
                    jmp l1
              play3:mov    si,offset    freq3   
                    mov    di,offset    time3 
                    jmp l1
              play4:mov    si,offset    freq4   
                    mov    di,offset    time4 
                    jmp l1
              play5:mov    si,offset    freq5  
                    mov    di,offset    time5 
                    jmp l1
              play6:mov    si,offset    freq6  
                    mov    di,offset    time6
                    jmp l1
              play7:mov    si,offset    freq7  
                    mov    di,offset    time7
                    jmp l1


              
                
   l1:      mov    cx,[si]   
               cmp    cx,-1  
               je     l0   
               mov    bx,[di]   
               call    gensound   
               add    si,2   
               add    di,2   
               jmp    l1  

               
   exit:mov    ax,4c00h   
               int    21h   
   ;main    endp   
    
   gensound      proc    near   
                 push    dx   
                 mov    al,0b6h;初始化PC机内的8254,10110110   
                 out    43h,al ;计数器2||读写/计数器16位数||方式3||2进制
                 mov    dx,08h   
                 mov    ax,3208h   
                 div    cx     ;CX中存放的是某个音符对应的频率.DX'AX/CX:DX中存余数,AX中存商
                 out    42h,al ;将上述AX中的商输出到8254的计数器2端口,做为计数初值      
                 mov    al,ah   
                 out    42h,al   
                 in    al,61h  ;将PC机内的8255端口B的状态读入AL 
                 mov    ah,al   
                 or    al,3    ;将AL中的第0位和第1位置1  
                 out    61h,al ;将AL中的值输出到PC机内8255的端口B,此时PB0和PB1都为1,
                               ;从而使8255计数器2的OUT2可以输出到PC机内的扬声器   
   l2:          push    dx     ;此处的l2相当于一个延时程序
                 push    ax   
                 mov    dx,8h   
                 mov    ax,0f05h   
   s1:           sub    ax,1   
                 sbb    dx,0 ;SBB:带借位减法 
                 jnz    s1   
                 pop    ax   
                 pop    dx   
                 dec    bx   
                 jnz    l2   
       mov    al,ah ;恢复PC机内8255端口B的状态   
       out    61h,al   
       pop    dx   
       ret   
       gensound    endp   
       code    ends   
       end    start   
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;小结:本程序是通过使用PC机的8254 8255和扬声器来完成音乐演奏的.如果要用实验箱上的的器件,只需要相应地修改各个端口的地址;     即可.
;     本程序比较简单,只能演奏一首音乐,且程序一旦运行,音乐便开始播放直到播放结束,无法人为控制音乐的开始\暂停和停止.
;     因此如果想做的更完美,需要再对程序加以完善.
;///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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