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

📄 30.asm

📁 多功能倒计时
💻 ASM
📖 第 1 页 / 共 2 页
字号:
MOV HL,#00H 
MOV HH,#00H 
NEXT1: MOV R2,#00H ; R2用于判断按键时间是否超过0.5秒 
NEXT2: ACALL ADDONE ; 调用加1程序 
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 P0,#7FH ; 清原显示数据 
ORL P2,#3CH ; 清原选通数据 
MOV A,R2 ; 移入数码管位选数 
RL A ; 换一位 
ANL P2,A ; 选通低位的个位数码管 
MOV R2,A ; 暂存位选数 
MOV A,@R0 ; 移入显示数值 
MOV DPTR,#TABLE1 ; 移入表首地址 
MOVC A,@A+DPTR ; 查表 
ANL P0,A ; 送显示数据 
ACALL DL1MS ; 延时 
INC R0 ; 指向低位的十位数 
JB P2.3,PLAYL ; 显示低位的十位数 
; 
PLAY1: JNB HPLMOD,PLAYH ; 高两位数码管不闪则"PLAYH" 
JB BRIGHT,PLAYH ; 亮灭指示为1也"PLAYH" 
ACALL NOPLAY ; 否则灭灯延时 
AJMP OUTPLY ; 转结束 
NOP 
NOP 
LJMP ERR ; 软件陷阱 
; 
;用来显示高位 
PLAYH: ORL P0,#7FH ; 清原显示数据 
ORL P2,#3CH ; 清原选通数据 
ANL P2,#0EFH ; 选通高位的个位数数码管 
MOV A,@R0 ; 移入显示数值 
MOV DPTR,#TABLE1 ; 移入表首地址 
MOVC A,@A+DPTR ; 查表 
ANL P0,A ; 送显示数据 
ACALL DL1MS ; 延时 
INC R0 ; 指向高位的十位数 
; ; 显示高位的十位数 
ORL P0,#7FH ; 清原显示数据 
ORL P2,#3CH ; 清原选通数据 
ANL P2,#0DFH ; 选通高位的十位数 
MOV A,@R0 ; 移入显示数值 
MOV C,LED4 ; 指针放大+小灯状态 
RLC A ; 
MOV DPTR,#TABLE2 ; 移入表首地址 
MOVC A,@A+DPTR ; 查表 
ANL P0,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", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " " 
; 
TABLE2: DB 0FFH, 0DFH, 0F9H, 0D9H, 0A4H, 84H, 0B0H, 90H, 0BFH, 09FH 
; " ", " :", "1 ", "1:", "2 ", "2:", "3 ", "3:", "- ", "-:" 
; 
; 
; 
;********************** 
; 无显示(灭灯)程序 ; 
;********************** 
NOPLAY: ORL P0,#7FH ; 清显示数据 
ORL P2,#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 ACC ; 压栈 
PUSH ACC 
RETI ; 中断返回 
NOP 
NOP 
LJMP ERR ; 软件陷阱 
; 
ORG 07FAH 
NOP 
NOP 
NOP 
LJMP ERR ; 软件陷阱 

END ; 程序结束

⌨️ 快捷键说明

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