📄 30.asm
字号:
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 + -