8255?是用來擴充接口的芯片。
用上一片?8255,就可以為系統(tǒng)增加?3?個?8?位的?IO?接口。
在單片機的教材上,總是使用“三總線”的方式來連接?8255。
在這樣的條件下,輸入/輸出數(shù)據(jù)的速度確實是比較快,一般用?2?個機器周期,就可以讀/寫一次。
但是,采用這種形式,電路則是相當(dāng)麻煩的,必須加上一個鎖存器芯片(74LS373);
并且,對于單片機的引腳,占用的也太多了,如?P0、P2,還要占用?P3.6、P3.7。
呵呵,占用了單片機自身?2?個半的接口,僅僅換來?3?個接口,有點得不償失。
如果搞清楚了?8255?的讀寫時序,使用單片機的接口引線“直接控制”?8255,效果則要好的多。
下圖就是一個“直接控制”?8255?的電路。
在圖中可以看出,僅僅使用了?P0?和?P2?的四個引腳,就近,和?8255?進行連接。
不但節(jié)省了引腳數(shù)目,而且非常靈活。
在設(shè)計實際應(yīng)用的電路板時,可以隨意的就近使用引腳,而不必拘泥于?P0、P3.6、P3.7?等引腳。
當(dāng)把?8255?PA?輸入的開關(guān)量,輸出到?PC?口,使用如下的程序即可。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
匯編語言:
;-----------------------------------
sbit?RD_8255?=?P2^0??;設(shè)定相關(guān)引腳
sbit?WR_8255?=?P2^1??;
sbit?A0_8255?=?P2^2??;
sbit?A1_8255?=?P2^3??;
;-----------------------------------
????ORG???0000H
????MOV???P0,?#92H???;PA輸入,?PB?PC輸出
????CLR???WR_8255????;寫入控制寄存器
????SETB??WR_8255
;---------------------
LOOP:
????MOV???P0,?#255???;輸出1
????CLR???A1_8255????;選定PA
????CLR???A0_8255
????CLR???RD_8255????;讀
????NOP??????????????;稍延時,以保證寬度
????MOV???A,?P0??????;讀出
????SETB??RD_8255
;---------------------
????SETB??A1_8255????;選定PC
????CLR???A0_8255
????MOV???P0,?A??????;寫
????CLR???WR_8255????;寫入
????SETB??WR_8255
;---------------------
????SJMP??LOOP
END
;-----------------------------------
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C?語言:
//----------------------------------
#include
sbit?RD_8255?=?P2^0;
sbit?WR_8255?=?P2^1;
sbit?A0_8255?=?P2^2;
sbit?A1_8255?=?P2^3;
main()
{
????char??aa;
????P0?=?0x92;???//控制字:?PA輸入,?PB?PC輸出
????A1_8255?=?1;??A0_8255?=?1;?//選中控制寄存器
????WR_8255?=?0;??WR_8255?=?1;?//寫
????while(1)??{
??????P0?=?0xff;???//先輸出1
??????A1_8255?=?0;??A0_8255?=?0;?//選中PA
??????RD_8255?=?0;??aa?=?P0;??RD_8255?=?1;?//讀
??????P0?=?aa;?????//這是剛才讀入的
??????A1_8255?=?1;??A0_8255?=?0;?//選中PC
??????WR_8255?=?0;??WR_8255?=?1;?//寫
????}?
}
//----------------------------------
如果需要用?PB?輸出數(shù)據(jù),如下即可:
????P0?=?0xB0;???//輸出數(shù)據(jù)
????A1_8255?=?0;??A0_8255?=?1;?//選中PB
????WR_8255?=?0;??WR_8255?=?1;?//寫
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
因為沒有使用“三總線”方式,所以,也就沒有接口地址的問題。
那么,一般的教材中所說的片外地址,就沒有用了。
下面這些?C?語言中的頭文件、宏定義,也用不上了:
#include
#define?PA?XBYTE[0xE000]??/*PA口地址*/?
#define?PB?XBYTE[0xE001]??/*PB口地址*/?
#define?PC?XBYTE[0xE002]??/*PC口地址*/?
#define?CON?XBYTE[0xE003]?/*控制字地址*/?
呵呵,好多知識,統(tǒng)統(tǒng)都沒有用了,罪過罪過...
按照這種方式,讀寫?IO?口的速度,確實是降低了一些,但是,對于速度要求不太敏感的場合,還是非常適用的。
因為節(jié)省了一個鎖存器芯片,PCB?板的面積,也可以縮小,這就直接使硬件成本得到降低。
有時,一個產(chǎn)品,是否能夠占領(lǐng)市場,成本才是關(guān)鍵,讀寫速度慢上幾個微秒,對性能的影響極其微小。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~