匯編:輸入輸出


預備知識

  1. 樂曲簡譜中的每個音符及其節拍,在微機中對應了揚聲器的發聲頻率和持續時間。其中簡譜音符與揚聲器的發聲頻率的對應關系見下表:

  2. 如何使 PC 機的揚聲器發出指定頻率和指定時間長度的聲音?下面簡單介紹一下 PC 機的發聲原理:
    IBM-PC 系列機的主機箱裝有一個小揚聲器,系統板上的定時器 8253(或 8254)利用工作方式3 產生一定頻率信號,通過可編程的並行外圍接口芯片 8255(或 8255A)控制其發音。揚聲器的控制驅動電路如下圖所示。

  • 可編程的並行接口芯片 8255 有三個 8 位的並行端口:A 口、B 口和 C 口。在 IBM 系列微機中,BIOS 在開機自檢后已將 8255 初始化為 A 口和 C 口用於輸入,B 口用於輸出。B 口的 I/O 端口地址
    為 61H。
  • 由圖可見, 8255 的 B 口的低兩位用來控制揚聲器驅動,當 61H 端口的 D0 位為“1”時,控制 8254定時器產生驅動揚聲器發聲的音頻信號,該位為“0”則不發信號。8254 有三個定時器,分為 0 號、1號和 2 號定時器,驅動揚聲器的是 2 號定時器,該定時器工作在方式 3,是一個頻率發生器,它負責向揚聲器發送指定頻率的脈沖信號。
  • 輸出端口 61H 的 D1 位為“1”或為“0”時,將使控制驅動器的與門電路接通或關閉,使 8254 所發出的音頻信號能到達驅動器或被阻斷。這樣通過控制 D1 位的變化,可使揚聲器接通和斷開,控制揚聲器是否能發出聲音。此外,通過控制 D1 位的通斷時間,就能發出不同的音長。
  • 故當 8255 輸出端口 61H 的 D1 位為“1”時,在 61H 的 D0 位為“1”,8254 發出指定頻率的聲音信號的前提下,聲音信號通過與門到達驅動器驅動揚聲器發聲。即是,如要 8255 控制 8254 的 2 號定時器驅動揚聲器發聲,則需要的匯編命令如下:
OR AL, 00000011B
OUT 61H,AL
  • 同時,定時器 8254 的 2 號定時器使用 1.19MHz 的基准頻率,故若要 8254 驅動揚聲器發出指定頻率的聲音,則需要向 2 號定時器的計數常數寄存器(即 I/O 端口 42H)存放基准頻率除以指定頻率的商(即 122870H/指定頻率),該商需分兩次送往 I/O 端口 42H,先送商的低字節,再送商的高字節。同時,在使用定時器 8254 的 2 號定時器之前,需要初始化,即往 8254 的 2 號定時器的控制寄存器(即 I/O 端口 43H)寫控制字 0B6H:
MOV AL, 0B6H
OUT 43H,AL

以上是控制揚聲器發出一定頻率的聲音,若要讓聲音按指定時間持續,可使用 BIOS 提供的時間中斷 INT 1AH 的 00H 號功能作延時,該功能提供了時間計數器的當前值。時間計數器計數一次的時間約為 55.072ms。
3. 實驗箱電路及具體接線
(1)在實驗箱中,原 8255 的 61H 端口使用發生了變化:
需要把實驗箱 8255 的控制口(28bh)進行初始化,然后再對 288H 端口進行寫操作。因為以上端口號超過了 255,故寫端口時,需要用 DX 寄存器暫存端口號,如下:

mov dx,28bH
mov al,10000000B
out dx, al
mov dx,288h
mov al,03h
out dx, al

(2)8254 的 2 號定時器初始化的端口從 43H 變成了 283H,且需要寫控制字 00110110B,如下:

mov dx, 283H
mov al, 00110110B
out dx, al

且原 2 號定時器的計數常數寄存器端口(42H 端口)改為了 280H。

8255/CS接I/O 地址譯碼/Y1(288H——28FH)
8255/PA0接與門/A
8254/CLK0接時鍾/1MHz
8254/CS接I/O 譯碼/Y0(280H——287H)
8254/OUT0接 與門/B
8254/GATE0接與門/Y
8255/PA1接 喇叭

要求

試設計一個程序,能夠使用鍵盤中字母鍵模擬鋼琴按鍵發音。其中,按照字母在鍵盤中的排列方式,字母鍵 z/x/c/v/b/n/m 分別發出低 1—低 7 共 7 個低音音符,字母鍵 a/s/d/f/g/h/j 分別發出中 1—中 7 共 7 個中音音符,字母鍵 q/w/e/r/t/y/u 分別發出高 1—高 7 共 7 個高音音符。按 ESC 鍵退出程序。

源代碼

assume ds:data, ss:stack, cs:code
data segment

    dw 'z', 'x', 'c', 'v', 'b', 'n', 'm'
    dw 'a', 's', 'd', 'f', 'g', 'h', 'j'
    dw 'q', 'w', 'e', 'r', 't', 'y', 'u'
    dw 131, 147, 165, 175, 196, 220, 247
    dw 262, 294, 330, 349, 392, 440, 494
    dw 524, 587, 659, 698, 784, 880, 988

data ends

stack segment
    dw   128  dup(0)
stack ends

code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax    
    mov ax, stack
    mov ss, ax 
    mov sp, 256
;調用子程序
    call piano
; exit to operating system.
    mov ax, 4c00h 
    int 21h  

piano proc              
    ;初始化2號定時器

    mov dx, 283h      
    mov al, 00110110b
    out dx, al  
      
lop:   
    ;char 輸入至 al.存入bl    
    mov ah, 1
    int 21h
    mov bl, al  
    ;判斷esc
    cmp bl, 27   
    je stop 
    
    ;循環比較key----------------------
    mov cx, 21
    mov si, 0         ;記錄key位置
compare:   
    cmp bl, ds:[si]
    ;不同則跳過
    jne continue 
    ;相同則發聲並退出compare
        mov bx, ds:[si][42]; 存頻率
        ;求商 -> 2號定時器的計數常數寄存器
        mov dx, 12h
        mov ax, 2870h
        div bx

        mov dx, 280h
        out dx, al
        mov al, ah
        out dx, al
                       
        ;控制2號定時器驅動揚聲器發聲 

        mov dx, 28bh        ;初始化控制口
        mov al, 10000000b    
        out dx, al
        
        mov dx, 288h        ;寫端口
        mov al, 03h
        out dx, al 
        
        ;持續一會就結束  
        call delay 

            
        mov dx, 288h        ;寫端口
        mov al, 0h
        out dx, al 
            

 
        jmp break
continue:    
    add si, 2
    loop compare  
    ;循環比較key---------------------
    
break:    
    jmp lop
stop:
    ret ;返回主程序 
piano endp       

delay proc 
    push cx
    push ax 
    push bx 
    push dx
    mov ah, 0 ;獲取時鍾
    int 1ah        
    mov bx, dx;存鬧鍾
    add bx, 50 ;延時0.2s
dlop:    
    mov ah, 0 ;獲取時鍾        
    int 1ah 
    cmp dx, bx 
    jb dlop
    pop dx
    pop bx    
    pop ax
    pop cx
    ret
delay endp    
code ends

end start ; set entry point and stop the assembler.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM