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