当前位置:首页 > 单片机 > 单片机
[导读] 1.标号IDATALEN EQU 80H ; the length of IDATA memory in bytes.这里IDATALEN只是一个标号而已,和idata不是一回事!你要是愿意,这段程序里的IDATALEN你完全可以改成dog呀,pig呀,playboy呀这些标号(其实我的理想

 1.标号

IDATALEN EQU 80H ; the length of IDATA memory in bytes.

这里IDATALEN只是一个标号而已,和idata不是一回事!你要是愿意,这段程序里的IDATALEN你完全可以改成dog呀,pig呀,playboy呀这些标号(其实我的理想是过猪一样的生活,不愁吃喝,无忧无虑,可惜做不到),上面的这一句是说程序里面凡是用到IDATALEN的地方其实就是可以看成是80H这个数,你用80H去代替IDATALEN是完全对的。

之所以取IDATALEN这么个名字,只是为了好记,表明和idata有一点点关系,不至于你的程序长了,假使你本来是用了playboy作为标号的,写到后来你就会忘了playboy到底是什么含义了。idata的范围是0~FFH。如果你想改成FFH,完全可以。

2。清零

IF IDATALEN <> 0

MOV R0,#IDATALEN - 1

CLR A

IDATALOOP: MOV @R0,A

DJNZ R0,IDATALOOP

关于这一段,很明显是在清零,如果上面idatalen=80H,那么是对0~7FH清零;如果

你的程序是改写成:

IDATALEN EQU 0100H ;

就是对0~FFH清零。

还要注意的是那条IF语句,下面再谈。

二、如何按你意愿加载这段程序

一般考虑到这个往往是你的设计中要区分上电复位和程序复位。有时候当程序复位时你不希望一些内存单元被清零了,那么你不对startup.a51作点修改,就不行了。

默认是自动加载这段startup.a51的。

所以你要这样做:

把lib目录下的原始startup.a51文件拷到你的项目所在目录下,再把你项目目录下的这个startup.a51加入到你的项目中(在keil的集成环境中,希望你对这个是知道如何做的),然后对这个startup.a51加以修改。

比如改成:

IDATALEN EQU 00H ; the length of IDATA memory in bytes.

然后编译链接。这样你的程序中就不会包含对idata清零的内码了。

为什么?上面提到的IF语句的作用呀!当定义IDATALEN=0时,清零代码被跳过!

////////////////////////////////////////////

Startup.a51的中文说明

;------------------------------------------------------------------------------

; 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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭