8255A可編程外圍設備接口(programmable perphheral interface,PPI)是一種通用的可編程並行I/O接口器件。它可以作為Intel系列微處理器或其它系列微處理器的接口器件,可以將任何與TTL兼容的I/O設備與微處理器連接。在與主頻不高於8MHz的微處理器一起工作時,不需要插入等待周期。
它有24個可編程I/O引腳,分為兩組,每組12個,可以以3種不同的操作方式工作。它的每個I/O引腳可以提供2.5mA的吸入電流,最大4mA。8255A常常用作鍵盤和打印機端口。它的價格低廉,使用方便,得到了廣泛的應用。
8255A的功能結構
由圖可得:
(1)數據總線緩沖器
D7~D0與系統數據總線相連,負責與CPU進行數據交換。包括輸入輸出數據、控制字和狀態字。
(2)讀/寫控制邏輯
接收來自CPU的地址信息和控制信息。
(3)A組控制和B組控制
這兩組控制邏輯電路接收來自CPU的控制字,控制兩組端口的工作方式及讀/寫操作。A組控制端口A和端口C的高4位,B組控制端口B和端口C的低4位。
(4)端口A、B、C
8255A有3個8位數據輸入/輸出端口:端口A、端口B和端口C,分別簡稱為A口、B口和C口。它們對外的引線分別是PA7~PA0、PB7~PB0和PC7~PC0。C口可分成兩個4位的端口:C口高4位(PC7~PC4)和C口低4位(PC3~PC0)。
三個端口按組編程
端口A和端口B都有一個8位數據輸入鎖存器和一個8位數據輸出鎖存/緩沖器。端口C有一個8位數據輸入緩沖器和一個8位數據輸出鎖存/緩沖器。
端口C可以按位操作。
8255A的引腳功能
雙列直插,40根引腳
D7~D0:數據信號線
CS:片選信號輸入引腳,低電平有效
RD:讀信號輸入引腳,低電平有效
WR:寫信號輸入引腳,低電平有效
RESET:復位信號輸入引腳,高電平有效。用於將8255A控制字寄存器清“0”,並將A、B、C口置成輸入狀態
A1、A0:端口選擇信號輸入引腳
8255A的工作方式
8255A可以無條件方式、查詢方式和中斷方式完成CPU與外設的數據交換。
以無條件方式工作時,端口A、B和C都可以作為數據輸入/輸出端口。
以查詢或中斷方式工作時,A口與B口可以作為數據輸入/輸出端口,C口作為握手聯絡信號,負責輸出控制信息或輸入狀態信息。
8255有三種工作方式:方式0、方式1、方式2;
方式0:基本輸入輸出方式
- 適合於三個端口;
- A口、C口的高4位、B口、C口的低四位可分別定義為輸入或輸出,共有四個部分,故共有16種組合。
- C口可以按位進行置位(置0)和復位(置1)。
方式0最適用於無條件傳送方式;
也能用於查詢工作方式,比較勉強,這時可以把C口的高4位定義為輸入口,輸入外設的狀態信號,而將C口的低四位定義為輸出口,輸出控制信息;(C口的輸入端和輸出端不固定,可根據圖中C口與外設相連的方向決定),這時可用A、B口傳送數據;
方式0不能工作在中斷方式;
例:8255A作為連接打印機的接口,工作方式0,端口地址為:0D0H~0D6H,寫出相應的初始化程序和控制程序
注:第一行的81H如何得來?
81H=>10000001B
表示A口輸出,而通過看圖得知,(PC6為高四位),C口高四位輸出,C口低四位輸入。
方式1:選通輸入輸出方式
A口、B口作為數據的輸入口或輸出口,但數據的輸入輸出要在控制信號的控制下,控制信號由C口的某些位來提供;
方式1適用於程序查詢和中斷控制方式,它不能工作在無條件傳送方式下;
選通輸出
在方式1下,A口、B口都可以選通輸出數據,C口的6條線作為選通控制信號:PC3、PC6、PC7配合A口,PC0、PC1、PC2配合B口;
OBF:輸出緩沖器滿信號,低電平有效,當A口/B口有數據時,OBF就會變成低電平,高電平時,CPU可往A口/B口放送數據
ACK:外設收到數據的應答信號,低電平有效
INTE:中斷允許狀態
(工作原理:與PC7通過與門設置PC3的值,當OBF為高電平時,表示CPU可向外設傳數據,但CPU遲遲為將數據傳來,此時可通過PC6將INTE設置為高電平,兩者通過與門后,將PC3置為高電平,向CPU發起中斷請求信號(實際上是提醒CPU往外設傳輸數據)
INTR:中斷請求信號,高電平有效
總結:
-
查詢方式
查詢端口C的BIT7,如果是0則等待;如果不是0,則CPU發送數據。
WAIT: IN AL,PORTC # 從端口C讀取數據 TEST AL,BIT7 JZ WAIT MOV AL,[SI] OUT PORTA,AL
-
中斷方式
- PC3置1,請求中斷
- 置位PC6,允許中斷
- 數據從端口輸出,導致OBF變成高電平,證明端口數據被取走,CPU就會往端口放送數據
- INTE與PC7構成一個與門,導致PC3再次置1
選通輸入
A口、B口都可以選通輸入數據,C口的6條線作為選通控制信號:PC3、PC4、PC5配合A口,PC0、PC1、PC2配合B口;
方式1:
STB:輸入選通信號,外設用它將數據鎖存於輸入數據緩沖器中,低電平有效
IBF:數據輸入緩沖器滿,STB的應答信號,高電平有效
INTE:中斷允許狀態
{工作原理:當IBF為高電平時,表示數據輸入緩沖器滿,但CPU遲遲沒來拿走輸入的數據,這時候就會向CPU發出中斷請求信號,提醒CPU拿走數據)
INTR:中斷請求信號,高電平有效
方式2:雙向傳輸方式
只有A口可以工作在這種方式下。既能發送數據,又能接收數據;它還要利用C口的5條線作為控制信號線; A口的輸入輸出均具有數據鎖存能力,數據的輸入輸出均可以引起中斷;
方式2適用於程序查詢和中斷控制方式。它不能工作在無條件傳送方式下。
這時B口可以工作在方式0或方式1,C口剩余的3條線可以作為輸入輸出線或方式1下的控制線。
8255的控制字
-
方式選擇控制字
【例題】
設8255的端口地址為FBC0~FBC3H,A口設置方式0輸入,B口方式0輸出,C口高4位方式0輸出,C口低4位方式0輸入。
控制字為:10010001B => 91H
8255初始化程序為:
# 由8255的端口地址為FBC0~FBC3H可知,控制端口為FBC3H
MOV DX, 0FBC3H # 以字母F開頭,須在前面加一個0
MOV AL, 91H
OUT DX, AL
-
按位操作控制字
設置PC0為置位,則:00000001
設置PC4為復位,則:00001000
【例題】
設8255的端口地址為FBC0~FBC3H,A口設置方式0輸出,B口方式0輸入,C口高4位方式0輸出,C口低4位方式0輸入,利用C口PC5產生連續的方波信號,信號的高、低電平寬度可調用延時子程序DELAY實現。
控制字為:10000011B =>83H
8255初始化程序為:
MOV DX, 0FBC3H
MOV AL, 83H
OUT DX, AL
FB : MOV AL, 0BH #00001011B 高電平
OUT DX, AL ;PC5置位
CALL DELAY ;維持高電平
MOV AL, 0AH
OUT DX, AL ;PC5=0
CALL DELAY ;維持低電平
JMP FB ;連續輸出方波信號
8255與微處理器的連接
-
8255A的D7~D0分別與系統總線的D7~D0相連;
-
RD、WR分別與系統總線的RD、WR信號或者IOR和IOW信號相連;
-
A1、A0分別與系統地址線A1、A0相連;
-
CS由系統地址總線A2~A15譯碼生成。
在PC機中,8255A的I/O端口地址為60H63H和端口378H37BH。端口60H63H用於鍵盤、揚聲器和定時器,端口378H37BH用於並行打印機(LPT1)端口。
端口地址
8255A包含A口、B口、C口三個獨立的數據端口,及一個控制端口。各端口地址如下:
A1A0=00 A口
A1A0=01 B口
A1A0=10 C口
A1A0=11 控制端口
-
該圖表示8255A有四個地址,因為這里有兩根線 A1 A0,這兩根線決定了8255有四個地址
-
8255要正常工作,必須CS為有效,而CS與Y2相連,也就是Y2必須輸出有效信號
-
如果Y2要有效,必須讓74LS138譯碼器有效,而要74LS138譯碼器有效,必須使得:G1為高電平,G2A為低電平,G2B為低電平這三個一定要滿足
-
C B A 決定Y2是否有效 (不一定是Y2,所以C B A 的值根據下面的值變化)
C B A
0 0 0 Y0有效
0 0 1 Y1有效
0 1 0 Y2有效
0 1 1 Y3有效
1 0 0 Y4有效
1 0 1 Y5有效
1 1 0 Y6有效
1 1 1 Y7有效
-
把圖中CPU的所以地址線A7~A0列出來計算得出地址值
8255A初始化
8255A初始化,設定端口的工作方式和輸入/輸出方向,即將方式控制字寫入控制端口。
初始化程序段如下:
MOV DX, PORT-Ctrl ;8255A的控制口地址送DX
MOV AL, mode ;將方式選擇控制字內容送AL
OUT DX, AL ;寫入控制口,完成初始化
鍵盤接口
利用8255A可以很方便地連接線性鍵盤和矩陣鍵盤。
- 按鍵數量大的鍵盤通常采用矩陣結構,如計算機鍵盤,利用一片8255A的A口和C口的高4位作為行線,B口和C口的低4位作為列線,可以構成12X12=144的矩陣鍵盤。
- 識別鍵盤上哪個鍵被壓下的過程稱為鍵盤掃描。
- 鍵盤掃描有兩種方法:行掃描法和反轉法。
行掃描法
- PC7~PC4 輸出全 0(所有行置0),從 PC3~PC0 讀入,若讀入的數據不是 0FH,表明某一列有鍵按下;
- 延時 20ms 去抖動(按鍵按下時的訊號不穩定),重復第一步動作,若還有鍵閉合,則認為確實有鍵閉合;否則返 回第一步;
- 查找被確認的鍵;從第 0 行開始逐行輸出 0,其他行輸出1(每次只有掃描到的行為0,其他的都為1),然后讀入列的值,檢測是否為0FH,如果是0FH則檢測下一行,如果不是則已經找到按鍵所在的行,輸出所在的行;
- 將輸出的行值數據與第 1 步輸入的數據組成一個字節,查表(鍵的位置碼表),確定鍵值。(如上圖的鍵值8,其位置碼位BE)
反轉法
圖上每行每列比行掃描法都多了一個電阻
- 將 PC7~PC4 設定為輸出,PC3~PC0 設定為輸入。然后 PC7~PC4 輸出全 0,從 PC3~PC0 讀入列值,若讀入的數據有一位為 0,表明該列有鍵按下,保存列值;
- 延時 20ms 去抖動,重復第一步動作,若還有鍵閉合,則認為確實有鍵閉合;否則返 回第一步;
- 將 PC7~PC4 設定為輸入,PC3~PC0 設定為輸出。把保存的列值從 PC3~PC0 輸出, 從 PC7~PC4 讀入行值,讀入的數據必有一位為 0,保存行值。將行值和列值組合在 一起,用查表的方法得到按鍵的鍵值。