微機介面複習

俠客小飛發表於2020-09-18

微機介面複習

一、複習方向

image-20200917085321966

二、程式查詢方式輸入輸出

image-20200917091132350

例題:以查詢方式程式設計,從記憶體中首地址為BUFFER的緩衝區向CRT終端輸出128個位元組,CRT終端資料口地址為0008H,狀態口地址為0020H,D7為狀態位,0表示輸出快取空閒。

    MOV BX,OFFSET BUFFER ;首地址
    MOV CX,128   ;累加器賦值128
LOP:MOV DX,0020H ;狀態口地址
    IN AL,DX ;輸入狀態
    AND AL,10000000B ;按位與操作,保留最高位D7的值
    JNZ LOP ;如果D7的值非0,跳轉到LOP處
    MOV AL,[BX] ;取出資料
    MOV DX,0008H ;資料口地址
    OUT DX,AL ;輸出
    LOOP LOP ;迴圈128次,和累加器CX聯用
    HLT ;結束


三、8259A的單片初始化和多片初始化

image-20200917093156767

初始化需要看初始化命令字ICW

ICW1

image-20200917094019313

ICW2

image-20200917094107250

ICW3:注意主片的ICW3和從片的ICW3不一樣,單片8259A初始化的時候一般不用ICW3

image-20200917094206201

ICW4

image-20200917094359761

單片8259A初始化

舉例:IBMPC機中,只有一片8259A,可接受外部8級中斷。在I/O地址中,分配8259A的埠地址為20H和21H,初始化為:邊沿觸發、緩衝連線、中斷結束採用EOI命令、中斷優先順序採用完全巢狀方式,8級中斷源的中斷型別分別為08H~0FH初始化程式為:

    MOV DX,20H ;8259A的初始化地址(偶地址)
    MOV AL,00010011B ;寫入ICW1,邊沿觸發,呼叫地址間隔為8,單片,需要ICW4
    OUT DX,AL

    MOV DX,21H ;8259A的初始化地址(奇地址)
    MOV AL,08H ;寫入ICW2,即00001000B,取中斷型別的高5位
    OUT DX,AL 
    MOV AL,00001101b ;寫入ICW4.全巢狀方式,緩衝方式主,非自動EOI,8086模式
    OUT DX,AL 
    XOR AL,AL ;寫入OCW1
    OUT DX,AL 
    STI

多片8259A的初始化

例題:

image-20200917104942397

image-20200917105029892

    ;初始化主片
    INT A00 EQU 020H ;8259A主片埠(偶地址)
    INT A01 EQU 021H ;8259A主片埠(奇地址)
    MOV AL,00010001B ;寫入ICW1,邊沿觸發、呼叫地址間隔為8、級聯、需要ICW4
    OUT INTA00,AL 
    JMP SHORT $+2 ;I/O埠延時要求(下同)
    MOV AL,00001000B ;寫入ICW2,即08H,中斷號的高5位,D2~D0不起作用
    OUT INTA01,AL 
    JMP SHORT $+2 
    MOV AL,00000100B ;寫入ICW3,主片上的IR2接從片
    OUT INTA01,AL 
    JMP SHORT $+2 
    MOV AL,00000001B ;寫入ICW4,全巢狀、非緩衝、非自動EOI、8086模式
    OUT INTA01,AL 

    ;初始化從片
    INT B00 EQU 0A0H ;8259A主片埠(偶地址)
    INT B01 EQU 0A1H ;8259A主片埠(奇地址)
    MOV AL,00010001B ;寫入ICW1,邊沿觸發、呼叫地址間隔為8、級聯、需要ICW4
    OUT INTB00,AL 
    JMP SHORT $+2 ;I/O埠延時要求(下同)
    MOV AL,10110000B ;70H,寫入ICW2,即70H,中斷號的高5位,D2~D0不起作用
    OUT INTB01,AL 
    JMP SHORT $+2 
    MOV AL,00000010B ;02H,寫入ICW3,主片上的IR2接從片
    OUT INTB01,AL 
    JMP SHORT $+2 
    MOV AL,00000001B ;01H,寫入ICW4,全巢狀、非緩衝、非自動EOI、8086模式
    OUT INTB01,AL 

四、8255A方式0和方式1

8255A方式0初始化:

image-20200917171559736

    ORG 100H ;定位,從100開始
    MOV DX,303H ;8255A的控制口地址,A1A0=11
    MOV AL,10000001B ;方式控制字1有效、A口控制方式0,輸出、C口的高半位元組輸出、B口的控制方式0,輸出、C口的低半位元組輸入。
    OUT DX,AL ;
    MOV AL,00001111B ;PC7置高,使STB=1
    OUT DX,AL ;
    MOV SI,OFFSET BUF ;列印字元的首記憶體地址
    MOV CX,0FFH ;列印256個字元個數,11111111B
  L:MOV DX,302H ;PC口地址,A1A0=10
    IN AL,DX ;
    AND AL,00000100B ;查BUSY=0?(PC2=0)但是復位狀態
    JNZ L ;如果不為0,忙,則等待;不忙,則向PA口送數
    MOV AL,300H ;PA口地址,A1A0=00
    MOV AL,[SI] ;從記憶體取數
    OUT DX,AL ;送數到PA口
    MOV DX,303H ;8255A的控制口
    MOV AL,00001110 ;STB訊號置低,PC7=0
    OUT DX,AL
    NOP ;負脈衝(延時)
    NOP
    MOV AL,00001111B ;STB訊號置高,PC7=1 
    OUT DX,AL
    INC SI ;記憶體地址加1
    DEC CX ;位元組數減1
    JNZ L ;if  not zero,CX不為0,跳轉到L處

    MOV AL,4CH ;程式結束標誌
    INT 21H
    BUF DB ;256個ASCII字元程式碼

8255A方式1初始化及應用:

題目:在甲乙兩臺微型計算機之間並行傳送1K位元組的資料。甲機傳送,乙機接收。甲機一側的8255A採用方式1工作,乙機一側的8255A採用方式0工作。兩側的CPU與介面之間都採用查詢方式交換資料。

image-20200917180929392

image-20200917181004681

甲機傳送程式

    MOV DX,303H ;8255A的控制口地址,A1A0=11
    MOV AL,10100000B ;方式控制字有效、A口控制方式1,輸出、C口的高半位元組輸出、B口的控制方式0,輸出、C口的低半位元組輸出。
    OUT DX,AL ;
    MOV AL,00001101B ;PC6置高,使INTRA=1 
    OUT DX,AL ;
    MOV SI,OFFSET BUFS ;傳送資料區的指標
    MOV CX,3FFH ;傳送1024個位元組數,011111111111B
    MOV DX,300H ;向PA口寫第一個數,產生第一個OBF訊號
    MOV AL,[SI] ;送給乙方,以便獲取乙方的ACK訊號
    OUT DX,AL 
    INC SI ;記憶體地址加1
    DEC CX ;傳送位元組減1
  L:MOV DX,302H ;PC口
    IN AL,DX ;查傳送中斷請求
    AND AL,00001000B ;INTRA=1?(PC3=1?)
    JZ L ;如果為0,若無中斷請求,則等待,若有中斷請求,則向PA口寫數
    MOV DX,300H ;PA口地址
    MOV AL,[SI] ;從記憶體中取數,通過PA口向乙機傳送第二個資料
    OUT DX,AL
    INC SI ;記憶體地址加1
    DEC CX ;位元組數減1
    JNZ L ;位元組未完繼續
    MOV AH,4CH ;程式結束標誌
    INT 21H
    BUF DB

乙機接收程式:

    MOV DX,303H ;8255A的控制口
    MOV AL,0A8H ;10101000,方式控制字有效,A口方式方式1輸出,c口高半位元組輸入,B口方式0輸出,C口低半位元組輸入
    OUT DX,AL 
    MOV AL,07H ;00000111,PC3=1置ACK=1
    OUT DX,AL
    MOV DI,OFFSET BUFR ;設定接收資料區的指標
    MOV CX,3FFH ;接收位元組數
 L1:MOV DX,302H ;8255A的PC口,A1A0=10
    IN AL,DX ;查詢
    AND AL,80H ;10000000檢查甲機的OBF=0?(乙機的PC7=0)
    JNZ L1 ;若無資料發來,則等待,若有資料發來,則從PA口讀數
    MOV DX,300H ;8055A的PA口地址
    IN AL,DX ;從PA口讀入資料
    MOV [DI],AL ;存入記憶體
    MOV DX,303H ;8255A的控制口
    MOV AL,06H ;00000110,PC3置0
    OUT DX,AL ;
    NOP ;延時
    NOP
    MOV AL,07H ;00000111,PC3=1 
    OUT DX,AL 
    INC DI ;記憶體地址加1
    DEC CX ;位元組數減1
    JNZ L1 ;如果不等於0,跳轉到L1,等於0的話結束
    MOV AH,4CH ;程式結束標誌
    INT 21H
    BUFR DB 1024 DUP(?) 

五、8253計數器的應用

image-20200918150757651

原理圖和流程圖

image-20200918150930459

CODE SEGMENT 
ASSUME CS:CODE,DS:CODE ;段關聯,資料段,程式碼段
    ORG 100H ;定位100H
START:JUMP BEGIN ;跳轉到begin處
    LONG1 EQU 6 ;長音和短音的定義
    SHORT EQU 1 
BEGIN:MOV AX,CODE
    MOV DS,AX   ;初始化8253
    MOV AL,0B6H ;10110110B,方式命令:選擇計數器2,先讀寫位元組,後讀寫高位元組
    OUT 43H,AL ;43H是8253命令口A1A0=11
    MOV AX,5D3H ;產生800Hz的方波初值,題上給出的值相除後1491轉二進位制是101 1101 0011B轉十六進位制剛好是5D3H
    OUT 42H,AL ;8253的計數器2口,像計數器2裝初始值,先裝低位元組
    MOV AL,AH ;後裝高位元組
    OUT 42H,AL ;關閉揚聲器
    IN AL,61H ;01100001B,讀入8255A的PB口
    AND AL,0FCH ;11111100B,AND運算,置PB0和PB1為0,關閉GATA2與門
    OUT 61H,AL ;查任意鍵,啟動發生器
WAIT1:MOV AH,0BH ;00001010B選擇計數器0、鎖存暫存器、方式5硬體觸發選通、二進位制計數
    INT 21H     ;中斷
    CMP AL,00H ;比較一下有無按鍵按下
    JE WAIT1    ;無按鍵按下等待,有按鍵按下,發出長音
    ;髮長音
LOP:MOV BL,LONG1 ;長音入口引數
    CALL SSP     ;呼叫發聲子程式
    MOV AH,0BH ;00001010B,同上,功能呼叫,檢測外部硬體
    INT 21H
    CMP AL,00H ;比較
    JE CONTINUE1 ;無按鍵按下發短音,有按鍵按下檢測是否為ESC鍵
    MOV AH,08H ;00001000B方式4,軟體觸發選通
    INT 21H
    CMP AL,1BH ;00011011B比較一下是否為ESC
    JE QUIT     ;是,停止發聲並退出
CONTINUE1:MOV BL,SHORT1 ;短音入口引數
    CALL SSP    ;呼叫發聲子程式
    JMP LOP     ;迴圈
    ;關閉揚聲器,並退出
QUIT:IN AL,61H ;quit,停止發聲,退出,61H是PB口地址
    MOV AH,AL
    AND AL,OFCH ;
    OUT 61H,AL
    MOV AL,AH ;
    OUT 61H,AL
    MOV AH,4CH;
    INT 21H
    ;發聲子程式
SSP PROC NEARCH
    IN AL,61H   ;讀取PB口的原值
    OR AL,03H   ;後兩位PB0,PB1置高,開啟GATE2和與門
    OUT 61H,AL  ;向PB口輸出,開始發聲
    SUB CX,CX   ;設定CX的值為CX乘CX
  L:LOOP L
    DEC BL      ;BL為子程式的入口條件
    JNZ L
    RET 
SSP ENDP
CODE ENDS
END START 

相關文章