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

📄 串口调试.asm

📁   一个串口调试程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
         CLR CLK              ;
         SETB CLK             ;
YW_BT6:  MOV C,BIT6           ;BIT6
         MOV R11,C            ;
         MOV G11,C
         MOV B11,C
         CLR CLK              ;
         SETB CLK             ;
YW_BT5:  MOV C,BIT5           ;BIT5
         MOV R11,C            ;
         MOV G11,C
         MOV B11,C
         CLR CLK              ;
         SETB CLK             ;
YW_BT4:  MOV C,BIT4           ;BIT4
         MOV R11,C            ;
         MOV G11,C
         MOV B11,C
         CLR CLK              ;
         SETB CLK             ;
YW_BT3:  MOV C,BIT3           ;BIT3
         MOV R11,C            ;
         MOV G11,C
         MOV B11,C
         CLR CLK              ;
         SETB CLK             ;
YW_BT2:  MOV C,BIT2           ;BIT2
         MOV R11,C            ;
         MOV G11,C
         MOV B11,C
         CLR CLK              ;
         SETB CLK             ;
YW_BT1:  MOV C,BIT1           ;BIT1
         MOV R11,C            ;
         MOV G11,C
         MOV B11,C
         CLR CLK              ;
         SETB CLK             ;
YW_BT0:  MOV C,BIT0           ;BIT0
         MOV R11,C            ;
         MOV G11,C
         MOV B11,C
         CLR CLK              ;
         SETB CLK             ;
         INC DPTR
          RET                 ;
;*******************************************************************************
;完成行的开通服务,用74HC163芯片实现行的A;B;C;D信号.
HANG_CE: SETB OE               ;CLOSE THE SCREEN
         MOV A,HANG_COUNT
         CJNE A,HANG,ROW1     ;判断是否是第一行不是的话行加一.是的话行复位一次.
         CLR ROW_RST         ;行复位
         CLR ROW_CLK          ;复位脉冲
         SETB ROW_CLK         ;复位脉冲
           RET
ROW1:    SETB ROW_RST        ;行记数信号.
         CLR ROW_CLK
         SETB ROW_CLK
           RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;程序完成单页数据的读入.                                                        *
;要求给定文件名:FILE_NAME                                                       *
READ_FILE: SETB OE         ;CLOSE THE SCREEN                                    *
           SETB ROM_CE   ;                                                    *
           CLR ROM_A17     ;                                                    *
           CLR p4.2     ;                                                    *
           ;MOV AUXR,#02H
            MOV DPTR,#000EH  ;                                                 *
            MOV A,FILE_NAME ;将文件名送到A                                      *
            MOV B,#04H     ;每页有4个控制字节                                   *
            MUL AB         ;算出当前文件控制制字节的位置                        *
            ADD A,DPL        ;                                                  *
            MOV DPL,A        ;                                                  *
            MOV A,B
            ADDC A,DPH
            MOV DPH,A     ;计算好了控制字节的地址                               *
            MOV R1,#04H   ;有四个控制数据                                       *
            MOV R0,#video_mode ;R0指向video_mode地址单元.                       *
READ_2:     MOVX A,@DPTR     ;                                                  *
            MOV @R0,A        ;                                                  *
            INC DPTR         ;                                                  *
            INC R0            ;                                                 *
            DJNZ R1,READ_2    ;控制字节取完没有. ***********************        *
;到此为止已经完成了控制字节的读取.由DPTR0完成.                                  *
            INC AUXR1         ;启动DPTR1                                        *
           MOV DPTR,#000EH   ;*******************计算点阵数据的起始地址.        *
           MOV A,PAGE_COUNT ;将文件名送到A                                      *
           MOV B,#04H     ;每页有4个控制字节                                    *
           MUL AB         ;算出当前文件控制制字节的位置                         *
           ADD A,DPL      ;                                                     *
           MOV DPL,A      ;                                                     *
READ_3:    MOV A,DPH      ;                                                     *
           ADD A,B        ;                                                     *
           MOV DPH,A      ;计算好了点阵数据的起始地址***************            *
          MOV A,FILE_NAME ;将文件名送到A 准备计算点阵数据的起始地址.            *
          MOV B,BYTEL     ;                                                     *
          MUL AB          ;                                                     *
          ADD A,DPL       ;                                                     *
          MOV DPL,A       ;                                                     *
          JNC READ_4      ;                                                     *
          INC DPH         ;                                                     *
READ_4:   MOV A,B         ;                                                     *
          ADD A,DPH       ;                                                     *
          MOV DPH,A       ;                                                     *
          MOV A,FILE_NAME ;                                                     *
          MOV B,BYTEH     ;                                                     *
          MUL AB          ;                                                     *
          ADD A,DPH       ;                                                     *
          MOV DPH,A       ;                                                     *
          ;MOV DPHH,B   ;完成了点阵数据地址的计算.                              *
           mov dpl1,bytel ;                                                     *
           mov dph1,BYTEH ;                                                     *
            ;MOV dptr,#1000h                                                    *
             ;mov A,bytel    ;                                                   *
             ;JnZ READ_5
             ;MOV R2,BYTEH
             ;DEC R2
             ;SJMP CR_05
READ_5:       MOV R2,BYTEH
cr_05:         mov r1,bytel ;                                                   *
cr_01:          setb ROM_CE  ;                                                 *
               ;MOV AUXR,#02H
              movx a,@dptr    ;                                                 *
             inc dptr          ;DPTR+1                                          *
            push dph          ;                                                 *
           push dpl           ;                                  *
         clr RAM_CE       ;                                                 *
         ;MOV AUXR,#00H
        mov dph,dph1           ;交换地址                                        *
       mov dpl,dpl1           ;                                                 *
      movx @dptr,a            ;                                                 *
     inc dptr                 ;                                                 *
      mov dph1,dph            ;                                                 *
       mov dpl1,dpl           ;                                                 *
        pop dpl               ;                                                 *
         pop dph              ;                                                 *
          djnz r1,cr_01 ;判断128个字节写完了没有                                *
          MOV A,R2
          JZ CR_02
          dec r2
          CJNE r2,#00H,cr_05  ;                                                 *
        ;mov r5,#01;55 ;延时10ms                                                *
cr_02:  mov r6,#30h           ;                                                 *
        djnz r6,$             ;                                                 *
        ;djnz r5,cr_02        ;                                                 *
        ;djnz r4,cr_05 ;32K的数据读完了没有                                     *
        nop                   ;                                                 *
        INC AUXR1    ;变回DPTR0                                                 *
          ret                ;                                                  *
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;以下是硬件设置子程序.                                                        *
;完成硬件长;宽;波特率;屏的颜色(单,双,三);屏号;                                *
HARD_SETUP:   CLR RAM_CE        ;选中RAM                                      *
            ;SETB ROM_A17        ;页地址                                      *
           ;SETB P4.2        ;页地址                                          *
          MOV DPTR,#0000H     ;接收数据暂存在,0000H地址起的5个地址区          *
          mov a,#00h          ;                                               *
          movx @dptr,a         ;                                              *
          inc dptr             ;                                              *
         LCALL SPIN          ;读数                                            *
        MOV R1,A            ;参数的个数存在R1里.                              *
HARD_1:  LCALL SPIN          ;读数                                            *
        MOVX @DPTR,A        ;存数                                             *
         INC DPTR            ;地址加一                                        *
          DJNZ R1,HARD_1        ;                                             *
           LCALL SPIN          ;                                              *
            CJNE A,#0AAH,HARD_RET    ;出错返回                                *
             LCALL SPIN            ;                                          *
              CJNE A,SCREEN_NUMBER,HARD_2 ;                                   *
             LCALL  MCU_RESPONSE_YES  ;返回成功信息,是群发的话不返回成功信息. *
            SJMP HARD_SAVE           ;                                        *
HARD_2:    CJNE A,#00H,HARD_RET;是群发吗?是的话直接去保存数据.不要返回成功信息.*
          SJMP HARD_SAVE             ;                                        *
HARD_SAVE: SETB ROM_A17          ;给定硬件参数存放的叶地址.                   *
             SETB P4.2         ;同上                                          *
              MOV DPTR,#0FF80H      ;给定数据存储的地址指向0FF80H             *
             MOV PAGE_COUNT,#01H ;共一页数据                                  *
            LCALL WRITE_FLASH   ;写给定地址起的一页数据,保存硬件参数          *
HARD_RET:    RET                ;                                             *
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;显示数据下载服务子程序                                                       *
;适合于1/8扫描16折上蛇,上位的数据格式是1行;2行;3行.....接收程序会转换成1/8上蛇*
DOWN_DATA:CLR RAM_CE      ;给片选                                      *
           MOV AUXR1,#00H
            MOV DPTR,#0000H     ;接收数据暂存在,0000H地址起的8个数据区        *
             MOV R1,#0EH          ;在收最大页数据之前要先收15个数据.          *
DOWN1:        LCALL SPIN          ;读数据                                     *
               MOVX @DPTR,A       ;                                           *
              INC DPTR             ;                                          *
             DJNZ R1,DOWN1       ;最后一个数据是最大叶数.                     *
            MOV PAGE_COUNT,A    ;把页数暂存在PAGE_COUNT里.                    *
            mov file_count,a
            LCALL TEST
           MOV R2,A             ;                                             *
DOWN2:    MOV R1,#04H         ;每页有四个控制数据.                            *
DOWN3:   LCALL SPIN          ;                                                *
        MOVX @DPTR,A         ;                                                *
       INC DPTR              ;                                                *
      DJNZ R1,DOWN3       ;一页的四个数据收完没有.                          *
     DJNZ R2,DOWN2       ;把所有显示页的控制数据收完了没有                *
      MOV DPH1,DPH       ;                                                *
       MOV DPL1,DPL      ;                                                *
        MOV AUXR1,#01H   ;选择DPTR1                                       *
         MOV DPH,DPH1     ;                                                *
          MOV DPL,DPL1     ;                                                *
           INC DPTR         ;将下半屏数据的存放首地址算出.                   *
            INC DPTR         ;同上                                            *
            ;;MOV AUXR1,#00H    ;选择DPTR0 ;下蛇的话就开该语句.                *
DOWN4:      MOV R2,#02H               ;分两次收                               *
DOWN5:      MOV R3,ISR_BYTEH
            INC R3                   ;还有漏洞++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
            ;MOV A,ISR_BYTEL
            ;JZ
DOWN6:      MOV R1,ISR_BYTEL           ;BYTEL里的数据在INIT里计算好了.         *
DOWN7:      LCALL SPIN                ;                                       *
            CPL A
            MOVX @DPTR,A              ;                                       *
            INC DPTR                  ;                                       *
            LCALL SPIN                ;                                       *
            CPL A
            MOVX @DPTR,A              ;                                       *
           INC DPTR                   ;                                       *
           INC DPTR                   ;指向下两个单元                         *
           INC DPTR                   ;                                       *
          DJNZ R1,DOWN7               ;                                       *
          DJNZ R3,DOWN7
DOWN8:    INC AUXR1                   ;第一次执行变为DPTR1第二次执行DPTR0     *
        DJNZ R2,DOWN5                 ;                                       *
        DJNZ PAGE_COUNT,DOWN4         ;                                       *
         LCALL SPIN                   ;                                       *
          CJNE A,#0AAH,ISR_RETURN     ;                                       *
            LCALL SPIN                ;                                       *
            CJNE A,SCREEN_NUMBER,ISR_RETURN ;                                 *
            ;LCALL MCU_RESPONSE_yes   ;应答计算机数据发送成功.                *
            ;LCALL add_mapping          ;调用地址映射处理                     *
            MOV DPTR,#0000H       ;给定FLASH的存放的地址,断电不丢失           *                                             *
             CLR ROM_A17          ;                                           *
              CLR P4.2            ;                                           *
             MOV PAGE_COUNT,#0F0H ;共写255页数据                              *
            LCALL WRITE_FLASH   ;写0000起的一页数据                           *
           RET                 ;                                              *
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;以下是串口中断处理子程序(COM_ISR)                                              *
;功能:完成硬件设置数据的接收和显示数据的接收,并把接收的数据保存到FLASH里.       *
COM_ISR:  CLR OE                  ;关显示屏                                     *
induct_1:  CJNE A,#0AAH,induct_2    ;判报头的第一个数是不是"55H"                *
           LCALL SPIN              ;读引导码AAH                                 *
induct_2:  CJNE A,#55H,induct_3   ;抗干扰处理                                   *
           SJMP INDUCT_6
INDUCT_3:  CJNE A,#77H,INDUCT_6
           MOV ISP_CONTR,#01100000B
           RETI
INDUCT_6:  LCALL SPIN              ;                                            *
          CJNE A,#00H,INDUCT_4     ;判断是否是广播命令是的话进入接收            *
           SJMP  INDUCT_5           ;是广播命令的话顺执,否是否是自己的数据.     *
INDUCT_4:CJNE A,screen_number,ISR_error ;屏号相等的话进入接收否则返回           *
INDUCT_5: LCALL SPIN               ;                                            *
           CJNE A,#0C1H,data_CODE   ;=#C1H调用硬件设置,否则转DATA_CODE          *
            LCALL HARD_setup         ;调用硬件设置子程序.并返回接收结果信息.    *
             SJMP ISR_RETURN         ;准备返回主程序                            *
data_CODE:  CJNE A,#0D1H,debug       ;不是数据下载命令的话,返回.                *
           LCALL DOWN_DATA           ;下载数据                                  *
            SJMP ISR_RETURN          ;准备返回主程序                            *
debug:     CJNE A,#0C2h,ISR_ERROR    ;不是数据下载命令的话,返回.                *
           LCALL screen_debug      ;是设计者在调试程序.
            SJMP ISR_RETURN          ;转到返回子程序.
ISR_error: lcall MCU_RESPONSE_NO     ;调用MCU应答发送失败回复                   *
ISR_RETURN:  MOV SP,#07H             ;                                          *
              MOV A,#00H             ;                                          *
               PUSH A                ;                                          *
                PUSH A               ;                                          *
                 RETI                ;                                          *

⌨️ 快捷键说明

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