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