startup.a51

来自「MCS51的实现无线接收发送(315M或433M)源程序代码。」· A51 代码 · 共 205 行

A51
205
字号
;**********************************************************
;*                 StartUp.A51                            *
;**********************************************************
$include	 (Sm5964.inc)
;==========================================================
EXTRN     CODE(main)
EXTRN     CODE(ClrWatchDog)
;==========================================================
PUBLIC    ?C_STARTUP
PUBLIC    _RdRom,_ExecFunc,_MDebugByte
PUBLIC    CHKISP,GotoIsp
PUBLIC    _WrSIByte,RDSOBYTE,_DELAY2X,_DELAY5X,_DELAY10X
;==========================================================
STACKSIZE           EQU       0X40
ISPADDR             EQU       0XF000
ISPCHK              EQU       P3.6
MTX                 EQU   	   P3.4

SO                  EQU       P2.1
SI                  EQU       P2.3
SCK                 EQU       P2.4
;==========================================================
StartUpIDseg	       SEGMENT	  IDATA
                    RSEG	     StartUpIDseg
Stack:    DS	       STACKSIZE
;==========================================================
CSEG      AT        0
;==========================================================
?C_STARTUP:
          LJMP      POWERUP
;==========================================================
CSEG      AT        0X40
;==========================================================
POWERUP:
          JB        ISPCHK,   CONTINUE1
          LJMP      ISPADDR
CONTINUE1:
          MOV       R1,       #0
          MOV	      R0,       #0
ClrIData:
          MOV	      @R0,      #0
          INC       R0
          DJNZ     	R1,       ClrIData
          
          MOV	      SP,       #Stack-1
          MOV       PSW,      #00000000B ;C,AC,F0,RS1,RS0,OV,-,P:定义程序状态字.
          MOV       IE,       #00000000B ;EA,-,ET2,ES,ET1,TX1,ET0,TX0:中断允许寄存器赋值,关闭所有中断.
          MOV       SCONF,    #00000011B ;WDR,-,-,-,-,ISPE,OME,ALEI
          MOV       WDTC,     #10000111B ;WDTE,-,CLEAR,-,-,-,PS2,PS1,PS0
          
          LJMP      main
          
;==========================================================
;INT8U RdRom(INT16U Addr)
;==========================================================
_RdRom:
          MOV       DPH,      R6
          MOV       DPL,      R7
          CLR       A
          MOVC      A,        @A+DPTR
          MOV       R7,       A
          RET
;==========================================================
;void ExecFunc(INT16U ProcAddr)
;==========================================================
_ExecFunc:
          MOV       DPL,      R7
          PUSH      DPL
          MOV       DPH,      R6
          PUSH      DPH
          RET
;==========================================================
;void ChkISP(void)
;==========================================================
CHKISP:
          JB        ISPCHK,   ChkISP_Ret
          LJMP      ISPADDR
ChkISP_Ret:
          RET
;==========================================================
;void GotoIsp(void)
;==========================================================
GotoIsp:
          LJMP      ISPADDR
          RET
;==========================================================
;N=(FREQ/12/BAUD-5)/2
;==========================================================
;void MDebugByte(INT8U Ch)
;==========================================================
_MDebugByte:
          CLR       EA
          LCALL     ClrWatchDog

          PUSH      ACC
          MOV       A,        R0
          PUSH      ACC
          MOV       A,        R1
          PUSH      ACC
          
          MOV       A,        R7
          MOV       R0,       #9
          CLR       C
          MDebugByte_L1:
          MOV       MTX,      C                   ;2
          RRC       A                             ;1
          MOV       R1,       #21                 ;2
          MDebugByte_L2:
          DJNZ      R1,       MDebugByte_L2       ;2
          DJNZ      R0,       MDebugByte_L1       ;2      

          SETB      MTX                           ;STOP
          MOV       R1,       #21
          MDebugByte_L3:
          DJNZ      R1,       MDebugByte_L3

          POP       ACC
          MOV       R1,       A
          POP       ACC
          MOV       R0,       A
          POP       ACC      
          SETB      EA
          RET
;==========================================================
;void WrSIByte(INT8U Ch)
;==========================================================
_WrSIByte:
          MOV       A,        R7
          MOV       R0,       #8
_WrSIByte_L1:
          CLR       SCK
          RLC       A
          MOV       SI,       C
          SETB      SCK
          DJNZ      R0,       _WrSIByte_L1  

          CLR       SCK
          RET
;==========================================================
;INT8U RdSOByte(void)
;==========================================================
RDSOBYTE:
          MOV       R0,       #8
          CLR       A
RDSOBYTE_L1:
          SETB      SCK
          MOV       C,        SO
          RLC       A
          CLR       SCK
          DJNZ      R0,       RDSOBYTE_L1    

          SETB      SCK
          MOV       R7,       A
          RET
;==========================================================
;void Delay2x(INT8U Time) (10+2*Time)指令
;==========================================================
_DELAY2X:
          NOP
          MOV       A,        R7
          MOV       R0,       A
          JZ        _DELAY2X_L2
_DELAY2X_L1:
          DJNZ      R0,       _DELAY2X_L1
_DELAY2X_L2:
          RET
;==========================================================
;void Delay5x(INT8U Time) (10+5*Time)指令
;==========================================================
_DELAY5X:
          NOP
          MOV       A,        R7
          MOV       R0,       A
          JZ        _DELAY5X_L2
_DELAY5X_L1:
          NOP
          NOP
          NOP
          DJNZ      R0,       _DELAY5X_L1
_DELAY5X_L2:
          RET
;==========================================================
;void Delay10x(INT8U Time) (10+10*Time)指令
;==========================================================
_DELAY10X:
          NOP
          MOV       A,        R7
          MOV       R0,       A
          JZ        _DELAY10X_L2
_DELAY10X_L1:
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          NOP
          DJNZ      R0,       _DELAY10X_L1
_DELAY10X_L2:
          RET
;==========================================================
END
;==========================================================

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?