📄 main.asmbak
字号:
;********************************************************************************
; main.asm *
;********************************************************************************
$include (Sm5964.h)
;================================================================================
STACKSIZE EQU 40H
;W_TH1=2^8-Frequency*10^6*2^mod/(32*12*Baud) Baud=9600 b/s */
W_TH1 EQU 0XFA ;频率为11.0592 MHz
;W_TH1 EQU 0XFF ;频率为22.1184 MHz
;================================================================================
WatchDog EQU P3.4
;================================================================================
ISPVECTOR EQU 0XF000
;================================================================================
MainIDseg SEGMENT IDATA
RSEG MainIDseg
Stack: DS STACKSIZE
;================================================================================
MainDSeg SEGMENT DATA
RSEG MainDSeg
DLCNT: DS 1
?Debug_Str?BYTE:
BYTE1: DS 1
BYTE2: DS 1
?Debug_Mem?BYTE:
?Debug_Rom?BYTE:
BYTE3: DS 1
BYTE4: DS 1
BYTE5: DS 1
StrPtr EQU BYTE1 ;Debug_Str
MemPtr EQU BYTE3 ;Debug_Mem
MemLen EQU BYTE4 ;Debug_Mem
RomPtr EQU BYTE3 ;Debug_Rom
RomLen EQU BYTE5 ;Debug_Rom
;================================================================================
CSEG AT 0XF000
USING 0
;================================================================================
DownLoad:
MOV SP, #Stack-1
MOV PSW, #00000000B ;C,AC,F0,RS1,RS2,OV,-,P:定义程序状态字.
MOV IE, #00000000B ;EA,-,ET2,ES,ET1,TX1,ET0,TX0:中断允许寄存器赋值,关闭所有中断.
MOV SCONF, #00000100B ;WDR,*,*,*,*,ISPE,OME,ALE1
MOV WDTC, #00000000B ;WDTE,-,CLEAR,-,-,-,PS2,PS1,PS0
LCALL InitDownLoadUart
DownLoad_L1:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Star)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Star)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Title1)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Title1)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Title2)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Title2)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Select1)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Select1)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Select2)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Select2)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Select3)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Select3)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Select4)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Select4)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Select5)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Select5)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Select6)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Select6)
LCALL Debug_Str
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Star)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Star)
LCALL Debug_Str
LCALL StartISP
LCALL Debug_In
MOV B, A
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Choice)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Choice)
LCALL Debug_Str
LCALL Debug_Byte
MOV ?Debug_Str?BYTE+0, #HIGH(Str_LF)
MOV ?Debug_Str?BYTE+1, #LOW(Str_LF)
LCALL Debug_Str
MOV A, B
XRL A, #'1'
JNZ DownLoad_L2
LCALL ChipErease
LJMP DownLoad_L1
DownLoad_L2:
MOV A, B
XRL A, #'2'
JNZ DownLoad_L3
LCALL PageErease
LJMP DownLoad_L1
DownLoad_L3:
MOV A, B
XRL A, #'3'
JNZ DownLoad_L4
LCALL Program
LJMP DownLoad_L1
DownLoad_L4:
MOV A, B
XRL A, #'4'
JNZ DownLoad_L5
LCALL Protect
LJMP DownLoad_L1
DownLoad_L5:
MOV A, B
XRL A, #'5'
JNZ DownLoad_L6
LJMP 0X0000
DownLoad_L6:
LCALL ShowRom
LJMP DownLoad_L1
RET
;================================================================================
InitDownLoadUart:
CLR ES
CLR TR1 ;停止定时器1计数.
MOV PCON, #80H ;波特率加倍.
MOV SCON, #01110000B;10位异步收发,由定时器控制.
MOV A, TMOD
ANL A, #00001111B
ORL A, #00100000B
MOV TMOD, A ;定时器1的工作方式为方式2,8位重载.
MOV TL1, #W_TH1
MOV TH1, #W_TH1
CLR ET1 ;定时器1中断标志位复位.
CLR PS ;串口的中断优先级为低优先级.
SETB TR1 ;TR1:timer 1 run
CLR TI ;TI:set TI to send first char of UART
CLR RI
SETB ES
RET
;================================================================================
StartISP:
MOV ISPFD, #0X55
MOV ISPFD, #0XAA
MOV ISPFD, #0X55
RET
;================================================================================
ChipErease:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_ChipErease)
MOV ?Debug_Str?BYTE+1, #LOW(Str_ChipErease)
LCALL Debug_Str
LCALL AreYouSure
JNC ChipErease_Ret
MOV ISPC, #0X83
MOV ISPC, #0X83
MOV ISPFAH, #HIGH(ISPVECTOR-1)
MOV ISPFAL, #LOW(ISPVECTOR-1)
ChipErease_L1:
CPL WatchDog
MOV DPH, ISPFAH
MOV DPL, ISPFAL
CLR A
MOVC A, @A+DPTR
XRL A, #0XFF
JZ ChipErease_L2
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Failure)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Failure)
LCALL Debug_Str
RET
ChipErease_L2:
MOV A, ISPFAH
JNZ ChipErease_L3
MOV A, ISPFAL
JNZ ChipErease_L3
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Success)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Success)
LCALL Debug_Str
RET
ChipErease_L3:
DEC ISPFAL
MOV A, ISPFAL
INC A
JNZ ChipErease_L4
DEC ISPFAH
ChipErease_L4:
JMP ChipErease_L1
ChipErease_Ret:
RET
;================================================================================
PageErease:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_PageErease)
MOV ?Debug_Str?BYTE+1, #LOW(Str_PageErease)
LCALL Debug_Str
LCALL AreYouSure
JNC PageErease_Ret
LCALL InputPageAddr
MOV ?Debug_Str?BYTE+0, #HIGH(Str_PageAddr)
MOV ?Debug_Str?BYTE+1, #LOW(Str_PageAddr)
LCALL Debug_Str
MOV A, R0
ANL A, #11111110B
MOV R0, A
LCALL Debug_Byte_Hex
MOV A, #0X00
LCALL Debug_Byte_Hex
MOV ?Debug_Str?BYTE+0, #HIGH(Str_LF)
MOV ?Debug_Str?BYTE+1, #LOW(Str_LF)
LCALL Debug_Str
MOV ISPFAH, R0
MOV ISPFAL, #0X00
MOV ISPC, #0X82
MOV ISPFAL, 0XFF
MOV A, R0
ADD A, #0X01
MOV ISPFAH, A
MOV A, ISPFAH
LCALL Debug_Byte_Hex
MOV A, ISPFAL
LCALL Debug_Byte_Hex
PageErease_L1:
MOV DPH, ISPFAH
MOV DPL, ISPFAL
CLR A
MOVC A, @A+DPTR
XRL A, #0XFF
JZ PageErease_L2
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Failure)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Failure)
LCALL Debug_Str
RET
PageErease_L2:
MOV A, R0
XRL A, ISPFAH
JNZ PageErease_L3
MOV A, #0X00
XRL A, ISPFAL
JNZ PageErease_L3
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Success)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Success)
LCALL Debug_Str
RET
PageErease_L3:
DEC ISPFAL
MOV A, ISPFAL
INC A
JNZ PageErease_L4
DEC ISPFAH
PageErease_L4:
JMP PageErease_L1
PageErease_Ret:
RET
;================================================================================
Program:
MOV ?Debug_Str?BYTE+0, #HIGH(Str_Program)
MOV ?Debug_Str?BYTE+1, #LOW(Str_Program)
LCALL Debug_Str
LCALL AreYouSure
JC Program_L0
RET
Program_L0:
LCALL ChipErease
MOV DLCNT, #0X00
MOV ?Debug_Str?BYTE+0, #HIGH(Str_DownLoadHex)
MOV ?Debug_Str?BYTE+1, #LOW(Str_DownLoadHex)
LCALL Debug_Str
MOV R3, #0X00
Program_L1:
;R1:ChkSum,R2:Len
;Recieve Start Byte ':'
LCALL Debug_In
XRL A, #':'
JNZ Program_L1
INC DLCNT
MOV A, DLCNT
XRL A, #0X10
JNZ Program_L1_1
MOV A, #'>'
LCALL Debug_Byte
MOV DLCNT, #0X00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -