📄 loadprogram.asm
字号:
; *************************************
; * *
; * LOAD 程序下载器 *
; * *
; * CPU: W78E516 *
; * *
; *************************************
;
;**********************************************************************
;* 谀哪哪哪哪哪哪哪哪目 *
;* P1.0 ?1 40 ? VCC *
;* P1.1 ?2 39 ? P0.0 *
;* P1.2 ?3 38 ? P0.1 *
;* P1.3 ?4 37 ? P0.2 *
;* P1.4 ?5 36 ? P0.3 *
;* P1.5 ?6 35 ? P0.4 *
;* P1.6 ?7 34 ? P0.5 *
;* P1.7 ?8 33 ? P0.6 *
;* RST ?9 32 ? P0.7 *
;* RXD P3.0 ?10 MCS-51 31 ? EA VDD *
;* TXD P3.1 ?11 30 ? ALE *
;* INT0 P3.2 ?12 29 ? PSEN *
;* INT1 P3.3 ?13 28 ? P2.7 *
;* MCUDOG T0 P3.4 ?14 27 ? P2.6 *
;* T1 P3.5 ?15 26 ? P2.5 *
;* WR P3.6 ?16 25 ? P2.4 *
;* RD P3.7 ?17 24 ? P2.3 *
;* XTAL2 ?18 23 ? P2.2 *
;* XTAL1 ?19 22 ? P2.1 *
;* VSS ?20 21 ? P2.0 *
;* 滥哪哪哪哪哪哪哪哪馁 *
;**********************************************************************
;
;
;****************************************************
;* *
;* 变量定义 *
;* *
;****************************************************
; 常数定义
;
RXBUFFSTART EQU 040H ; 接收缓冲区队列首址 (170 字节)
XBUFFSTART EQU 050H ; 接收缓冲区队列首址 (170 字节)
RXBUFFEND EQU 0F0H ; 接收缓冲区队列末址
COMMANDLEN EQU 008H ; 命令字符最大长度
; 编程延时
P15MS EQU 0C9H ; 11.0592 MHz 12.000 MHz 14.318 MHz
P1US EQU 0FEH ;
P50US EQU 0D1H ;
;
; P15MS EQU 0B7H ; 18.4320 MHz 24.000 MHz
; P1US EQU 0FDH ;
; P50US EQU 0C2H ;
;
; 流控字符
XON EQU 011H ; 继续传送
XOFF EQU 013H ; 停止传送
; 控制键
CTRLC EQU 003H ; CTRL_C 键
ESC EQU 027H ; ESC 键
BACKSPACE EQU 008H ; 退后删除键
; XMODEM 协议关键字
; 发送端 -> 接收端
SOH EQU 001H ; 每个包的开始
EOT EQU 004H ; 通知接收端结束
; 接收端 -> 发送端
ACK EQU 006H ; 包成功接收
NAK EQU 015H ; 包出错
CAN EQU 018H ; 结束传送操作
CRC EQU 043H ; C
;
BLKSIZE EQU 080H ; 每包的数据大小
XMODEMMXAERROR EQU 01EH ; 最大错误次数
; 芯片引脚定义
; WATCH DOG
MCUDOG EQU P3.3 ; 看门狗清零
; MCUDOG EQU P3.4 ; 看门狗清零
; 内部寄存器定义
T2CON EQU 0C8H ; T2 控制寄存器
T2MOD EQU 0C9H ;
TL2 EQU 0CCH ; T2 计数寄存器低字节
TH2 EQU 0CDH ; T2 计数寄存器高字节
TR2 EQU 0CAH ; T2 启动位
RCAP2L EQU 0CAH ; T2 计数重栽寄存器低字节
RCAP2H EQU 0CBH ; T2 计数重栽寄存器高字节
CHPCON EQU 0BFH ; 在系统编程控制寄存器
CHPENR EQU 0F6H ; 编程状态下 MTP ROM 的控制字节寄存器
SFRAL EQU 0C4H ; 编程状态下的目标低地址
SFRAH EQU 0C5H ; 编程状态下的目标高地址
SFRFD EQU 0C6H ; 编程状态下 MTP ROM 的编程数据
SFRCN EQU 0C7H ;
;
; 控制标志位定义
TIME10MS EQU 01H ; 10ms 标记
TIME500MS EQU 02H ; 500ms 标记
KEYFUNFLAG EQU 03H ;
TXOKFLAG EQU 04H ; 发送 OK 标记
RXCOMMFLAG EQU 05H ;
COMMSPACEFLAG EQU 06H ; 命令删除 OK 标记
RXCOMMOKFLAG EQU 07H ;
FBOOTFLAG EQU 08H ;
;
; 全局变量定义
; 串口
RXBUFFTAIL EQU 3BH ; 接收缓冲区尾指针
RXBUFFHEAD EQU 3AH ; 接收缓冲区头指针
RXBUFFLEN EQU 39H ; 命令长度计数
;
TIMECOUNT EQU 38H ; 500 ms 时间计数
; CRC
CRCLO EQU 37H ;
CRCHI EQU 36H ;
BLKCHK EQU 35H ;
TIMELO EQU 34H ;
TIMEHI EQU 33H ;
DPLO EQU 32H ;
DPHI EQU 31H ;
;
;
ORG 0000H
LJMP START
;****************************************************
;* *
;* 中断向量入口 *
;* *
;****************************************************
ORG 0003H ; 中断入口表
RETI
;
ORG 000BH
LJMP INT_T0
;
ORG 0013H
RETI
;
ORG 001BH
LJMP INT_T1
;
ORG 0023H
LJMP INT_SIO
;
ORG 002BH
RETI
;
ORG 0080H
;****************************************************
;* *
;* 初始化程序 *
;* *
;****************************************************
START: MOV R0, #0F0H ; 清
CLR A ; 00 到
CLRAM: MOV @R0, A ; 7F
DJNZ R0, CLRAM ; RAM
;
MOV P1, #0FFH ; 清 P1
; CLR PWRON ;
MOV P2, #0FFH ; 置 P2
MOV P3, #0FFH ; 置 P3
MOV DPL, #00H ; 清 DPTR
MOV DPH, #00H
MOV PSW, #00H ; 设第一组寄存器
MOV SP, #0F1H ; 设置堆栈指针
MOV SCON, #01010000B ; 串口工作方式 1 (8 BIT UART) 允许接收
MOV TMOD, #00010001B ; 定时器工作方式 1 (16 BIT CONUTER) 计数方式
MOV TH1, #0DBH ; 10ms定时参数
MOV TL1, #0FFH ;
MOV T2CON, #00110000B ; T2CON
; CLR A ; 设置波特率 0: 38400 1: 19200
MOV A, #01H ;
LCALL INITBAUD ; 2: 9600 3: 4800
SETB ES ; 允许串口中断
SETB ET0 ; 允许定时器 0 中断
SETB ET1 ; 允许定时器 1 中断
MOV IP, #00H ; 低优先级
SETB TR1 ; 启动定时计数器 1
SETB TR2 ; 启动定时计数器 2
SETB REN ; 启动串口接收中断
CLR TI ; 清串口发送中断标志位
CLR RI ; 清串口接收中断标志位
SETB EA ; 开放所有中断
;
MOV RXBUFFHEAD, #RXBUFFSTART;
MOV RXBUFFTAIL, #RXBUFFSTART;
CLR RXCOMMFLAG ;
MOV DPTR, #LOGOTBL ; 在终端上显示 LOGO 字符
LCALL DISPINFO ;
MOV DPTR, #ROMMARKTBL ; 在终端上显示 ROM> 字符
LCALL DISPINFO
;
;****************************************************
;* *
;* 主程序 *
;* *
;****************************************************
MAIN: LCALL WATDOG ; 清看门狗
LCALL GETCOMMAND
MAINOUT: LJMP MAIN
NOP
NOP
NOP
LJMP START
;
;
;****************************************************************************
;////////////////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////
;****************************************************************************
; 主要处理程序
;
;****************************************************
;* *
;* 看门狗 *
;* *
;****************************************************
WATDOG: CPL MCUDOG ; 清看门狗
RET
;
;
;****************************************************
;* *
;* 获取命令 *
;* *
;****************************************************
GETCOMMAND: LCALL PUTCOMMSPACE ; 刷新命令符
MOV A, RXBUFFTAIL ;
XRL A, #RXBUFFSTART ;
JZ GETCOMMOUT ; 接收缓冲区空不处理
JNB RXCOMMOKFLAG, GETCOMMOUT; 命令接收不成功不处理
MOV A, RXBUFFLEN ;
CLR C ;
SUBB A, #COMMANDLEN ;
JNC GETCOMMERROR ; 命令字符超长出错
CLR A ;
MOV R4, A ; 清查表计数器
MOV R5, #RXBUFFSTART ; 置接收缓冲区首址
MOV DPTR, #COMMANDTBL ; 置命令表首址
GETCOMMCOMP: MOV A, R4 ;
MOVC A, @A+DPTR ; 查表
INC R4 ;
MOV R6, A ; 暂存到 R6
MOV A, R4 ;
JNZ GETCOMMOVER ;
INC DPH ; 计数器溢出处理
GETCOMMOVER: MOV A, R5 ;
INC R5 ;
MOV R0, A ;
MOV A, @R0 ; 读接收缓冲区
MOV R7, A ; 暂存到 R7
MOV A, R6 ;
XRL A, #0FFH ;
JZ GETCOMMERROR ; 是否出错
MOV A, R6 ;
XRL A, #0AH ;
JZ GETCOMMCOMPEND ; 比较成功
MOV A, R7 ;
XRL A, R6 ;
JZ GETCOMMCOMP ; 去下一个比较
MOV A, R6 ;
ADD A, #20H ; 小写处理
XRL A, R7 ;
JZ GETCOMMCOMP ; 去下一个比较
MOV R5, #RXBUFFSTART ;
MOV A, R4 ;
MOV B, #COMMANDLEN ;
DIV AB ;
MOV B, #COMMANDLEN ;
INC A ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -