跑馬燈/輸入輸出接口(片選地址74LS273)


;NAME:  跑馬燈
;AUTOR:
;TIEE: 2012年4月12日 18:12:25
;CONTENT: P1.0~P1.7接發光二極管L1~L8     
     CSEG AT 4000H         ;定義起始地址,為什么是4000H呢
                       ;存儲器:程序存儲器、數據存儲器統一編址,達64K,板上ROM(16K);RAM
                       ;(32K)供用戶使用,可擴展至48k。用戶存儲器起始地址為4000H;8051原
                       ;有中斷入口地址均定位在偏移4000H之后的相應地址
     LJMP START 
     CSEG AT 4100H 
START:    
     MOV A, #01H          ; 先讓第一個發光二極管點亮 ,選#01的原因是加了反相器
 LOOP:     
     MOV P1, A            ; 從P1口輸出到發光二極管    
       
 DELAY500MS:               ;延時0.5秒 
        MOV R7,#0BH
 DL1:
        MOV R6,#5CH
 DL0:
        MOV R5,#7AH
        DJNZ R5,$
        DJNZ R6,DL0
        DJNZ R7,DL1 
        RL   A             ; 左移一位,點亮下一個發光二極管 
        LJMP  LOOP
 
 END                 
                                  

 

 

 

;NAME:  輸入輸出接口(讀出開關的閉合還是斷開)
;AUTOR: 
;TIME: 2012年4月12日 18:22:14
;CONTENT: P1.0~P1.7接按鈕K1~K8;74LS273的SO0~SO7接發光     二極管L1~L8,片選端CSU8\接CS0(由程序選擇的入口地址而定)。 
PORT EQU 0CFA7H
;片選地址CS0 CSEG AT 4000H        ;絕對尋址,同上 LJMP START CSEG AT 4100H START: MOV P1, #0FFH LOOP: MOV A, P1 ;從P1口讀取開關狀態 MOV DPTR, #PORT MOVX @DPTR, A ;從74LS273輸出到發光二極管 LJMP LOOP ;循環 END

 

片選地址74ls172的接法

 

74LS273是一個八位的數據/地址鎖存器。本例采用74LS273擴展I/O輸出端口,通過片選信號和寫信號將數據總線上的值鎖存在74LS273中,同時在74LS273的端口輸出數據。當數據總線上的值撤銷后,由於74LS273能鎖存信號,所以74LS273的輸出端保持不變,直到有新的數據被鎖存。

1. 硬件設計

創建一個新的Design,添加如下元件(略去晶振和復位電路):

元 件 名

所 在 類

參 數

備 注

AT89C51

Microprocessor ICs

8051 Family

 

單片機

LED-YELLOW

Optoelectronics

Leds

 

LED

RES

Resistors

Generic

270Ω

電阻

74LS273

TTL 74LS Series

Flip-Flop & Latches

雙穩態多諧振盪器&閉鎖

鎖存器

74LS32

TTL 74LS Series

Gates & Inverters

門電路 & 反相器

或門

用8個發光二極管顯示單片機的輸出數據,輸出為低電平時LED燈亮。74LS273的D0~D7為8位數據輸入端,接單片機的P0口,Q0~Q7為8位數據輸出端,CLK為觸發時鍾輸入端,MR為數據清除使能端。采用或門74LS32進行地址譯碼,U3:A的輸入端分別接單片機的P2.7口和WR口,輸出端接74LS273的CLK口。

從74LS273的真值表可以看出,當MR為低電平時,所有的Q端為0,否則Q端隨D端而定,因此,MR應置為高電平。CLK在上升沿時完成數據鎖存操作,因此U3:A的輸出必須完成一個由低到高的變化。當寫指令有效時,輸出低電平,只有P2.7同時為低電平時,才能在寫指令完成時實現一個由低到高的電平變化,這樣在寫完成后,數據被74LS273鎖定。可見,74LS273地址應該為0XXX XXXX XXXX XXXX,一般我們設為7FFF。

2. 程序設計

在Keil C51中,有以下的內存類型:

  • code    以 MOVC a,@A+DPTR 讀取的程序內存
  • data    可以直接存取的內部數據存儲器
  • idata    以 Mov @Rn 存取的內部數據存儲器
  • bdata    可以位尋址(Bit Addressable)的內部存儲器
  • xdata    以 MOVX @DPTR 存取的外部數據存儲器
  • pdata    以 MOVX @Rn 存取的外部數據存儲器

為了定義使用方便,在absacc.h文件中對此進行了宏定義,比如此例中的地址0x7fff,就可寫為XBYTE[0x7fff]。

#include "at89x51.h"

#include "absacc.h"

 

#define A74273 XBYTE[0x7fff]

void main(void)

{

    A74273 = 0x2b;

    while(1);  

}

 

注意了:當寫指令有效時(應該是WR,無效時為高),輸出低電平,只有P2.7同時為低電平時,才能在寫指令完成時實現一個由低到高的電平變化,這樣在寫完成后,數據被74LS273鎖定。可見,74LS273地址應該為0XXX XXXX XXXX XXXX,一般我們設為7FFF。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM