📄 5路倒计时器源码.txt
字号:
; 5路孤立控制倒计时器源代码 fosc=12MHz
; 健盘接线: K1--P2.0 K2--P2.1 K3--P2.2
; 5路孤立控制输出 P3.0 P3.1 P3.2 P3.3 P3.4 ; L有效
; P1 HS162-4 数据口8位
; -----定义声明---HS162-4---------------------------
RS EQU P3.7 ;H数 L指
RW EQU P3.6 ;H读 L写
E EQU P3.5 ;片选(H-L)
DAT EQU 3CH ;命令单元
DNA EQU 3DH ;每行显X个字符
DDV EQU 3EH ;数据单元
;--------------------------------------------
SWE EQU 30H ;当前路数弟1......5
MVB EQU 31H ;当前路状态0FFH-->ON
SVVA EQU 32H ;当前时单元
SVVB EQU 33H ;当前分单元
SVVC EQU 34H ;当前秒单元
;-----------3秒T1中断------------------------
SOV EQU 35H ;计数器单元T1
BBS EQU 36H ;计秒单元T1
;-----------100小时T0中断------------------------
MDA EQU 37H ;计数器单元T0
SBB EQU 38H ;计秒单元T0
SZE EQU 39H ;计分单元T0
DSA EQU 3AH ;计时单元T0
N100 BIT 00H, ;计满100小时标志
OPEN BIT 01H ;总开关
;------------输出标志------------------------
RVB BIT 02H ;弟1路输出标志
RVC BIT 03H ;弟2路输出标志
RVD BIT 04H ;弟3路输出标志
RVE BIT 05H ;弟4路输出标志
RVF BIT 06H ;弟5路输出标志
;---------------------------------------
START EQU 3BH ;首址单元
SWE EQU 28H ;路数单元
HH EQU 29H ;倒时值单元
SHH EQU 2AH ;时关闭值单元
MM EQU 2BH ;倒分值单元
SMM EQU 2CH ;分关闭值单元
SS EQU 2DH ;倒秒值单元
SSS EQU 2EH ;秒关闭值单元
MVB EQU 2FH ;开关状态单元
;--------当前路数.时间值格式.状态 8字节-------------------
; 28H 29H 2AH 2BH 2CH 2DH 2EH 2FH
; SWE ; HH SHH ; MM SMM ; SS SSS ; MVB
; 路数 ; 倒时值 关闭值; 倒分值 关闭值; 倒秒值 关闭值; 状态
;---------------------------------------------------------
ORG 00H
AJMP FDSA ;主程序
ORG 03H
LJMP INT0 ;计时0-100小时中断
ORG 13H
LJMP INT1 ;3秒中断
ORG 30H
;***********上电显示*********************************
FDSA: MOV P3, #1FH ;关闭P3输出
ACALL DISY0 ;显示POWER.TIME 13650961725
ACALL DNAK ;调3秒计时程序
JNB F0, $ ;等待3秒
CLR TR1 ;停止计时
;------主程序----初始------------------------------
FDD: MOV P1, #0FFH ;关闭P1
MOV 20H, #0 ;清所有标志
MOV R0, #28H
MOV R2, #64 ;共有64个单元
CLR A
MOV @R0, A ;清0
INC R0
DJNZ R2, PDF
MOV SWE, #1 ;上电默认显弟1路状态
MOV SP, #71H
MOV START, #40H;设5路时间值首址
;------------初始HS-162-4--------------------------
MOV DAT, #01H ;清屏 <1>
ACALL ENABLE ;写指令
MOV DAT, #38H ;8位2行5x7点阵 <2>
ACALL ENABLE ;写指令
MOV DAT, #0FH ;显示器开、光标开、闪烁开 <3>
ACALL ENABLE ;写指令
MOV DAT, #06H ;文字不动,光标自动右移 <4>
ACALL ENABLE ;写指令
;------------进入功能健--------------------------------------
BXC: ACALL BGRD ;显当前路数.时间值格式.状态
KMK: ACALL KEY ;调扫描健盘
JZ KMK ;无健按下
ACALL SD12M ;延时12MS
ACALL KEY ;调扫描健盘
JZ KMK
;---------K1健选择路数----------------
GKY: CJNE A, #1, AD2;不是按下K1健
XCZ: ACALL KEY ;调扫描健盘
JB ACC.1 XCZ ;等健弹起
INC SWE ;当前路加1
MOV A, SWE
CJNE A, #6,$+3
JC DAE ;1-5路范围
MOV SWE, #1
DAE: SJMP BXC ;刷新路数.时间值.状态
;----------K2健进入当前路设置---------------
AD2: CJNE A, #2, AD3;不是按下K2健
XCM: ACALL KEY ;调扫描健盘
JB ACC.2, XCM ;等健弹起
DAB: AJMP SDKC ;进入当前路设置
;-------K3健长按3秒?-----------------------
AD3: ACALL DNAK ;调计时程序
AMB: ACALL KEY ;调扫描健盘
JB ACC.3, AMB ;等K3健弹起
JB F0, VGF ;弹起,己按下了3秒
CLR TR1 ;弹起,末够3秒停止计时
SJMP MMK ;再查K1健
VGF: ACALL XXSD ;显示:【OFF POWER.TIME】
ACALL DNAK ;调3秒计时程序
JNB F0, $ ;等待3秒
MOV PCON, #06H ;进入掉电摸式GF0=1
;--------再按K1-K3执行倒计时----------------------
MMK: CJNE A, #1, BXC;不是按下K1-K3健
CJNE A, #3, BXC;返刷新路数.时间值.状态
CGA: ACALL KEY
JB ACC.1, CGA ;等K1健弹起
JB ACC.3 CGA ;等K3健弹起
PPA: ACALL STON ;显示【ON POWER.TIME】
SETB OPEN ;开总开关--执行倒计时
ACALL DNBK ;启动T0
;*********进入倒计时扫描****************************
;--------------弟1路------------------
BHM: JNB OPEN, BXC ;总开关未开
MOV R0,START+7H;弟1路状态
MOV A, @R0 ;取状态
CJNE A,#0FFH,TO2T;弟1路未开查弟2路
JB RVB, KKI ;己输出.查关闭值
MOV R0,START+1H;弟1路指针
MOV A, @R0 ;取倒时值
CJNE A,DSA,CKG ;时不相等
INC R0
INC R0 ;指向倒分值
MOV A, @R0
CJNE A,SZE,CKG ;分不相等
INC R0
INC R0 ;指向倒秒值
MOV A, @R0
CJNE A,SBB,CKG ;秒不相等
SETB RVB ;输出标志
CLR P3.0 ;时分秒都相等输出...
SJMP TO2T ;查弟2路
CKG: CLR RVB
SETB P3.0 ;关闭弟1路
SJMP TO2T ;查弟2路
;-----------查关闭值-----------------------
KKI: MOV R0,START+2H;指向关闭值
MOV A, @R0 ;取关闭值
CJNE A,DSA,TO2T ;时不相等
INC R0
INC R0
MOV A,SZE,TO2T ;分不相等
INC R0
INC R0
MOV A,SBB,TO2T ;秒不相等
CLR RVB ;时分秒都相等
SETB P3.0 ;关闭弟1路
;------------弟2路-------------------------
TO2T: MOV R0,START+0FH;弟2路状态
MOV A, @R0 ;取状态
CJNE A,#0FFH,KTRO;弟2路未开查弟3路
JB RVC, KKA ;己输出.查关闭值
MOV R0,START+9H;指弟2路倒时值
MOV A, @R0 ;取倒时值
CJNE A, DSA,XLE ;时不相等
INC R0
INC R0
MOV A, @R0 ;指向倒分值
CJNE A, SZE,XLE ;分不相等
INC R0
INC R0
MOV A, @R0 ;指向倒秒值
CJNE A, SBB,XLE
SETB RVC ;输出标志
CLR P3.1 ;时分秒都相等输出...
SJMP KTRO ;查弟3路
XLE: CLR RVC
SETB P3.1 ;关闭弟2路
SJMP KTRO ;查弟3路
;-----------查关闭值-----------------------
KKA: MOV R0,START+OAH;指向关闭值
MOV A, @R0
CJNE A,DSA,KTRO ;时不相等
INC R0
INC R0
MOV A, @R0
CJNE A,SZE,KTRO ;分不相等
INC R0
INC R0
MOV A, @R0
CJNE A,SBB,KTRO ;秒不相等
CLR RVC ;时分秒都相等
SETB P3.1 ;关闭弟2路
;-------------弟3路------------------------
KTRO: MOV R0,START+17H;弟3路状态
MOV A, @R0 ;取状态
CJNE A,#0FFH,CDFR;弟3路未开查弟4路
JB RVD, KKB ;己输出.查关闭值
MOV R0,START+11H;指弟3路
MOV A, @R0 ;取倒时值
CJNE A,DSA,JJJ ;时不相等
INC R0
INC R0
MOV A, @R0 ;指向倒分值
CJNE A,SZE,JJJ ;分不相等
INC R0
INC R0
MOV A, @R0 ;指向倒秒值
CJNE A,SBB,JJJ
SETB RVD ;输出标志
CLR P3.2 ;时分秒都相等输出...
SJMP CDFR ;查弟4路
JJJ: CLR RVD
SETB P3.2 ;关闭弟3路
SJMP CDRF ;查弟4路
;------------查关闭值----------------------
KKB: MOV R0,START+12H;指向关闭值
MOV A, @R0
CJNE A,DSA,CDFR ;时不相等
INC R0
INC R0
MOV A, @R0
CJNE A,SZE,CDRF ;分不相等
INC R0
INC R0
MOV A, @R0
CJNE A,SBB,CDRF ;秒不相等
CLR RVD ;时分秒都相等
SETB P3.2 ;关闭弟3路
;------------弟4路-------------------------
CDFR: MOV R0,START+1FH;弟4路状态
MOV A, @R0 ;取状态
CJNE A,#0FFH,PPWW;弟4路未开查弟5路
JB RVE, KKC ;己输出.查关闭值
MOV R0,START+19H;指弟4路倒时值
MOV A, @R0 ;取倒时值
CJNE A,DSA,MPKS ;时不相等
INC R0
INC R0
MOV A, @R0
CJNE A,SZE,MPKS ;分不相等
INC R0
INC R0
MOV A, @R0
CJNE A,SBB,MPKS ;秒不相等
SETB RVE ;输出标志
CLR P3.3 ;时分秒都相等输出...
SJMP PPWW ;查弟5路
MPKS: CLR RVE
SETB P3.3 ;关闭弟4路
SJMP PPWW ;查弟5路
;------------查关闭值----------------------
KKC: MOV R0,START+1AH;指向关闭值
MOV A, @R0
CJNE A,DSA,PPWW ;时不相等
INC R0
INC R0
MOV A, @R0
CJNE A,SZE,PPWW ;分不相等
INC R0
INC R0
MOV A, @R0
CJNE A,SBB,PPWW ;秒不相等
CLR RVE ;时分秒都相等
SETB P3.3 ;关闭弟4路
;------------弟5路-------------------------
PPWW: MOV R0,START+27H;弟5路状态
MOV A, @R0 ;取状态
CJNE A,#0FFH,OKOK;弟5路未开查K2健
JB RVF, KKD ;己输出.查关闭值
MOV R0,START+21H;指弟5路倒时值
MOV A, @R0 ;取倒时值
CJNE A,DSA,GGDS ;时不相等
INC R0
INC R0
MOV A, @R0
CJNE A,SZE,GGDS ;分不相等
INC R0
INC R0
MOV A, @R0
CJNE A,SBB,GGDS ;秒不相等
SETB RVF ;输出标志
CLR P3.4 ;时分秒都相等输出...
SJMP OKOK ;查誓停健K2
GGDS: CLR RVF
SETB P3.4 ;关闭弟5路
SJMP OKOK ;查誓停健K2
;-------------查关闭值-----------------------
KKD: MOV R0,START+22H;指向关闭值
MOV A, @R0
CJNE A,DSA,OKOK ;时不相等
INC R0
INC R0
MOV A, @R0
CJNE A,SZE,OKOK ;分不相等
INC R0
INC R0
MOV A, @R0
CJNE A,SBB,OKOK ;秒不相等
CLR RVF ;时分秒都相等
SETB P3.4 ;关闭弟5路
;---------停止计时K2健--------------------------
OKOK: JB N100, FDD ;到100小时返主程序
ACALL KEY
JZ BHM ;循环检查倒计时
ACALL SD12M ;延时12MS
HVY: ACALL KEY
JZ BHM ;循环检查倒计时
CJNE A,#2,BHM ;不是按K2健循环检查倒计时
JB ACC.2, HVY ;等K2健弹起
CLR EA ;关中断停止计时
CLR TR0 ;停止T0
CLR OPEN ;关总开关
LJMP BXC ;返回主程序
;***********进入相应路设置************************
SDKC: ACALL BBGG ;HH反白显示
ACALL BGRD ;显当前路数.时间值格式.状态
CKD: ACALL KEY ;调扫描健盘
JZ CKD
ACALL SD12M ;延时12MS
ACALL KEY ;调扫描健盘
JZ CKD
;-------判是K1健?---------------------按下健
AAW: CJNE A, #1,HJL ;不是按下K1健
XZZ: ACALL KEY ;调扫描健盘
JB ACC.1 XZZ ;等健弹起
MOV A, HH
INC A ;当前时单元加1
DA A ;BCD调整
MOV HH, A
CJNE A,#50,$+3 ;由0-50小时内设置
JC BMD
MOV HH, #00
BMD: SJMP SDKC ;刷新显示.扫描健盘
;--------判是K2健?-------------------------
HJL: CJNE A, #2,XSC ;不是按下K2健
TTC: ACALL KEY ;调扫描健盘
JB ACC.2, TTC ;等健弹起
MOV A, HH
ADD A, #99H ;当前时单元减1
DA A ;BCD调整
MOV HH, A
CJNE A, #0,FEX
MOV HH, #50 ;由0-50小时内设置
FEX: SJMP SDKC ;刷新显示.扫描健盘
;------------K3健---------------------
XSC: ACALL KEY ;调扫描健盘
JB ACC.3, XSC ;等K3健弹起
;-------------------------------------------
GGBB: ACALL GGBB ;SHH时反白显示
ACALL BGRD ;显当前路数.时间值格式.状态
CCD: ACALL KEY ;调扫描健盘
JZ CCD
ACALL SD12M ;延时12MS
ACALL KEY ;调扫描健盘
JZ CCD
;-----------判是K1健?-------------------------
MADC: CJNE A, #1, KPR;不是按下K1健
CTY: ACALL KEY
JB ACC.1, CTY ;等健弹起
MOV A, SHH
INC A ;单元加1
DA A ;BCD调整
MOV SHH, A
CJNE A,#50,$+3
JC HBN
MOV SHH, #0
HBN: SJMP GGBB ;刷新显示.扫描健盘
;-----------判是K2健?---------------------------
VBU: CJNE A, #2, UWQ;不是按下K2健
LLL: ACALL KEY
JZ LLL ;等健弹起
MOV A, SHH
ADD A, #99H ;单元减1
DA A ;BCD调整
MOV SHH, A
CJNE A, #0, LFG
MOV SHH, #50
LFG: SJMP GGBB ;刷新显示.扫描健盘
;--------------K3-----------------------------
BSA: ACALL KEY
JB ACC.3, BSA ;等健弹起
;-------------------------------------------------
OON: ACALL BBVV ;MM分钟反白显示
ACALL BGRD ;显当前路数.时间值格式.状态
NOB: ACALL KEY ;调扫描健盘
JZ NOB
ACALL SD12M ;延时12MS
ACALL KEY ;调扫描健盘
JZ NOB ;返扫描健盘
;-----------判是K1健?--------------按下健
CJNE A, #1,AAA ;不是按下K1健
SSS: ACALL KEY ;调扫描健盘
JB ACC.1, SSS ;等健弹起
MOV A, MM
INC A ;当前分单元加1
DA A ;BCD调整
MOV MM, A
CJNE A,#60,$+3 ;分钟由0-60
JC BBG
MOV MM, #0
BBG: SJMP OON ;刷新显示.扫描健盘
;-------------判是K2健?----------------
AAA: CJNE A, #2,VVV ;不是按下K2健
XCC: ACALL KEY ;调扫描健盘
JB ACC.2, XCC ;等健弹起
MOV A, MM
ADD A, #99H ;分减1
DA A ;BCD调整
MOV MM, A
CJNE A,#0,OKI ;分钟由0-60
MOV MM,#60
OKI: SJMP OON ;刷新显示.扫描健盘
;--------------K3健--------------------
VVV: ACALL KEY ;调扫描健盘
JB ACC.3, VVV ;等K3健弹起
;-----------SMM-------------------------------
BBT: ACALL VVBB ;SMM分反白显示
ACALL BGRD ;显当前路数.时间值格式.状态
DDJ: ACALL KEY
JZ DDJ
ACALL SD12M
ACALL KEY
JZ DDJ
;---------判是K1健?-----------------------
CJNE A, #1, XXX;不是按下K1健
ULK: ACALL KEY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -