微機介面複習
一、複習方向
二、程式查詢方式輸入輸出
例題:以查詢方式程式設計,從記憶體中首地址為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的單片初始化和多片初始化
初始化需要看初始化命令字ICW
ICW1
ICW2
ICW3:注意主片的ICW3和從片的ICW3不一樣,單片8259A初始化的時候一般不用ICW3
ICW4
單片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的初始化
例題:
;初始化主片
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初始化:
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與介面之間都採用查詢方式交換資料。
甲機傳送程式
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計數器的應用
原理圖和流程圖
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