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

📄 13.bak

📁 定时器程序有一组开关量和1路模拟量
💻 BAK
📖 第 1 页 / 共 2 页
字号:
                MOV   L0,  R4              ;移入工作方式选择数
                INC    L0
                ;
       WAITMK: ACALL DISPLY	            ;等待M键释放
                INC   R2                    ;R2自增一
                CLR   C
                CJNE  R2, #0C8H, JGQUIC    ;若R2大于等于200则调用快进子程序
       JGQUIC:  JC    WATMK1
                 ACALL QUICK
	   WATMK1: JNB   MKEY,  WAITMK      ; R2小于200则等待M键释放
                ;
       JGFKEY: JB    FKEY,  MENU1        ;功能(F)键扫描
               ACALL KEYDLY             ;延时消抖动
               JB    FKEY,  MENU1        ;键未按下则转修改(M)键扫描
               INC   R6                   ;F键按键次数加1
               MOV   A,  R6              ;移入按键次数
RL    A		              ;指针放大
               MOV   DPTR,  #FUNTAB
		    	   JMP   @A+DPTR            ;根据按键次数跳转到相应的程序段
	  FUNTAB: 	AJMP  WAITFK
	    			AJMP  SETLOW
	    			AJMP  SETHI
                AJMP  ENDMEN
                NOP
                NOP
                AJMP  ENDMEN
	;STWKMD:                             ;工作模式设定,不需另外改变菜单
	;
	SETLOW:   MOV   MAX, #60H         ;设置低位(秒位或分位)
                MOV   A,  R4             ;移入工作模式选择数
		    		RL    A		              ;指针放大
                MOV   DPTR,  #FTAB1
		   		JMP   @A+DPTR          ;根据工作模式选择数跳转到相应的程序段
	   FTAB1:  AJMP  SETSS
				AJMP  SETM60
				AJMP  SETSS
                AJMP  SETM60
                NOP
                NOP
               AJMP  WAITFK
SETSS: 	    MOV   DSPLYP, #SL          ;设定显示区域为MM:SS
	    			MOV   ADDRES, #SH
                AJMP  WAITFK
	SETM60:		 MOV   DSPLYP,  #ML       ; 设定显示区域为HH:MM
	   			MOV   ADDRES,  #MH
                AJMP  WAITFK
	    ;
	SETHI: 	   CLR   LPLMOD               ;设置高位(分位或时位)
		    		SETB  HPLMOD              ;高两位数码管闪烁
		    		MOV   MAX, #31H           ;最大数为30
                MOV   A,  R4              ;移入工作模式选择数
		    		RL    A                    ;指针放大
                MOV   DPTR,  #FTAB2      ;移入表首地址
		    		JMP   @A+DPTR           ;根据工作模式选择数跳转到相应的程序段
	FTAB2:      AJMP  SETM30
		    		AJMP  SETHH
		    		AJMP  SETM30
                    AJMP  SETHH
                    NOP
                    NOP
                    AJMP  WAITFK           ;返回等待键释放
         SETM30:	MOV   ADDRES,  #MH   ;移入分位的地址
                    AJMP  WAITFK           ;转向等待键释放
	    	SETHH:  	MOV   ADDRES,  #HH   ;移入时位的地址
	            		AJMP  WAITFK          ;转向等待键释放
                    ;
	    	ENDMEN: 	CLR   HPLMOD         ;恢复不闪烁显示方式
		    			RET
                    NOP
                    NOP
                    LJMP ERR              ;软件陷阱
	    ;
	    ;****************
	    ;  到点工作程序 ;
	    ;****************
        ACTION: MOV   L0,  R4           ;移入工作模式选择数
                INC   L0                  ;送显示数"F-0X"
                MOV   L1,  #00H
                MOV   L2,  #0BH
                MOV   L3,  #00H
				SETB  LED4
				MOV   DSPLYP, #L0         ;指针指向显存
                SETB  LPLMOD             ;设定显示方式不闪烁
                SETB  HPLMOD
                MOV   A,  R4            ;移入工作模式选择数
				RL    A                  ;
                MOV   DPTR,  #A_TAB
				JMP   @A+DPTR          ;根据工作模式选择数跳转
	    	A_TAB: AJMP  ACTF1              ;工作模式一
				AJMP  ACTF1             ;工作模式二
				AJMP  ACTF3             ;工作模式三
                AJMP  ACTF3              ;工作模式四
                NOP
                NOP
                LJMP  ERR                ;软件陷阱
        ACTF1: SETB  SWITCH             ;工作模式一(或二): 关继电器
               MOV   R_MOD,  #82H      ;响铃模式参数#82H
               MOV   R2, #96H            ;响铃次数参数#96H
	  ACTF11:  ACALL RING   	          ;调用响铃子程序
                JNB   MKEY,  ENDACT    ;等待键按下
                JNB   FKEY,  ENDACT    ; 有键按下则结束响铃
                    DJNZ  R2, ACTF11       ;次数未满继续响铃
                    MOV   R_MOD, #0FFH    ;参数#0FF使响铃无效
                    AJMP  ACTF11           ;无键按下返回
                    NOP
		    			NOP
                    LJMP 	ERR              ;软件陷阱
            ACTF3:  CLR   SWITCH            ;工作模式三(或四): 开继电器
                    CLR   BELL               ;蜂鸣器短鸣一声
                    ACALL DL1S
                    SETB  BELL
                    MOV   R_MOD, #0FFH    ;响铃模式参数#0FFH
                    MOV   R2, #96H          ;响铃时间参数#96H
	    	ACTF31: 	ACALL  RING		    ;调用响铃子程序
                    JNB   MKEY,  ENDACT  ;等待键按下
                    JNB   FKEY,  ENDACT   ;  有键按下则结束
                    DJNZ  R2,   ACTF31    ;次数未满继续
                    MOV   R2, #96H         ;重新赋值
                    CLR   BELL             ;短鸣一声(说明: 响铃模式参数#0FFH使
                    ACALL DL100            ; 响铃程序无效,仅起延时作用,
                    SETB  BELL             ; 每延时一段时间短鸣一声,以
                    AJMP  ACTF31          ; 提醒使用者继电器仍在工作)
                    NOP
		    			NOP
                    LJMP 	ERR             ;软件陷阱
           ENDACT: SETB  	SWITCH         ;关继电器
           AWAITF: ACALL	 DISPLY         ;调用显示
                   JNB   FKEY,  AWAITF     ;等待键释放
           AWAITM: ACALL DISPLY           ;调用显示
                    JNB   MKEY,  AWAITM   ;等待键释放
                    RET
                    NOP
		    			NOP
                    LJMP 	ERR             ;软件陷阱
            ;
        ;**************
	    ;   响铃程序  ;
        ;**************
            RING:   MOV   R5, #18H           ;R5为循环控制变量
            RING1:  JNB   MKEY  , R_EXIT    ;键扫描
                    JNB   FKEY  , R_EXIT     ;有键按下则退出
                    MOV   A, R_MOD          ;移入响铃模式参数
                    MOV   C, ACC.7           ;根据响铃模式参数改变响铃
                    MOV   BELL, C
                    RL    A
                    MOV   R_MOD, A
                    ACALL DL100             ;延时
                    DJNZ  R5, RING1          ;循环次数控制
            R_EXIT: SETB  BELL              ;关闭响铃
                    RET
                    NOP
		    			NOP
                    LJMP ERR                 ;软件陷阱
            ;
        ;**************
	    ;   显示程序  ;
        ;**************
	    	DISPLY: PUSH  ACC                   ;数据压栈保护
                PUSH  PSW
		    		MOV   PSW,    #10H         ;选用寄存器组2
                	MOV   R0,  DSPLYP          ;移入显示指针
		    		MOV   R2,  #0FDH           ;R2寄存的是数码管选通数
                	MOV   A,  PLYTS            ;移入显示循环控制量
	            	JNZ   PLAY                  ;不为0则转PLAY
		    		MOV   PLYTS,  #64H         ;否则从新赋值
		    		CPL   BRIGHT                ;亮灭指示位取反
	   PLAY:   DEC   PLYTS                  ;显示循环控制量减1
                	JNB   LPLMOD, PLAYL        ;低两位数码管不闪则"PLAYL"
		    		JB    BRIGHT, PLAYL         ;亮灭指示为1也"PLAYL"
		    		ACALL NOPLAY               ;否则灭灯延时
                	AJMP  PLAY1                ;转显示高位数码管
                	NOP
		    		NOP
                	LJMP ERR                    ;软件陷阱
	    ;用来显示低位
	  PLAYL:  ORL   P1,  #7FH            ;清原显示数据
               ORL   P3,  #3CH            ;清原选通数据
		    		MOV   A,   R2            ;移入数码管位选数
                	RL    A                   ;换一位
                	ANL   P3,  A              ;选通低位的个位数码管
                	MOV   R2,  A             ;暂存位选数
		    		MOV   A,  @R0           ;移入显示数值
		    		MOV   DPTR,  #TABLE1   ;移入表首地址
		    		MOVC  A,  @A+DPTR     ;查表
		    		ANL   P1,  A              ;送显示数据
		    		ACALL DL1MS             ;延时
		    		INC   R0                  ;指向低位的十位数
		    		JB    P3.3,  PLAYL         ;显示低位的十位数
            ;
	    	PLAY1:  JNB   HPLMOD, PLAYH      ;高两位数码管不闪则"PLAYH"
		    		JB    BRIGHT, PLAYH        ;亮灭指示为1也"PLAYH"
		    		ACALL NOPLAY              ;  否则灭灯延时
                	AJMP  OUTPLY              ;转结束
                	NOP
		    		NOP
                	LJMP ERR                    ;软件陷阱
;
	    ;用来显示高位
	    	PLAYH:  ORL   P1,  #7FH           ;清原显示数据
                	ORL   P3,  #3CH            ;清原选通数据
                	ANL   P3,  #0EFH           ;选通高位的个位数数码管
		    		MOV   A,  @R0             ;移入显示数值
		    		MOV   DPTR,  #TABLE1     ;移入表首地址
		    		MOVC  A,  @A+DPTR       ;查表
		    ANL   P1,  A                   ;送显示数据
		    ACALL DL1MS                  ;延时
		    INC   R0                       ;指向高位的十位数
            ;                               ;显示高位的十位数
            ORL   P1,  #7FH               ;清原显示数据
            ORL   P3,  #3CH               ;清原选通数据
		    ANL   P3,  #0DFH             ;选通高位的十位数
		    MOV   A,  @R0               ;移入显示数值
		    MOV	C,  LED4	           ;指针放大+小灯状态
		    RLC   A                       ;
		    MOV   DPTR,  #TABLE2       ;移入表首地址
		    MOVC  A,  @A+DPTR         ;查表
		    ANL   P1,  A                 ;送显示数据
		    ACALL DL1MS                ;延时
            ;
   OUTPLY: POP   PSW                   ;恢复数据
            POP   ACC
		    RET
            NOP
		    NOP
LJMP ERR                    ;软件陷阱
;
TABLE1: DB  0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH
	    ;   	  "0", "1",	...	...			                      "9",   "-", "F", " "
;
TABLE2: DB  0FFH, 0DFH, 0F9H, 0D9H, 0A4H,  84H, 0B0H,  90H, 0BFH, 09FH
	    ;	 "  ",  " :",   "1 ",  "1:",  "2 ",    "2:",  "3 ",  "3:",  "- ",  "-:"
        ;
    ;
		;
        ;**********************
        ;    无显示(灭灯)程序   ;
	    ;**********************
	    NOPLAY:   ORL   P1,  #7FH            ;清显示数据
                    ORL   P3,  #3CH           ;清选通数据
                    INC   R0                   ;指针自增2
                    INC   R0
		            ACALL DL1MS              ;延时
                    RET
                    NOP
		    			NOP
                    LJMP ERR                    ;软件陷阱
            ;
        ;******************
        ;     延时程序    ;
	    ;******************
	    DL1MS:  MOV   R3, #0F9H       ;延时 1250US  只为DISPLY所调用
	    DL1MS1: NOP
		        NOP
		        NOP
		        DJNZ  R3, DL1MS1
                RET
                NOP
		        NOP
                LJMP ERR              ;软件陷阱
	    ;
	    KEYDLY: CLR   BELL		  ; 按键消抖动专用延时程序,
		         ACALL DISPLY        ; 在消除抖动的同时发出按键提示音
		         SETB  BELL
		         RET
                 NOP
		         NOP
                 LJMP ERR             ;软件陷阱
	    ;
	    DL50MS: MOV	  R7, #0AH     ;50毫秒延时程序
	    DL50M1: ACALL DISPLY	       ; 每调用一次显示程序5MS
		    DJNZ  R7, DL50M1      ; 调用10次
	     	    RET
                NOP
		        NOP
                LJMP ERR              ;软件陷阱
	    ;
	    DL100:  ACALL DL50MS          ;延时100毫秒
		        ACALL DL50MS
		        RET
                NOP
		        NOP
                LJMP ERR               ;软件陷阱
	    ;
	    DL05S:  ACALL DL100           ; 延时0.5秒
		        ACALL DL100
		        ACALL DL100
		        ACALL DL100
                ACALL DL100
                RET
                NOP
		        NOP
                LJMP ERR              ;软件陷阱
	    ;
	DL1S:   ACALL DL05S              ;延时1秒
		    ACALL DL05S
            RET
            NOP
		    NOP
            LJMP ERR                 ;软件陷阱
            ;
            ;****************************
            ;     ERR(出错处理) 程序    ;
	        ;****************************
            ERR:    CLR   EA                    ;关中断
                    MOV   DPTR, #ERR1          ; 准备返回地址
                    PUSH  DPL                   ; 压栈
                    PUSH  DPH                   ;
                    RETI                         ;中断返回
            ERR1:   MOV   56H, #0AAH           ;建立上电标志(出错标志)
                    MOV   57H, #55H
                    MOV   A,  #00H             ; 准备返回地址
                    PUSH  A                     ; 压栈
                    PUSH  A
                    RETI                         ; 中断返回
                    NOP
		    			NOP
                    LJMP ERR                    ;软件陷阱
;
                    ORG  07FAH
                    NOP
		    		 	NOP
                    NOP
                    LJMP ERR                    ;软件陷阱
            ;
                    END                 		 ;程序结束

⌨️ 快捷键说明

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