如何控制复位时不被初始化为0

2020-01-20 19:03发布

本帖最后由 一匹狼 于 2015-5-4 17:43 编辑

C51的启动代码把片内RAM中00H~7FH单元的内容清零
  1. IDATALEN        EQU     80H
复制代码
  1. IF IDATALEN <> 0
  2.                 MOV     R0,#IDATALEN - 1
  3.                 CLR     A
  4. IDATALOOP:      MOV     @R0,A
  5.                 DJNZ    R0,IDATALOOP
  6. ENDIF
复制代码
为了判断冷、热启动,我需要在特定单元分别写入0xA5、0x5A,
有如下两者解决方案:
1、编译器设置
2、修改启动代码
比较倾向于修改编译器设置,请问在Keil中如何实现热启动时不对其初始化为0?

17:45-2015.05.04修改原因:
如果改启动代码,比如
  1. IDATALEN        EQU     70H
复制代码
直接编译就ok了吗,还需要其他操作不?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
xintao
2020-01-21 02:19
本帖最后由 xintao 于 2015-5-4 19:36 编辑

      1.用KEIL编写51程序好像不用启动文件也可以吧?记得以后写的程序都是没加启动文件,这样程序估计是直接从MAIN启动的,应该就跳过内存初始化了吧(没有实际验证过)。
     2.如果第一步行不通,那就修改启动文件吧,把内存初始化那一段汇编跳过去。
     3.新型的51单片机应该带复位标志寄存器了,比如STC的应该就有吧,可以去看看。


这一段应该是初始化各种存储器的,把对应的哪 一段删掉,应该就不会初始化你的内存了。
STARTUP1:

IF IDATALEN <> 0
                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
ENDIF

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

IF PPAGEENABLE <> 0
                MOV     PPAGE_SFR,#PPAGE
ENDIF

IF PDATALEN <> 0
                MOV     R0,#LOW (PDATASTART)
                MOV     R7,#LOW (PDATALEN)
                CLR     A
PDATALOOP:      MOVX    @R0,A
                INC     R0
                DJNZ    R7,PDATALOOP
ENDIF

一周热门 更多>