📄 install.a51
字号:
MOV TH2,A
MOV T2MOD,A
MOV T2CON,A
L4: JB RXD,L4
L6: JNB RXD,L6
L7: SETB TR2
L8: JNB RXD,L10
JNB TF2,L8
L10: JNB RXD,L10
L12: JNB RXD,L14
JNB TF2,L12
L14: JNB RXD,L14
L15: CLR TR2
JB TF2,InitSerial
MOV R7,TL2
MOV R6,TH2
MOV A,R6
CLR C
RRC A
MOV R4,A
MOV A,R7
RRC A
ADD A,R7
MOV R7,A
MOV A,R4
ADDC A,R6
MOV R6,A
MOV A,R7
ADD A,#010H
MOV R7,A
CLR A
ADDC A,R6
MOV R6,A
MOV A,R7
MOV R0,#05H
L22: XCH A,R6
CLR C
RRC A
XCH A,R6
RRC A
DJNZ R0,L22
MOV R7,A
CLR C
CLR A
SUBB A,R7
MOV BRL,A
CLR A
MOV TL2,A
MOV TH2,A
MOV T2MOD,A
MOV T2CON,A
ORL PCON,#080H ; set SMOD1 to double baudrate
MOV BDRCON,#01EH ; set TBCK/RBCK/BRR/SPD
MOV SCON,#01011010B ; Init Serial Interface
L16: CLR RI
JNB RI,$
MOV A,SBUF
CJNE A,#011H,L16
ELSE ; fixed baudrate
IF (CPU_X2 = 1)
DIVFACTOR EQU BAUDRATE*16
ELSE
DIVFACTOR EQU BAUDRATE*32
ENDIF
BDREL EQU 10000H-((CPU_CLOCK+(DIVFACTOR/2))/DIVFACTOR)
MOV BRL,#LOW(BDREL)
ORL PCON,#080H ; set SMOD1 to double baudrate
MOV BDRCON,#01EH ; set TBCK/RBCK/BRR/SPD
MOV SCON,#01011010B ; Init Serial Interface
ENDIF
MOV AUXR,#_AUXR ; Configure T89C51RC2
JMP Mon51
ENDIF
IF (SERIAL = 3)
;********************************************************************
;* Using external UART 16450/16550 *
;********************************************************************
DIVFACTOR EQU BAUDRATE*16
BAUDDIV EQU (EX_UART_CLK+(DIVFACTOR/2))/DIVFACTOR
InitSerial:
MOV DPTR,#EX_UART_ADR+3
MOV A,#83H ; Select Baudrate Registers
MOVX @DPTR,A
MOV DPTR,#EX_UART_ADR
MOV A,#LOW (BAUDDIV)
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (BAUDDIV)
MOVX @DPTR,A
MOV DPTR,#EX_UART_ADR+3
MOV A,#03H ; Mode: 8-bit, 1 stop, no parity
MOVX @DPTR,A
MOV DPTR,#EX_UART_ADR+1
CLR A
MOVX @DPTR,A ; disable all interrupts
MOV DPTR,#EX_UART_ADR+4
MOVX @DPTR,A
MOV AUXR,#_AUXR ; Configure T89C51RC2
MOV P1,#01H
JMP Mon51
ENDIF
IF (SERIAL = 3)
;********************************************************************
;* Interface via external UART 16450/16550 *
;********************************************************************
SER_INT_ADR EQU 000H ; ADDRESS OF SERIAL INTERRUPT VECTOR.
; Set to 0 for no interrupt
INSTAT: PUSH DPL ; INPUT STATUS OF SERIAL INTERFACE
PUSH DPH
PUSH ACC
MOV DPTR,#EX_UART_ADR+5 ; LSR
MOVX A,@DPTR ; Check if Ready
MOV C,ACC.0
POP ACC
POP DPH
POP DPL
RET
OUTSTAT: PUSH DPL ; OUTPUT STATUS OF SERIAL INTERFACE
PUSH DPH
PUSH ACC
MOV DPTR,#EX_UART_ADR+5 ; LSR
MOVX A,@DPTR ; Check if Ready
MOV C,ACC.5
POP ACC
POP DPH
POP DPL
RET
INCHAR: PUSH DPL ; CHARACTER INPUT-ROUTINE
PUSH DPH
MOV DPTR,#EX_UART_ADR
MOVX A,@DPTR
ORL P1,#02H
POP DPH
POP DPL
RET
OUTCHAR: PUSH DPL ; CHARACTER OUTPUT-ROUTINE
PUSH DPH
MOV DPTR,#EX_UART_ADR
MOVX @DPTR,A
ORL P1,#04H
POP DPH
POP DPL
RET
CLR_TI: ; CLEAR SERIAL TRANSMIT INTERRUPT FLAG
RET
SET_TI: ; SET SERIAL TRANSMIT INTERRUPT FLAG
RET
CLR_RI: ; CLEAR SERIAL RECEIVE INTERRUPT FLAG
RET
CLR_SER_IE: ; CLEAR SERIAL INTERRUPT ENABLE FLAG
RET
SET_SER_IE: ; SET SERIAL INTERRUPT ENABLE FLAG
RET
ELSE
;********************************************************************
;* Interface via standard 8051 UART *
;********************************************************************
SER_INT_ADR EQU 23H ; ADDRESS OF SERIAL INTERRUPT VECTOR
INSTAT: MOV C,RI ; INPUT STATUS OF SERIAL INTERFACE
RET
OUTSTAT: MOV C,TI ; OUTPUT STATUS OF SERIAL INTERFACE
RET
INCHAR: MOV A,SBUF ; CHARACTER INPUT-ROUTINE
RET
OUTCHAR: MOV SBUF,A ; CHARACTER OUTPUT-ROUTINE
RET
CLR_TI: CLR TI ; CLEAR SERIAL TRANSMIT INTERRUPT FLAG
RET
SET_TI: SETB TI ; SET SERIAL TRANSMIT INTERRUPT FLAG
RET
CLR_RI: CLR RI ; CLEAR SERIAL RECEIVE INTERRUPT FLAG
RET
CLR_SER_IE: CLR ES ; CLEAR SERIAL INTERRUPT ENABLE FLAG
RET
SET_SER_IE: SETB ES ; SET SERIAL INTERRUPT ENABLE FLAG
RET
ENDIF
BEFORE_GO: ; this code is executed before a
RET ; a go or proc step is executed
AFTER_GO: ; this code is executed after a go
RET ; command (when a breakpoint was set)
IF (FLASH_PAGESIZE <> 0)
;*********************************************************************
;* Flash programming functions for ATMEL T89C51RB2/RC2/CC01 devices *
;*********************************************************************
FBUSY_MSK EQU 001h
FMOD_MSK EQU 006h
FPS_MSK EQU 008h
FPL_MSK EQU 0F0h
FMOD_USER_MSK EQU 000h
FMOD_XROW_MSK EQU 002h
FMOD_FUSE_MSK EQU 004h
SEL_USER_CL EQU 008h
FPL_S0 EQU 050h
FPL_S1 EQU 0A0h
PRE_PROG: MOV FCON,#SEL_USER_CL ; prepare flash for programming
RET
LD_FPAGE: MOVX @DPTR,A ; load data into flash page for programming
;NOP ; Necessary to secure load sequence from FM0 (Read after load work-around)
SETB C ; set C flag to suppress immediate code verify
RET
POST_PROG: ; Finish Flash programming
ORL AUXR1,#20h ; MAP boot memory
;NOP
LCALL 0FFF3H ; Special entry point in the bootloader for flash write sequence write
;NOP
ANL AUXR1,#0DFh ; UNMAP BOOT MEMORY
RET
WR_CODE:
MOV FCON,#SEL_USER_CL ; map col latch
MOVX @DPTR,A ; Load a byte in CL space (up to 128bytes in the same page can be loaded)
;NOP ; Necessary to secure load sequence from FM0 (Read after load work-arround)
ORL AUXR1,#20h ; MAP boot memory
PUSH ACC
LCALL 0FFF3H ; Special entry point in the bootloader for flash write sequence write
POP ACC
ANL AUXR1,#0DFh ; UNMAP BOOT MEMORY
RET
ELSE
; Dummy flash functions when application is loaded into v.Neumann RAM
PRE_PROG: RET ; prepare flash for programming
LD_FPAGE: MOVX @DPTR,A ; write one byte into v.Neumann wired RAM
CLR C ; clear C flag to force immediate code verification
RET
POST_PROG: RET ; Finish Flash programming
WR_CODE: MOVX @DPTR,A ; write one byte into v.Neumann wired RAM
RET
ENDIF
SER_INT_ADR_OFF EQU (INT_ADR_OFF + SER_INT_ADR)
XDATA_BEGIN SEGMENT XDATA AT XDATA_START
RSEG XDATA_BEGIN
XDATA_START_ADR:DS 1 ; define one dummy byte
IF (FLASH_PAGESIZE <> 0)
CODE_AREA SEGMENT CODE
RSEG CODE_AREA
ELSE
XDATA_AREA SEGMENT XDATA
RSEG XDATA_AREA
ENDIF
EXECBUFF: DS 9
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -