跑馬燈/輸入輸出接口(片選地址74LS273)
;NAME:跑馬燈;AUTOR:;CONTENT:P1.0~P1.7接發(fā)光二極管L1~L8
CSEGAT4000H;定義起始地址,為什么是4000H呢 ;存儲(chǔ)器:程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器統(tǒng)一編址,達(dá)64K,板上ROM(16K);RAM ;(32K)供用戶使用,可擴(kuò)展至48k。用戶存儲(chǔ)器起始地址為4000H;8051原 ;有中斷入口地址均定位在偏移4000H之后的相應(yīng)地址LJMPSTARTCSEGAT4100HSTART:MOVA,#01H ;先讓第一個(gè)發(fā)光二極管點(diǎn)亮,選#01的原因是加了反相器LOOP:MOVP1,A ;從P1口輸出到發(fā)光二極管DELAY500MS:;延時(shí)0.5秒MOVR7,#0BHDL1:MOVR6,#5CHDL0:MOVR5,#7AHDJNZR5,$DJNZR6,DL0DJNZR7,DL1RLA;左移一位,點(diǎn)亮下一個(gè)發(fā)光二極管LJMPLOOPEND
;NAME:輸入輸出接口(讀出開(kāi)關(guān)的閉合還是斷開(kāi));AUTOR:;TIME: 2012年4月12日18:22:14;CONTENT:P1.0~P1.7接按鈕K1~K8;74LS273的SO0~SO7接發(fā)光二極管L1~L8,片選端CSU8接CS0(由程序選擇的入口地址而定)?!ORTEQU0CFA7H;片選地址CS0CSEGAT4000H ;絕對(duì)尋址,同上LJMPSTARTCSEGAT4100HSTART:MOVP1,#0FFHLOOP:MOVA,P1;從P1口讀取開(kāi)關(guān)狀態(tài)MOVDPTR,#PORTMOVX@DPTR,A;從74LS273輸出到發(fā)光二極管LJMPLOOP;循環(huán)END
片選地址74ls172的接法
74LS273是一個(gè)八位的數(shù)據(jù)/地址鎖存器。本例采用74LS273擴(kuò)展I/O輸出端口,通過(guò)片選信號(hào)和寫(xiě)信號(hào)將數(shù)據(jù)總線上的值鎖存在74LS273中,同時(shí)在74LS273的端口輸出數(shù)據(jù)。當(dāng)數(shù)據(jù)總線上的值撤銷后,由于74LS273能鎖存信號(hào),所以74LS273的輸出端保持不變,直到有新的數(shù)據(jù)被鎖存。
1. 硬件設(shè)計(jì)創(chuàng)建一個(gè)新的Design,添加如下元件(略去晶振和復(fù)位電路):
元 件 名
所 在 類
參 數(shù)
備 注
AT89C51
Microprocessor ICs
8051 Family
單片機(jī)
LED-YELLOW
Optoelectronics
Leds
LED
RES
Resistors
Generic
270Ω
電阻
74LS273
TTL 74LS Series
Flip-Flop & Latches
雙穩(wěn)態(tài)多諧振蕩器&閉鎖
鎖存器
74LS32
TTL 74LS Series
Gates & Inverters
門(mén)電路 & 反相器
或門(mén)
用8個(gè)發(fā)光二極管顯示單片機(jī)的輸出數(shù)據(jù),輸出為低電平時(shí)LED燈亮。74LS273的D0~D7為8位數(shù)據(jù)輸入端,接單片機(jī)的P0口,Q0~Q7為8位數(shù)據(jù)輸出端,CLK為觸發(fā)時(shí)鐘輸入端,MR為數(shù)據(jù)清除使能端。采用或門(mén)74LS32進(jìn)行地址譯碼,U3:A的輸入端分別接單片機(jī)的P2.7口和WR口,輸出端接74LS273的CLK口。
從74LS273的真值表可以看出,當(dāng)MR為低電平時(shí),所有的Q端為0,否則Q端隨D端而定,因此,MR應(yīng)置為高電平。CLK在上升沿時(shí)完成數(shù)據(jù)鎖存操作,因此U3:A的輸出必須完成一個(gè)由低到高的變化。當(dāng)寫(xiě)指令有效時(shí),輸出低電平,只有P2.7同時(shí)為低電平時(shí),才能在寫(xiě)指令完成時(shí)實(shí)現(xiàn)一個(gè)由低到高的電平變化,這樣在寫(xiě)完成后,數(shù)據(jù)被74LS273鎖定??梢?jiàn),74LS273地址應(yīng)該為0XXX XXXX XXXX XXXX,一般我們?cè)O(shè)為7FFF。
2. 程序設(shè)計(jì)在Keil C51中,有以下的內(nèi)存類型:
code 以 MOVC a,@A+DPTR 讀取的程序內(nèi)存
data 可以直接存取的內(nèi)部數(shù)據(jù)存儲(chǔ)器
idata 以 Mov @Rn 存取的內(nèi)部數(shù)據(jù)存儲(chǔ)器
bdata 可以位尋址(Bit Addressable)的內(nèi)部存儲(chǔ)器
xdata 以 MOVX @DPTR 存取的外部數(shù)據(jù)存儲(chǔ)器
pdata 以 MOVX @Rn 存取的外部數(shù)據(jù)存儲(chǔ)器
為了定義使用方便,在absacc.h文件中對(duì)此進(jìn)行了宏定義,比如此例中的地址0x7fff,就可寫(xiě)為XBYTE[0x7fff]。
#include "at89x51.h"
#include "absacc.h"
#define A74273 XBYTE[0x7fff]
void main(void)
{
A74273 = 0x2b;
while(1);
}
注意了:當(dāng)寫(xiě)指令有效時(shí)(應(yīng)該是WR,無(wú)效時(shí)為高),輸出低電平,只有P2.7同時(shí)為低電平時(shí),才能在寫(xiě)指令完成時(shí)實(shí)現(xiàn)一個(gè)由低到高的電平變化,這樣在寫(xiě)完成后,數(shù)據(jù)被74LS273鎖定。可見(jiàn),74LS273地址應(yīng)該為0XXX XXXX XXXX XXXX,一般我們?cè)O(shè)為7FFF。