⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loadprogram.asm

📁 单片机89C2051的时钟应用程序程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;*                                                  *
;****************************************************
; DPTR = DPTR + A
; IF DPTR > 0FFFFH      CY = 1
DPTRADDC:       PUSH    ACC                     ;
                ADD     A, DPL                  ; DPL + ACC
                MOV     DPL, A                  ;
                MOV     A, DPH                  ;
                ADDC    A, #000H                ; DPH = DPH + CY
                MOV     DPH, A                  ;
                POP     ACC                     ;
                RET
;
;
;****************************************************
;*                                                  *
;*                       PAUSE                      *
;*                                                  *
;****************************************************
MYPAUSE:        JNB     TIME500MS, $
                LCALL   WATDOG
                JB      TIME500MS, $
                DEC     A
                JNZ     MYPAUSE
                RET
;
;
;============================================================================
;////////////////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////
;============================================================================
; XMODEM 子程序
;
;****************************************************
;*                                                  *
;*                  XMODEM DOWNLOAD                 *
;*                                                  *
;****************************************************
; 以 XMODEM 协议接收数据
XMODEMDOWN:     LCALL   PUTENTER                ;
                CLR     A                       ;
                MOV     DPLO, A                 ;
                MOV     DPHI, A                 ;
                MOV     R7, #XMODEMMXAERROR     ; 最大错误次数
                MOV     RXBUFFTAIL, #XBUFFSTART ;
                MOV     RXBUFFHEAD, #XBUFFSTART ;
                CLR     RXCOMMOKFLAG            ;
                CLR     A                       ;
                MOV     RXBUFFLEN, A            ;
                INC     A                       ;
                MOV     BLKCHK, A               ; 1: CRC        0: CheckSum
                MOV     R5, A                   ; 存包号
                MOV     R6, #CRC                ; 发送字符 C 请求字符 CRC
                SETB    RXCOMMFLAG              ; 起动 XMODEM 协议接收
XDOWNLOOP:      MOV     A, R6                   ;
                LCALL   PUTCHAR                 ;
                MOV     B, #05H                 ; TIMEOUT
                LCALL   GETCHAR                 ; 读入字符
                MOV     R3, A                   ;
                MOV     A, B                    ;
                JNZ     XDOWNREAD               ; 是否超时
                MOV     A, R7                   ;
                CLR     C                       ;
                SUBB    A, #0AH                 ;
                JNC     XDOWNLOOPEND            ; 继续发送 CRC 字符
                MOV     R6, #NAK                ;
                CLR     A                       ;
                MOV     BLKCHK, A               ; 发送 CheckSum 字符
XDOWNLOOPEND:   DJNZ    R7, XDOWNLOOP           ;
XDOWNCAN:       MOV     A, #CAN                 ; 错误太多中断
                LCALL   PUTCHAR                 ;
                CLR     A                       ;
                LJMP    XDOWNEND2               ;
;
XDOWNEND1:      LCALL   PUTENTER                ;
                CLR     A                       ;
                DEC     A                       ;
XDOWNEND2:      CLR     RXCOMMFLAG              ; 起动 COMMAND 接收
                MOV     RXBUFFTAIL, #RXBUFFSTART;
                MOV     RXBUFFHEAD, #RXBUFFSTART;
                MOV     RXBUFFLEN, #00H         ;
                RET
;
XDOWNEND:       MOV     A, #ACK                 ;
                LCALL   PUTCHAR                 ;
                LJMP    XDOWNEND1               ;
;
XDOWNREAD:      MOV     R6, #NAK                ;
                MOV     A, R3                   ;
                XRL     A, #SOH                 ; 是否包头
                JZ      XDOWNPACK               ;
                MOV     A, R3                   ;
                XRL     A, #EOT                 ; 是否包结束
                JZ      XDOWNEND                ;
                MOV     A, R3                   ;
                XRL     A, #CAN                 ; 是否发送端中断
                JZ      XDOWNCAN                ;
                MOV     A, #05H                 ;
                LCALL   MYPAUSE                 ;
                LJMP    XDOWNLOOPEND            ;
;
XDOWNPACK:      MOV     A, #BLKSIZE             ; 包处理
                ADD     A, BLKCHK               ;
                ADD     A, #03H                 ;
                MOV     R4, A                   ; 计算包长度
XDOWNPACKLOOP:  MOV     B, #03H                 ;
                LCALL   GETCHAR                 ;
                MOV     A, B                    ;
                JZ      XDOWNLOOPEND            ;
                DJNZ    R4, XDOWNPACKLOOP       ; 读入一包数据
;
                MOV     R0, #XBUFFSTART         ;
                INC     R0                      ;
                MOV     A, @R0                  ; 读入包号
                MOV     B, A                    ;
                INC     R0                      ;
                MOV     A, @R0                  ; 读入包号反值
                ADD     A, B                    ;
                XRL     A, #0FFH                ; 校验包号
                JNZ     XDOWNLOOPEND            ;
                MOV     A, B                    ; 是否当前包号
                XRL     A, R5                   ;
                JZ      XDOWNCHECK              ; 是转 CRC 计算
                MOV     A, R5                   ;
                DEC     A                       ; 是否上次包号
                XRL     A, B                    ;
                JNZ     XDOWNLOOPEND            ;
                MOV     R6, #ACK                ; 是发握手信号
                LJMP    XDOWNLOOP               ;
;
XDOWNCHECK:     MOV     A, BLKCHK               ;
                JZ      XDOWNCHECKSUM           ; CheckSum 处理
                LCALL   XCRCCHECK               ; 计算 CRC
                JNZ     XDOWNLOOPEND            ;
                LJMP    XDOWNNEXTPACK           ; 是读下一包
;
XDOWNCHECKSUM:  LCALL   XCHECKSUM               ; 计算 CheckSum
                JNZ     XDOWNLOOPEND            ;
XDOWNNEXTPACK:  MOV     R6, #ACK                ; 是发握手信号
                LCALL   PROGRAMCHIP             ;
                JZ      XDOWNCAN1               ;
                INC     R5                      ; 初始化
                CLR     A                       ;
                MOV     R7, #XMODEMMXAERROR     ; 最大错误次数
                MOV     RXBUFFTAIL, #XBUFFSTART ;
                MOV     RXBUFFHEAD, #XBUFFSTART ;
                CLR     A                       ;
                MOV     RXBUFFLEN, A            ;
                CLR     RXCOMMOKFLAG            ;
                LJMP    XDOWNLOOP               ;
;
XDOWNCAN1:      LJMP    XDOWNCAN                ;
;
;
;***************************************************************************
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;***************************************************************************
; CRC16 子程序 16位 CRC         CCITT - 12
; CheckSum 子程序
;
CRC16TBL:       DW      00000H, 01021H, 02042H, 03063H, 04084H, 050A5H, 060C6H, 070E7H
                DW      08108H, 09129H, 0A14AH, 0B16BH, 0C18CH, 0D1ADH, 0E1CEH, 0F1EFH
                DW      01231H, 00210H, 03273H, 02252H, 052B5H, 04294H, 072F7H, 062D6H
                DW      09339H, 08318H, 0B37BH, 0A35AH, 0D3BDH, 0C39CH, 0F3FFH, 0E3DEH
                DW      02462H, 03443H, 00420H, 01401H, 064E6H, 074C7H, 044A4H, 05485H
                DW      0A56AH, 0B54BH, 08528H, 09509H, 0E5EEH, 0F5CFH, 0C5ACH, 0D58DH
                DW      03653H, 02672H, 01611H, 00630H, 076D7H, 066F6H, 05695H, 046B4H
                DW      0B75BH, 0A77AH, 09719H, 08738H, 0F7DFH, 0E7FEH, 0D79DH, 0C7BCH
                DW      048C4H, 058E5H, 06886H, 078A7H, 00840H, 01861H, 02802H, 03823H
                DW      0C9CCH, 0D9EDH, 0E98EH, 0F9AFH, 08948H, 09969H, 0A90AH, 0B92BH
                DW      05AF5H, 04AD4H, 07AB7H, 06A96H, 01A71H, 00A50H, 03A33H, 02A12H
                DW      0DBFDH, 0CBDCH, 0FBBFH, 0EB9EH, 09B79H, 08B58H, 0BB3BH, 0AB1AH
                DW      06CA6H, 07C87H, 04CE4H, 05CC5H, 02C22H, 03C03H, 00C60H, 01C41H
                DW      0EDAEH, 0FD8FH, 0CDECH, 0DDCDH, 0AD2AH, 0BD0BH, 08D68H, 09D49H
                DW      07E97H, 06EB6H, 05ED5H, 04EF4H, 03E13H, 02E32H, 01E51H, 00E70H
                DW      0FF9FH, 0EFBEH, 0DFDDH, 0CFFCH, 0BF1BH, 0AF3AH, 09F59H, 08F78H
                DW      09188H, 081A9H, 0B1CAH, 0A1EBH, 0D10CH, 0C12DH, 0F14EH, 0E16FH
                DW      01080H, 000A1H, 030C2H, 020E3H, 05004H, 04025H, 07046H, 06067H
                DW      083B9H, 09398H, 0A3FBH, 0B3DAH, 0C33DH, 0D31CH, 0E37FH, 0F35EH
                DW      002B1H, 01290H, 022F3H, 032D2H, 04235H, 05214H, 06277H, 07256H
                DW      0B5EAH, 0A5CBH, 095A8H, 08589H, 0F56EH, 0E54FH, 0D52CH, 0C50DH
                DW      034E2H, 024C3H, 014A0H, 00481H, 07466H, 06447H, 05424H, 04405H
                DW      0A7DBH, 0B7FAH, 08799H, 097B8H, 0E75FH, 0F77EH, 0C71DH, 0D73CH
                DW      026D3H, 036F2H, 00691H, 016B0H, 06657H, 07676H, 04615H, 05634H
                DW      0D94CH, 0C96DH, 0F90EH, 0E92FH, 099C8H, 089E9H, 0B98AH, 0A9ABH
                DW      05844H, 04865H, 07806H, 06827H, 018C0H, 008E1H, 03882H, 028A3H
                DW      0CB7DH, 0DB5CH, 0EB3FH, 0FB1EH, 08BF9H, 09BD8H, 0ABBBH, 0BB9AH
                DW      04A75H, 05A54H, 06A37H, 07A16H, 00AF1H, 01AD0H, 02AB3H, 03A92H
                DW      0FD2EH, 0ED0FH, 0DD6CH, 0CD4DH, 0BDAAH, 0AD8BH, 09DE8H, 08DC9H
                DW      07C26H, 06C07H, 05C64H, 04C45H, 03CA2H, 02C83H, 01CE0H, 00CC1H
                DW      0EF1FH, 0FF3EH, 0CF5DH, 0DF7CH, 0AF9BH, 0BFBAH, 08FD9H, 09FF8H
                DW      06E17H, 07E36H, 04E55H, 05E74H, 02E93H, 03EB2H, 00ED1H, 01EF0H
                RET
;
;
;****************************************************
;*                                                  *
;*                  校验包的 CRC                    *
;*                                                  *
;****************************************************
; CRCHI AND CRCLO 内容为 0: OK         ELSE: FAIL
XCRCCHECK:      MOV     R0, #XBUFFSTART         ;
                INC     R0                      ;
                INC     R0                      ;
                INC     R0                      ;
                CLR     A                       ;
                MOV     CRCLO, A                ;
                MOV     CRCHI, A                ;
                MOV     A, #BLKSIZE             ;
                INC     A                       ;
                INC     A                       ;
                MOV     R4, A                   ; 计算包长度
XCRCLOOP:       MOV     A, @R0                  ;
                INC     R0                      ;
                XRL     A, CRCHI                ;
                MOV     DPTR, #CRC16TBL         ;
                LCALL   DPTRADDC                ; 调整 DW 地址
                LCALL   DPTRADDC                ;
                CLR     A                       ;
                MOVC    A, @A+DPTR              ; 查表
                XRL     A, CRCLO                ;
                MOV     CRCHI, A                ; 获得高 CRC
                CLR     A                       ;
                INC     A                       ;
                MOVC    A, @A+DPTR              ;
                MOV     CRCLO, A                ; 获得低 CRC
                DJNZ    R4, XCRCLOOP            ;
                MOV     A, CRCLO                ;
                JNZ     XCRCERROR               ;
                MOV     A, CRCHI                ;
                JNZ     XCRCERROR               ;
XCRCERROR:      RET                             ;
;
;
;****************************************************
;*                                                  *
;*                校验包的 CheckSum                 *
;*                                                  *
;****************************************************
XCHECKSUM:      MOV     R0, #XBUFFSTART         ;
                INC     R0                      ;
                INC     R0                      ;
                INC     R0                      ;
                CLR     A                       ;
                MOV     CRCHI, A                ;
                MOV     A, #BLKSIZE             ;
                MOV     R4, A                   ; 计算包长度
XSUMLOOP:       MOV     A, @R0                  ;
                ADD     A, CRCHI                ;
                MOV     CRCHI, A                ;
                INC     R0                      ;
                DJNZ    R4, XSUMLOOP            ;
                MOV     A, @R0                  ;
                XRL     A, CRCHI                ;
                RET
;
;
;============================================================================
;////////////////////////////////////////////////////////////////////////////
;////////////////////////////////////////////////////////////////////////////
;============================================================================
; IN-SYSTEM-PROGRAMMING 子程序
;
;****************************************************
;*                                                  *
;*                      ERASE CHIP                  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -