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

📄 无延时.asm

📁 这是一个检测高压线路是否有电,还是无电的程序,程序使用汇编语言编辑的.
💻 ASM
📖 第 1 页 / 共 4 页
字号:
          COM       EQU      20H
          DAT       EQU      21H

          COLUMN    EQU      30H       ;列地址寄存器(0-191)
          PAGE1     EQU      31H
          CODE1      EQU      32H      ;字符代码寄存器
          COUNT     EQU      33H       ;计数器

          CSA       EQU      P3.0      ;片选/CSA
          CSB       EQU      P3.1      ;片选/CSB
          DI        EQU      P3.2      ;寄存器选择信号
          RW        EQU      P3.3      ;读/写选择信号
          E         EQU      P3.4      ;使能信号
          WATCHDOG  EQU      P3.6

  ;==============================主程序==================================
  ;中文演示显示程序段

            MAIN:   LCALL  INT              ;初始化子程序
			  LCALL  FENG1		  ;调用封面子程序1
			  LCALL  YANSHI1          ;延时子程序
			  LCALL  CLEAR        	  ;清屏
                    LCALL  FENG2            ;调用封面子程序2
			  LCALL  YANSHI1          ;延时子程序
			  LCALL  CLEAR        	  ;清屏

			  MOV    P0,  #0FFH
	      MMNN0:  MOV    A,   P0
			  ANL    A,   #1FH
			  CJNE   A,   #01H,  MMNN1
			  LCALL  DJ50V
			  LJMP   TTYY8
		MMNN1:  CJNE   A,   #02H,  MMNN2
			  LCALL  DJ110V
			  LJMP   TTYY8
		MMNN2:  CJNE   A,   #04H,  MMNN3
			  LCALL  DJ220V
			  LJMP   TTYY8
		MMNN3:  CJNE   A,   #08H,  MMNN4
			  LCALL  DJ330V
			  LJMP   TTYY8
		MMNN4:  CJNE   A,   #10H,  MMNN0
			  LCALL  DJ500V

    TTYY8:  CLR   C
            CPL    WATCHDOG
	      MOV   A,  P2
	      MOV   R2, A
     		LCALL DELAY2
     		MOV   A,  P2
     		SUBB  A,  R2
     		JNZ   TTYY8
     		MOV   A,  R2
		ANL   A,  #0EH    ;检测A,B,C三相有无电(p2.3,p2.2,p2.1)
		CJNE  A,  #00H,  TTYY1
		                  ;三相均有电,顺序执行;否则,转TT1
		LCALL  AXYD
		LCALL  BXYD
		LCALL  CXYD
		LCALL  JZCZ
		CLR   P3.5
 		LJMP  TTYY8
	TTYY1:	CJNE  A,  #08H,  TTYY2    ;A无电,B,C均有电
		LCALL  AXWD
		LCALL  BXYD
		LCALL  CXYD
		LCALL  JZCZ
		CLR   P3.5
		LJMP  TTYY8
	TTYY2:	CJNE  A,  #04H,  TTYY3    ;B无电,A,C均有电
		LCALL  AXYD
		LCALL  BXWD
		LCALL  CXYD
		LCALL  JZCZ
		CLR   P3.5
		LJMP  TTYY8
	TTYY3:	CJNE  A,  #02H,  TTYY4    ;C无电,B,A均有电
		LCALL  AXYD
		LCALL  BXYD
		LCALL  CXWD
		LCALL  JZCZ
		CLR   P3.5
		LJMP  TTYY8
	TTYY4:	CJNE  A,  #06H,  TTYY5    ;A有电,B,C均无电
		LCALL  AXYD
		LCALL  BXWD
		LCALL  CXWD
		LCALL  JZCZ
		CLR   P3.5
		LJMP  TTYY8
	TTYY5:	CJNE  A,  #0AH,  TTYY6    ;B有电,A,C均无电
		LCALL  AXWD
		LCALL  BXYD
		LCALL  CXWD
		LCALL  JZCZ
		CLR   P3.5
		LJMP  TTYY8
	TTYY6:	CJNE  A,  #0CH,  TTYY7    ;C有电,B,A均无电
		LCALL  AXWD
		LCALL  BXWD
		LCALL  CXYD
		LCALL  JZCZ
		CLR   P3.5
		LJMP  TTYY8
	TTYY7:	CJNE  A,  #0EH,  XXX    ;A,B,C均无电
		LCALL  AXWD
		LCALL  BXWD
		LCALL  CXWD
		LCALL  YXCZ
		SETB  P3.5
		LJMP  TTYY8
  	XXX:  LJMP  TTYY8

  ;========================左区驱动子程序=======================

  ;-------------------------------------------------------------

                    ;写指令代码子程序(左)

          PRL0:
                    RET

  ;-------------------------------------------------------------

                    ;写显示数据子程序(左)

          PRL1:
                    RET

 ;-------------------------------------------------------------

                    ;读显示数据子程序(左)

          PRL2:
                    RET

  ;========================中区驱动子程序=======================

  ;-------------------------------------------------------------

                    ;写指令代码子程序(中)

          PRM0:     CLR      CSA              ;片选设置为"01"
                    SETB     CSB              ;
                    CLR      DI              ;DI=0
                    SETB     RW              ;RW=1
          PRM01:    MOV      P1,  #0FFH       ;P1口置"1"
                    SETB     E                ;E=1
                    MOV      A,   P1          ;读状态字
                    CLR      E                ;E=0

;                    CPL      P2.0             ;;ADD20050916

                    JB       ACC.7,  PRM01    ;判"忙"标志为"0"否,否再读
                    CLR      RW              ;RW=0
                    MOV      P1,  COM         ;写指令代码
                    SETB     E                ;E=1
                    CLR      E                ;E=0
                    RET

  ;-------------------------------------------------------------

                    ;写显示数据子程序(中)

          PRM1:     CLR      CSA              ;片选设置为"01"
                    SETB     CSB              ;
                    CLR      DI              ;DI=0
                    SETB     RW              ;RW=1
          PRM11:    MOV      P1,  #0FFH       ;P1口置"1"
                    SETB     E                ;E=1
                    MOV      A,   P1          ;读状态字
                    CLR      E                ;E=0

;                    CPL      P2.0               ;;ADD 20050916

                    JB       ACC.7,  PRM11    ;判"忙"标志为"0"否,否再读
                    SETB     DI              ;DI=1
                    CLR      RW              ;RW=0
                    MOV      P1,  DAT         ;写数据
                    SETB     E                ;E=1
                    CLR      E                ;E=0
                    RET

 ;-------------------------------------------------------------

                    ;读显示数据子程序(中)

          PRM2:     CLR      CSA              ;片选设置为"01"
                    SETB     CSB              ;
                    CLR      DI              ;DI=0
                    SETB     RW              ;RW=1
          PRM21:    MOV      P1,  #0FFH       ;P1口置"1"
                    SETB     E                ;E=1
                    MOV      A,   P1          ;读状态字
                    CLR      E                ;E=0

;                    CPL      P2.0               ;;ADD 20050916

                    JB       ACC.7,  PRM21    ;判"忙"标志为"0"否,否再读
                    SETB     DI              ;DI=1
                    MOV      P1,  #0FFH       ;P1口置"1"
                    SETB     E                ;E=1
                    MOV      DAT,  P1         ;读数据
                    CLR      E                ;E=0
                    RET

  ;========================右区驱动子程序=======================

  ;-------------------------------------------------------------

                    ;写指令代码子程序(右)

          PRR0:     SETB     CSA              ;片选设置为"10"
                    CLR      CSB              ;
                    CLR      DI              ;DI=0
                    SETB     RW              ;RW=1
          PRR01:    MOV      P1,  #0FFH       ;P1口置"1"
                    SETB     E                ;E=1
                    MOV      A,   P1          ;读状态字
                    CLR      E                ;E=0

 ;                   CPL      P2.0               ;;ADD 20050916


                    JB       ACC.7,  PRR01    ;判"忙"标志为"0"否,否再读
                    CLR      RW              ;RW=0
                    MOV      P1,  COM         ;写指令代码
                    SETB     E                ;E=1
                    CLR      E                ;E=0
                    RET

  ;-------------------------------------------------------------

                    ;写显示数据子程序(右)

          PRR1:     SETB     CSA              ;片选设置为"10"
                    CLR      CSB              ;
                    CLR      DI              ;DI=0
                    SETB     RW              ;RW=1
          PRR11:    MOV      P1,  #0FFH       ;P1口置"1"
                    SETB     E                ;E=1
                    MOV      A,   P1          ;读状态字
                    CLR      E                ;E=0

;                    CPL      P2.0               ;;ADD 20050916

                    JB       ACC.7,  PRR11    ;判"忙"标志为"0"否,否再读
                    SETB     DI              ;DI=1
                    CLR      RW              ;RW=0
                    MOV      P1,  DAT         ;写数据
                    SETB     E                ;E=1
                    CLR      E                ;E=0
                    RET

 ;-------------------------------------------------------------

                    ;读显示数据子程序(右)

          PRR2:     SETB     CSA              ;片选设置为"10"
                    CLR      CSB              ;
                    CLR      DI              ;DI=0
                    SETB     RW              ;RW=1
          PRR21:    MOV      P1,  #0FFH       ;P1口置"1"
                    SETB     E                ;E=1
                    MOV      A,   P1          ;读状态字
                    CLR      E                ;E=0

;                    CPL      P2.0               ;;ADD 20050916

                    JB       ACC.7,  PRR21    ;判"忙"标志为"0"否,否再读
                    SETB     DI              ;DI=1
                    MOV      P1,  #0FFH       ;P1口置"1"
                    SETB     E                ;E=1
                    MOV      DAT,  P1         ;读数据
                    CLR      E                ;E=0
                    RET

 ;=======================中文字符写入子程序==========================
         CCW_PR:    MOV      DPTR,  #CCTAB    ;确定字符字模首地址
                    MOV      A,   CODE1        ;取代码
                    MOV      B,   #20H        ;字模块宽度为32个字节
                    MUL      AB               ;代码*32
                    ADD      A,   DPL         ;字符字模块首地址=字模库首地址+代码*32
                    MOV      DPL,  A          ;
                    MOV      A,   B
                    ADDC     A,   DPH
                    MOV      DPH,   A
                    PUSH     COLUMN           ;列地址入栈
                    PUSH     COLUMN           ;列地址入栈
                    MOV      CODE1,  #00H      ;代码寄存器借用为间址寄存器
         CCW_1:     MOV      COUNT,  #10H     ;计数器设置为16
                    MOV      A,   PAGE1       ;读页地址寄存器
                    ANL      A,   #07H        ;
                    ORL      A,   #0B8H       ;"或"页地址设置代码
                    MOV      COM,  A          ;写页地址设置指令
                    LCALL    PRL0             ;
                    LCALL    PRM0             ;
                    LCALL    PRR0             ;
                    POP      COLUMN           ;取列地址值
                    MOV      A,  COLUMN       ;读列地址寄存器

                    CJNE     A,  #40H,  TT1
                    LJMP     TT2
            TT1:    JC       LITTLE
                    LJMP     TT2
            LITTLE: ADD      A,  #80H
                    MOV      COLUMN,  A

               TT2: CLR      C                ;
                    SUBB     A,  #40H         ;列地址-64
                    JC       CCW_2            ;<0为左屏显示区域
                    MOV      COLUMN,  A       ;
                    SUBB     A,  #40H         ;列地址-64
                    JC       CCW_11           ;<0为中屏显示区域
                    MOV      COLUMN,  A       ;>=0为右屏显示区域
                    MOV      A,  PAGE1        ;
                    SETB     ACC.5            ;设置区域标志位
                    MOV      PAGE1,  A        ;"00"为左,"01"为中,"10"为右
                    LJMP     CCW_2            ;
          CCW_11:   MOV      A,  PAGE1        ;
                    SETB     ACC.4            ;设置区域标志位
                    MOV      PAGE1,  A        ;
          CCW_2:    MOV      COM,   COLUMN    ;设置列地址值
                    ORL      COM,   #40H      ;"或"列地址指令标志位
                    MOV      A,  PAGE1        ;判区域标志以确定设置哪个控制器
                    ANL      A,  #30H

⌨️ 快捷键说明

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