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

📄 13.asm

📁 单片机实验程序-13种-17.4M-pdf.zip
💻 ASM
📖 第 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 + -