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 + -
显示快捷键?