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

📄 loadprogram.asm

📁 单片机89C2051的时钟应用程序程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;
;****************************************************
;*                                                  *
;*                  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 + -