网站导航: 首页 > 设计参考 > 正文 文章搜索
Keil C51初始化代码 Startup.a51的中文说明
 
文章编号:
090106162123
文章分类: EDA技术 Keil C
点 击:
...
关 键 词: Startup,初始化代码
文章来源:
网络
摘 要:

 
  1. ;------------------------------------------------------------------------------  
  2. ;  STARTUP.A51:  用户上电初始化程序  
  3. ;------------------------------------------------------------------------------  
  4. ;  
  5. ;  用户定义需上电初始化的内存空间  
  6. ;  
  7. ;  使用以下EQU命令可定义在CPU复位时需用0进行初始化的内存空间  
  8. ;  
  9. ;;      ; IDATA 存储器的空间的绝对起始地址总是0.;   
  10. IDATALEN   EQU  80H   ; 需用0进行初始化的IDATA存储器空间的字节数  
  11. ;  
  12. XDATASTART   EQU   0H   ; XDATA存储器空间的绝对起始地址  
  13. XDATALEN   EQU   0H   ; 需用0进行初始化的XDATA存储器的空间字节数.  
  14. ;  
  15. PDATASTART   EQU   0H   ; PDATA存储器的空间的绝对起始地址  
  16. PDATALEN   EQU   0H   ; 需用0进行初始化的PDATA存储器的空间字节数.  
  17. ;  
  18. ;  注意:   IDATA 存储器的空间在物理上包括了8051单片机的DATA和BIT存储器空间.  
  19. ;           听 说 至少要保证与C51编译器运行库有关的存储器的空间进行0初始化 不知是否  
  20. ;------------------------------------------------------------------------------  
  21. ;  
  22. ;  再入函数模拟初始化  
  23. ;  
  24. ;  以下用EQU指令定义了再入函数模拟堆栈指针的初始化  
  25. ;  
  26. ;  使用SMALL存储器模式时再入函数的堆栈空间 .  
  27. IBPSTACK   EQU   0   ; 使用SMALL存储器模式再入函数时将其设置成1.  
  28. IBPSTACKTOP   EQU   0FFH+1   ; 将堆栈顶设置为最高地址+1.  
  29. ;  
  30. ;  使用LARGE存储器模式时再入函数的堆栈空间.;  使用LARGE存储器模式时再入函数的堆栈空间.    
  31. XBPSTACK   EQU   0   ; 使用LARGE存储器模式再入函数时将其设置成1.  
  32. XBPSTACKTOP   EQU   0FFFFH+1; 将堆栈顶设置为最高地址+1.  
  33. ;  
  34. ; 使用COMPACT存储器模式时再入函数的堆栈空间.; 使用COMPACT存储器模式时再入函数的堆栈空间.    
  35. PBPSTACK   EQU   0   ; 使用COMPACT存储器模式再入函数时将其设置成1.  
  36. PBPSTACKTOP   EQU   0FFFFH+1; 将堆栈顶设置为最高地址+1.  
  37. ;  
  38. ;------------------------------------------------------------------------------  
  39. ;  
  40. ;  使用COMPACT存储器模式时64K字节XDATA存储器空间的分页定义  
  41. ;  
  42. ;  以下用EQU指令定义PDATA类型变量在XDATA存储器空间的页地址  
  43. ;  使用EQU指令定义PFAGE时必须与L51连接定位器PDATA指令的控制参数一致  
  44. ;  
  45. PPAGEENABLE   EQU   0   ; 使用PDATA类型变量时将其设置成1.  
  46. PPAGE      EQU   0   ; 定义页号.  
  47. ;  
  48. ;------------------------------------------------------------------------------  
  49.       NAME   ?C_STARTUP; 模块名为 ?C_STAUTUP  
  50. ?C_C51STARTUP   SEGMENT   CODE      ; 代码  
  51. ?STACK      SEGMENT   IDATA     ; 堆栈  
  52.       RSEG   ?STACK      ; 堆栈  
  53.       DS   1   
  54.       EXTRNEXTRN CODE  ((?C_START))   ; 程序开始地址  
  55.       PUBLIC   ?C_STARTUP   
  56.       CSEG   AT   0x8000  ;  定义用户程序的起始地址,用MON51仿真器时可能有用  
  57. ?C_STARTUP:   LJMP   STARTUP1   
  58.       RSEG   ?C_C51STARTUP   
  59. STARTUP1::   
  60. ;  
  61. ; 初始化串口  
  62.       MOV     SCON,#40H  
  63.       MOV   TMOD,#20H  
  64.       MOV   TH1,#0fdH  
  65.      SETB   TR1   
  66.      CLR   TI     
  67. ;  单片机上电IDATA内存清零 如果不需要上电清零IDATA 可以注销IF到IFEDN之间的话句  
  68. ;  或者修改IDTALEN的长度 为了具有掉电保护功能 不知IDTALEN多长为好  
  69. IF IDATALEN <> 0   
  70.       MOV   R0,#IDATALEN - 1   
  71.       CLR   A  
  72. IDATALOOP:   MOV   @R0,A  
  73.       DJNZ   R0,IDATALOOP   
  74. ENDIF   
  75. ;  
  76. ;  单片机上电XDATA内存清零 如果不需要上电清零XDATA 可以注销IF到IFEDN之间的话句  
  77. ;  或者修改XDATALEN的长度  
  78. IF XDATALEN <> 0   
  79.       MOV   DPTR,#XDATASTART   
  80.       MOV   R7,#LOW  ((XDATALEN)   
  81.   IF  (LOW  (XDATALEN) <> 0   
  82.       MOV   R6,#(HIGH  (XDATALEN) +1   
  83.   ELSE   
  84.       MOV   R6,,#HIGH ((XDATALEN)   
  85.   ENDIF   
  86.       CLR   A  
  87. XDATALOOP:   MOVX   @DPTR,A  
  88.       INC   DPTR   
  89.       DJNZ   R7,XDATALOOP   
  90.       DJNZ   R6,XDATALOOP   
  91. ENDIF   
  92. ;  
  93. ;  送PDATA存储器页面高位地址  
  94. IF PAGEENABLE <> 0   
  95.       MOV   P2,#PPAGE   
  96. ENDIF   
  97. ;  
  98. ;  单片机上电PDATA内存清零 如果不需要上电清零XDATA 可以注销IF到IFEDN之间的话句  
  99. ;  或者修改PDATALEN的长度  
  100. IF PDATALEN <> 0   
  101.       MOV   R0,#PDATASTART   
  102.       MOV   R7,#LOW  (PDATALEN)   
  103.       CLR   A  
  104. PDATALOOP:   MOVX   @R0,A  
  105.       INC   R0  
  106.       DJNZ   R7,PDATALOOP   
  107. ENDIF   
  108. ;  
  109. ;  设置使用SMALL存储器模式时再入函数的堆栈空间.  
  110. IF IBPSTACK <> 0   
  111. EXTRN DATA  (?C_IBP)   
  112.       MOV   ?C_IBP,#LOW IBPSTACKTOP   
  113. ENDIF   
  114. ;  
  115. ;  设置使用LARGE存储器模式时再入函数的堆栈空间.  
  116. IF XBPSTACK <> 0   
  117. EXTRN DATA  (?C_XBP)   
  118.       MOV   ?C_XBP,#HIGH XBPSTACKTOP   
  119.       MOV   ?C_XBP+1,#LOW XBPSTACKTOP   
  120. ENDIF   
  121. ;  
  122. ;  设置使用COMPACT存储器模式时再入函数的堆栈空间.  
  123. IF PBPSTACK <> 0   
  124. EXTRN DATA  (C_PBP)   
  125.       MOV   ?C_PBP,#LOW PBPSTACKTOP   
  126. ENDIF   
  127. ;  
  128. ;  设置堆栈的起始地址  
  129.       MOV   SP,#?STACK-1   ; 例如 MOV  SP,#4FH;  
  130.   
  131. ; This code is required if you use L51_BANK.A51 with Banking Mode 4  
  132. ; 如果你的程序使用了Mode 4 程序分组技术 请启动下面的程序,不会吧你的程序超过64K 利害  
  133. ; EXTRN CODE (?B_SWITCH0)  
  134. ;               CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0  
  135. ;;                 程序从第一组bank 0 块开始执行  
  136. ; 跳转到用户程序MAIN函数  
  137.       LJMP   ?C_START   
  138.       END  
  139.       ;lINSHENGFENG  
  140.   
  141.   

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 



 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4