歡迎您光臨本站 登入註冊首頁

概述

;------------------------------------------------------------------------------; STARTUP.A51:&n……

;------------------------------------------------------------------------------
STARTUP.A51:  用戶上電初始化程序
;------------------------------------------------------------------------------
;
;  用戶定義需上電初始化的內存空間
;
;  使用以下EQU命令可定義在CPU複位時需用0進行初始化的內存空間
;
;;      ; IDATA 存儲器的空間的絕對起始地址總是0.;
IDATALEN   EQU  80H   ; 需用0進行初始化的IDATA存儲器空間的位元組數
;
XDATASTART   EQU   0H   ; XDATA存儲器空間的絕對起始地址
XDATALEN   EQU   0H   ; 需用0進行初始化的XDATA存儲器的空間位元組數.
;
PDATASTART   EQU   0H   ; PDATA存儲器的空間的絕對起始地址
PDATALEN   EQU   0H   ; 需用0進行初始化的PDATA存儲器的空間位元組數.
;
;  注意:   IDATA 存儲器的空間在物理上包括了8051單片機的DATA和BIT存儲器空間.
;           聽 說 至少要保證與C51編譯器運行庫有關的存儲器的空間進行0初始化 不知是否
;------------------------------------------------------------------------------
;
;  再入函數模擬初始化
;
;  以下用EQU指令定義了再入函數模擬堆棧指針的初始化
;
;  使用SMALL存儲器模式時再入函數的堆棧空間 .
IBPSTACK   EQU   0   ; 使用SMALL存儲器模式再入函數時將其設置成1.
IBPSTACKTOP   EQU   0FFH+1   ; 將堆棧頂設置為最高地址+1.
;
;  使用LARGE存儲器模式時再入函數的堆棧空間.;  使用LARGE存儲器模式時再入函數的堆棧空間. 
XBPSTACK   EQU   0   ; 使用LARGE存儲器模式再入函數時將其設置成1.
XBPSTACKTOP   EQU   0FFFFH+1; 將堆棧頂設置為最高地址+1.
;
; 使用COMPACT存儲器模式時再入函數的堆棧空間.; 使用COMPACT存儲器模式時再入函數的堆棧空間. 
PBPSTACK   EQU   0   ; 使用COMPACT存儲器模式再入函數時將其設置成1.
PBPSTACKTOP   EQU   0FFFFH+1; 將堆棧頂設置為最高地址+1.
;
;------------------------------------------------------------------------------
;
;  使用COMPACT存儲器模式時64K位元組XDATA存儲器空間的分頁定義
;
;  以下用EQU指令定義PDATA類型變數在XDATA存儲器空間的頁地址
;  使用EQU指令定義PFAGE時必須與L51連接定位器PDATA指令的控制參數一致

;
PPAGEENABLE   EQU   0   ; 使用PDATA類型變數時將其設置成1.
PPAGE      EQU   0   ; 定義頁號.
;
;------------------------------------------------------------------------------
      NAME   ?C_STARTUP; 模塊名為 ?C_STAUTUP
?C_C51STARTUP   SEGMENT   CODE      ; 代碼
?STACK      SEGMENT   IDATA     ; 堆棧
      RSEG   ?STACK      ; 堆棧
      DS   1
      EXTRNEXTRN CODE  ((?C_START))   ; 程序開始地址
      PUBLIC   ?C_STARTUP
      CSEG   AT   0x8000  ;  定義用戶程序的起始地址,用MON51模擬器時可能有用
?C_STARTUP:   LJMP   STARTUP1
      RSEG   ?C_C51STARTUP
STARTUP1::
;
; 初始化串口
      MOV     SCON,#40H
      MOV   TMOD,#20H
      MOV   TH1,#0fdH
     SETB   TR1
     CLR   TI 
;  單片機上電IDATA內存清零 如果不需要上電清零IDATA 可以註銷IF到IFEDN之間的話句
;  或者修改IDTALEN的長度 為了具有掉電保護功能 不知IDTALEN多長為好

IF IDATALEN <> 0
      MOV   R0,#IDATALEN - 1
      CLR   A
IDATALOOP:   MOV   @R0,A
      DJNZ   R0,IDATALOOP
ENDIF
;
;  單片機上電XDATA內存清零 如果不需要上電清零XDATA 可以註銷IF到IFEDN之間的話句
;  或者修改XDATALEN的長度

IF XDATALEN <> 0
      MOV   DPTR,#XDATASTART
      MOV   R7,#LOW  ((XDATALEN)
  IF  (LOW  (XDATALEN) <> 0
      MOV   R6,#(HIGH  (XDATALEN) +1
  ELSE
      MOV   R6,,#HIGH ((XDATALEN)
  ENDIF
      CLR   A
XDATALOOP:   MOVX   @DPTR,A
      INC   DPTR
      DJNZ   R7,XDATALOOP
      DJNZ   R6,XDATALOOP
ENDIF
;
;  送PDATA存儲器頁面高位地址
IF PAGEENABLE <> 0
      MOV   P2,#PPAGE
ENDIF
;
;  單片機上電PDATA內存清零 如果不需要上電清零XDATA 可以註銷IF到IFEDN之間的話句
;  或者修改PDATALEN的長度

IF PDATALEN <> 0
      MOV   R0,#PDATASTART
      MOV   R7,#LOW  (PDATALEN)
      CLR   A
PDATALOOP:   MOVX   @R0,A
      INC   R0
      DJNZ   R7,PDATALOOP
ENDIF
;
;  設置使用SMALL存儲器模式時再入函數的堆棧空間.
IF IBPSTACK <> 0
EXTRN DATA  (?C_IBP)
      MOV   ?C_IBP,#LOW IBPSTACKTOP
ENDIF
;
;  設置使用LARGE存儲器模式時再入函數的堆棧空間.
IF XBPSTACK <> 0
EXTRN DATA  (?C_XBP)
      MOV   ?C_XBP,#HIGH XBPSTACKTOP
      MOV   ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
;
;  設置使用COMPACT存儲器模式時再入函數的堆棧空間.
IF PBPSTACK <> 0
EXTRN DATA  (C_PBP)
      MOV   ?C_PBP,#LOW PBPSTACKTOP
ENDIF
;
;  設置堆棧的起始地址
      MOV   SP,#?STACK-1   ; 例如 MOV  SP,#4FH;

; This code is required if you use L51_BANK.A51 with Banking Mode 4
; 如果你的程序使用了Mode 4 程序分組技術 請啟動下面的程序,不會吧你的程序超過64K 利害

; EXTRN CODE (?B_SWITCH0)
;               CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0
;;                 程序從第一組bank 0 塊開始執行
; 跳轉到用戶程序MAIN函數

      LJMP   ?C_START
      END
      ;lINSHENGFENG


[admin via 研發互助社區 ] Keil C51初始化代碼 Startup.a51的中文說明已經有12271次圍觀

http://cocdig.com/docs/show-post-42577.html