📄 loadprogram.asm
字号:
;
;****************************************************
;* *
;* UPDAT 功能处理 *
;* *
;****************************************************
UPDATFUN: MOV CHPENR, #87H ;
MOV CHPENR, #59H ;
MOV CHPCON, #03H ; 起动 IN SYSTEM PROGRAMMING 模式
MOV CHPENR, #00H ;
LCALL ERASECHIP ; 擦除芯片
LCALL BLANKCHIP ; 检查芯片
JZ UPDATOUT ;
LCALL XMODEMDOWN ; 下载数据
JZ UPDATOUT ;
MOV DPTR, #UPDATAOKTBL ;
LCALL DISPINFO ;
MOV DPTR, #VERIFYOKTBL ;
LCALL DISPINFO ;
LCALL PUTENTER ;
LJMP DISPROM ;
;
UPDATOUT: MOV DPTR, #VERIFYERRORTBL ;
LCALL DISPINFO ;
MOV DPTR, #UPDATAERRORTBL ;
LCALL DISPINFO ;
LCALL PUTENTER ;
LJMP DISPROM ;
;
;
DISPROM: MOV DPTR, #ROMMARKTBL ; 显示 ROM> 信息
LCALL DISPINFO
RET
;
;
;============================================================================
;////////////////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////
;============================================================================
; 串口操作子程序
; Osc Freq
; 计算公式: (RCAP2H, RCAP2L) = 65536 - ---------------------
; 32 * Baud
; DEMO:
; FREQUENCY: 12 MHz
; BAUD RATE: 9600 Baud
;
; 12 * 1000000
; (RCAP2H, RCAP2L) = 65536 - ---------------------
; 32 * 9600
; = 65497 = FFD9H
;
; DB 0F7H, 0EEH, 0DCH, 0B8H, 0FFH ; 11.0592 MHz
BAUDTBL: DB 0F6H, 0ECH, 0D9H, 0B2H, 0FFH ; 12.0000 MHz
; DB 0F4H, 0E8H, 0D1H, 0A3H, 0FFH ; 14.3180 MHz
; DB 0F1H, 0E2H, 0C4H, 087H, 0FFH ; 18.4320 MHz
; DB 0ECH, 0D9H, 0B2H, 064H, 0FFH ; 24.0000 MHz
; 38400 19200 9600 4800 END
RET
;****************************************************
;* *
;* 设置波特率 *
;* *
;****************************************************
; A 内容 0: 38400 1: 19200 2: 9600 3: 4800
; 设置串口波特率
INITBAUD: MOV DPTR, #BAUDTBL ;
CLR TR2 ;
MOVC A, @A+DPTR ;
MOV TL2, A ; TL2
MOV RCAP2L, A ; RCAP2L
CLR A ;
DEC A ;
MOV TH2, A ;
MOV RCAP2H, A ;
SETB TR2 ;
RET
;
;
;****************************************************
;* *
;* 串口中断服务程序 *
;* *
;****************************************************
; 串口中断处理
;
INT_SIO: PUSH PSW
PUSH ACC
MOV PSW, #04H ; 设第二组寄存器
JBC RI, RXINFO ; RI = 1 去接收中断程序 RI = 0
JNB TI, INTSIOOUT ;
CLR TI ; 清发送中断
LJMP TXINFO
;
;
RXINFO: JB RXCOMMFLAG, RXXMODEM ;
RXCOMMAND: MOV R0, RXBUFFTAIL ; 接收命令
CLR RXCOMMOKFLAG ; 接收状态
MOV A, SBUF ;
XRL A, #BACKSPACE ; 删除处理
JNZ RXCOMMAND1 ;
SETB COMMSPACEFLAG ; 需要删除标记
DEC RXBUFFLEN ; 接收队列调整
MOV A, RXBUFFLEN ;
INC A ;
JNZ RXCOMMANDB1 ;
CLR COMMSPACEFLAG ; 全部删除
INC RXBUFFLEN ;
RXCOMMANDB1: DEC RXBUFFTAIL ;
MOV A, RXBUFFTAIL ;
INC A ;
XRL A, #RXBUFFSTART ;
JNZ INTSIOOUT ;
CLR COMMSPACEFLAG ; 全部删除
INC RXBUFFTAIL ;
LJMP INTSIOOUT ;
;
;
RXCOMMAND1: INC RXBUFFLEN ; 命令长度计数
INC RXBUFFTAIL ; 接收缓冲区计数
MOV A, RXBUFFLEN ;
XRL A, #90H ; 命令长度限制
JZ RXCOMMERROR ;
MOV A, SBUF ;
MOV @R0, A ; 存命令字符
XRL A, #0DH ; 是否结束
JZ RXCOMMEND ;
RXCOMMAND2: MOV A, SBUF ; 回显收到的字符
CLR TXOKFLAG ;
MOV SBUF, A ;
INTSIOOUT: POP ACC ;
POP PSW ;
RETI ;
;
;
RXCOMMERROR: CLR A ; 出错处理
MOV RXBUFFLEN, A ; 初始化
MOV RXBUFFTAIL, #RXBUFFSTART;
LJMP INTSIOOUT ;
;
RXCOMMEND: SETB RXCOMMOKFLAG ; 接收成功
LJMP INTSIOOUT ;
;
;
RXXMODEM: MOV R0, RXBUFFTAIL ; XMODEM 协议接收
INC RXBUFFTAIL ; 接收队列处理
INC RXBUFFLEN ;
MOV A, SBUF ;
MOV @R0, A ;
MOV A, BLKCHK ; 队列总长度
ADD A, #BLKSIZE ;
ADD A, #XBUFFSTART ;
ADD A, #04H ;
XRL A, RXBUFFTAIL ;
JNZ INTSIOOUT ;
MOV RXBUFFTAIL, #XBUFFSTART ; 写队列满
LJMP INTSIOOUT ;
;
;
TXINFO: SETB TXOKFLAG ; 发送成功
LJMP INTSIOOUT ;
;
;
;****************************************************
;* *
;* 把表的内容写到串口 *
;* *
;****************************************************
; DPTR 内容是表的首址
; 显示表格内容
DISPINFO: CLR A ;
MOV R5, A ;
READDISPCODE: MOV A, R5 ;
MOVC A, @A+DPTR ; 查表
MOV R4, A ;
INC R5 ; 计数器加一
MOV A, R5 ;
JNZ READOVER ; 计数器溢出处理
INC DPH ;
READOVER: MOV A, R4 ;
INC A ;
JZ DISPINFOOUT ; 读到结束符结束
CLR TXOKFLAG ;
DEC A ;
LCALL PUTCHAR ; 发送字符
LJMP READDISPCODE ;
DISPINFOOUT: RET
;
;
;****************************************************
;* *
;* 刷新命令符 *
;* *
;****************************************************
PUTCOMMSPACE: JNB COMMSPACEFLAG, PUTCOMOUT;
CLR COMMSPACEFLAG ;
MOV A, #BACKSPACE ; 置光标到前一字符
LCALL PUTCHAR ;
MOV A, #20H ; 用空格覆盖
LCALL PUTCHAR ;
MOV A, #BACKSPACE ; 调整光标位置
LCALL PUTCHAR ;
PUTCOMOUT: RET ;
;
;
;****************************************************
;* *
;* 发送 一个字符 *
;* *
;****************************************************
; A 内容待发字符
PUTCHAR: CLR TXOKFLAG ;
MOV SBUF, A ;
JNB TXOKFLAG, $ ;
RET
;
;
;****************************************************
;* *
;* 发送字符串 *
;* *
;****************************************************
; A 内容待发字符首址
; B 内容待发字符个数
PUTSTRING: MOV R0, A ;
MOV R4, B ;
PUTSTRLOOP: MOV A, @R0 ;
INC R0 ;
LCALL PUTCHAR ;
DJNZ R4, PUTSTRLOOP ;
RET
;
;
;****************************************************
;* *
;* 接收 一个字符 *
;* *
;****************************************************
; A 内容接收字符
; B 内容超时次数
GETCHAR: MOV A, RXBUFFLEN ;
JNZ GETCHAROUT ;
JB TIME500MS, $ ;
LCALL WATDOG ;
JNB TIME500MS, $ ;
DEC B ;
MOV A, B ;
JNZ GETCHAR ;
RET
;
GETCHAROUT: MOV R0, RXBUFFHEAD ;
INC RXBUFFHEAD ;
DEC RXBUFFLEN ;
MOV A, #BLKSIZE ;
ADD A, BLKCHK ;
ADD A, #54H ;
XRL A, RXBUFFHEAD ;
JNZ GETCHAREND ;
MOV RXBUFFHEAD, #XBUFFSTART ;
GETCHAREND: MOV A, @R0 ;
RET ;
;
;
;****************************************************
;* *
;* 显示回车 *
;* *
;****************************************************
; 向串口发送回车
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -