原创 KeilC51Startup.a51中文说明转

2007-3-9 11:25 2349 4 4 分类: MCU/ 嵌入式
Keil C51 Startup.a51中文说明

;------------------------------------------------------------------------------ F-|trZwR  
; STARTUP.A51: 用户上电初始化程序
C5d~Jq  
;------------------------------------------------------------------------------
|P[83e9  
;
= -@G  
; 用户定义需上电初始化的内存空间
*yBNVL  
;
|,''%/zs$  
; 使用以下EQU命令可定义在CPU复位时需用0进行初始化的内存空间
qMPiS`h'  
;
I_tK_  
; ; IDATA 存储器的空间的绝对起始地址总是0.
5AM6|2g&|  
IDATALEN EQU 80H ; 需用0进行初始化的IDATA存储器空间的字节数
ZAQi"r  
;
]YRdc|K+  
XDATASTART EQU 0H ; XDATA存储器空间的绝对起始地址
}[};St U+,  
XDATALEN EQU 0H ; 需用0进行初始化的XDATA存储器的空间字节数.
LrE%{&B  
;
ueFQ \d  
PDATASTART EQU 0H ; PDATA存储器的空间的绝对起始地址
? +%<2  
PDATALEN EQU 0H ; 需用0进行初始化的PDATA存储器的空间字节数.
2?S T4kV  
;
uz R >Ua  
; 注意: IDATA 存储器的空间在物理上包括了8051单片机的DATA和BIT存储器空间.
{c{;OW\c7A  
; 听说至少要保证与C51编译器运行库有关的存储器的空间进行0初始化不知是否
N@OFWvm;=  
;------------------------------------------------------------------------------
<tV N]|,  
;
GlCmKUE_  
; 再入函数模拟初始化
ASG;0 u p  
;
7$Y#C Z  
; 以下用EQU指令定义了再入函数模拟堆栈指针的初始化
+Jvnt*u  
;
~+6B 0*X  
; 使用SMALL存储器模式时再入函数的堆栈空间.
:>gQeyQ  
IBPSTACK EQU 0 ; 使用SMALL存储器模式再入函数时将其设置成1.
n*6w8 ^p D  
IBPSTACKTOP EQU 0FFH 0FFH+1 ; 将堆栈顶设置为最高地址+1.
K >_#dj}n  
;
^|4k`0L  
; 使用LARGE存储器模式时再入函数的堆栈空间.
<#__S0  
XBPSTACK EQU 0 ; 使用LARGE存储器模式再入函数时将其设置成1.
\:;6QO?  
XBPSTACKTOP EQU 0FFFFH 0FFFFH+1; 将堆栈顶设置为最高地址+1.
D)5?p\n|  
;
](Fq RkL  
; 使用COMPACT存储器模式时再入函数的堆栈空间.
h\0(Cg &  
PBPSTACK EQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1.
}ZN4!  
PBPSTACKTOP EQU 0FFFFH 0FFFFH+1; 将堆栈顶设置为最高地址+1.
{)$9#2oR[  
;
?.(mZ`.3 }  
;------------------------------------------------------------------------------
!\; HHP&  
;
-8S':#34!  
; 使用COMPACT存储器模式时64K字节XDATA存储器空间的分页定义
>KCS`A *  
;
E0,S  
; 以下用EQU指令定义PDATA类型变量在XDATA存储器空间的页地址
^< .ic  
; 使用EQU指令定义PFAGE时必须与L51连接定位器PDATA指令的控制参数一致
:PKN e5T  
;
|6b;q;we  
PPAGEENABLE EQU 0 ; 使用PDATA类型变量时将其设置成1.
zA1W=D  
PPAGE EQU 0 ; 定义页号.
w; im{ T  
;
}r;9@Vc`G  
;------------------------------------------------------------------------------
R80,8KIg  
NAME ?C_STARTUP ; 模块名为?C_STAUTUP
(i?ogTTa#  
?C_C51STARTUP SEGMENT CODE ; 代码
lR73 R|;  
?STACK SEGMENT IDATA ; 堆栈
= ymZ%yN  
RSEG ?STACK ; 堆栈
1D9Rqzj/z  
随便打进的汉字有用就用吧有错就帮我改吧
R> HFBS<?  
欢迎光临 下岗农民 主页
Ki~Y0Mu  
DS 1
*`<;oS?x  
EXTRN CODE (?C_START) ; 程序开始地址
WAqySb  
PUBLIC ?C_STARTUP
!L#{u&;_  
CSEG AT 0x8000 ; 定义用户程序的起始地址,用MON51仿真器时可能有用
f eg'l  
?C_STARTUP: LJMP STARTUP1
|kl6pG #  
RSEG ?C_C51STARTUP
p2K]DrcmD  
STARTUP1:
W #"8"  
;
y\8@dmy%  
; 初始化串口
Xk!c  
MOV SCON,#40H
#n'!H?s0  
MOV TMOD TMOD,#20H
{J,kXB)"b  
MOV TH1 TH1,#0fdH
QO} y_~@  
SETB TR1
7kX3}?  
CLR TI
GwNp&Upws}  
; 单片机上电IDATA内存清零如果不需要上电清零IDATA 可以注销IF到IFEDN之间的话句
r9GHia2  
; 或者修改IDTALEN的长度为了具有掉电保护功能不知IDTALEN多长为好
0_itPW  
IF IDATALEN <> 0
:!/U=6}  
MOV R0 R0,#IDATALEN - 1
1#XI E  
CLR A
<0PKa]X  
IDATALOOP: MOV @R0,A
Oq m~g ~  
DJNZ R0 R0,IDATALOOP
Wws7U\#3  
ENDIF
rE _Q0F  
;
4/Aw YK  
; 单片机上电XDATA内存清零如果不需要上电清零XDATA 可以注销IF到IFEDN之间的话句
{0s0N<fX9  
; 或者修改XDATALEN的长度
\d.GW9FV  
IF XDATALEN <> 0
Oz+X%5H7  
MOV DPTR DPTR,#XDATASTART
8LTnm!  
MOV R7 R7,#LOW (XDATALEN)
d]l+s %l  
IF (LOW (XDATALEN)) <> 0
p27v&G1}dA  
MOV R6 R6,#(HIGH (XDATALEN)) +1
/oF742M  
ELSE
}yAL\ {_[  
MOV R6 R6,#HIGH (XDATALEN)
7a6;+P[t  
ENDIF
L aTiC +  
CLR A
z+2gY_j  
XDATALOOP: MOVX @DPTR,A
ZYWfabh)  
INC DPTR
Gq_=us[ ]r  
DJNZ R7 R7,XDATALOOP
n@.SVuD  
DJNZ R6 R6,XDATALOOP
!!sv,z  
ENDIF
nf(0h:  
;
3:MY  
; 送PDATA存储器页面高位地址
YG9tPbrV  
IF PPAGEENABLE <> 0
'a,)lZk{[  
MOV P2 P2,#PPAGE
:pD~%!H{  
ENDIF
2+-W\j  
;
yTkZ89}VK  
; 单片机上电PDATA内存清零如果不需要上电清零XDATA 可以注销IF到IFEDN之间的话句
J>DO?;  
; 或者修改PDATALEN的长度
_TK!rXF0b  
IF PDATALEN <> 0
< ,VG}_y  
MOV R0 R0,#PDATASTART
*Fmc=uM  
MOV R7 R7,#LOW (PDATALEN)
< l5:5  
随便打进的汉字有用就用吧有错就帮我改吧
H4lLpV]8  
欢迎光临 下岗农民 主页
9Kdkh&Ja  
CLR A
7o(_f0  
PDATALOOP: MOVX @R0,A
=]~Ti~b?s5  
INC R0
U"dKf?&}l  
DJNZ R7 R7,PDATALOOP
_lrh'Ez  
ENDIF
V6e",zRDw  
;
\[IcCSPv  
; 设置使用SMALL存储器模式时再入函数的堆栈空间.
QL|}" ,  
IF IBPSTACK <> 0
;h EsE>R3  
EXTRN DATA (?C_IBP)
LmxSJybiw  
MOV ?C_IBP IBP,#LOW IBPSTACKTOP
MGZCoJ  
ENDIF
8p9\1"Wnas  
;
4r26^>2T  
; 设置使用LARGE存储器模式时再入函数的堆栈空间.
wo(C5:  
IF XBPSTACK <> 0
'LA:1<NZ  
EXTRN DATA (?C_XBP)
TQCQ>W=q  
MOV ?C_XBP XBP,#HIGH XBPSTACKTOP
"T$luM(v  
MOV ?C_XBP XBP+1,#LOW XBPSTACKTOP
@@t4>&  
ENDIF
Y.hkr6  
;
C+ B~\S  
; 设置使用COMPACT存储器模式时再入函数的堆栈空间.
<U x]5VH  
IF PBPSTACK <> 0
^0 3RG/vS  
EXTRN DATA (?C_PBP)
z.P(+MXSf  
MOV ?C_PBP PBP,#LOW PBPSTACKTOP
(&g xHcg  
ENDIF
6 B {e  
;
Dj9,B(C  
; 设置堆栈的起始地址
eX|#\fDA  
MOV SP SP,#?STACK-1 ; 例如MOV SP,#4FH
-;4XXcq  
;
H*.&K%yD4  
; This code is required if you use L51_BANK.A51 with Banking Mode 4
xvXKJcU+  
; 如果你的程序使用了Mode 4 程序分组技术请启动下面的程序,不会吧你的程序超过64K 利害
TfE_>+[{/  
; EXTRN CODE (?B_SWITCH0)
P&S;-l0*M  
; CALL ?B_SWITCH0 ; init bank mechanism to code bank 0
6(%+n ^}F!  
; 程序从第一组bank 0 块开始执行
x$*R4u:!l  
; 跳转到用户程序MAIN函数
9qgx +  
LJMP ?C_START
'/]@X}GL  
END
@{:* lEQ  
;lINSHENGFENG
GeC;[.  
;2001_10_26

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条