📄 skz.asm
字号:
MOV A,21H
ANL A,#3FH
CPL A
ANL A,#3FH
JZ E1
CLR C
MOV REALRUNNO,#00H
LOOP3:
RRC A
INC REALRUNNO
JNC LOOP3 ;计算工位号
SJMP E2
E1:
MOV REALRUNNO,#00H
E2:
;POP ACC
RET
;########################
INT2MS:
MOV TL0,#30H
MOV TH0,#0F8H
PUSH PSW
PUSH ACC
push p2
SETB PSW.3
MOV A,DISPBITS
ADD A,#30H; 30H--DISPBUFFER
MOV R0,A
MOV A,@R0
mov p2,a
setb p3.4
nop
clr p3.4
INC DISPBITS
MOV A,DISPBITS
clr c
subb a,#05h
JNC DISPEND
SJMP RETURN2MS
DISPEND:
MOV DISPBITS,#00H
CLR DISPFLAG
CLR TR0
RETURN2MS:
pop p2
POP ACC
POP PSW
RETI
;#################
KEYSCAN:
ORL P3,#0FH
MOV A,P3
ANL A,#0FH
;MOV 25H,A
;MOV A,25H ;取出本次所读键值
XRL A,#0FH ;低四位
JZ KEYUP ;没有按键转走
XRL A,#0FH
;恢复A中键值
;jnb acc.0,KEYIS1
;clr acc.0
CJNE A,25h,KEYne0 ;是否与上次读键相等,不等则转走
;时间设置键是否按下,按下则转走处理
jnb acc.0,KEYIS1 ;;;;;;
JNB K1FLAG,KEY1 ;时间设置键是否刚抬起
CLR K1FLAG ;清时间设置键按下标志
MOV FLASHCOUNT,#00H
SETB UPDATEDISPFLAG
MOV DISPNO,#01H
CLR INNORMALDISPFLAG ;清非正常标志
clr flashflag
key1: ;其余键判断
JNB ACC.1,KEYIS2
JNB ACC.2,KEYIS3
JNB ACC.3,KEYIS4
AJMP RETURNKEY
KEYne0:
ajmp KEYne
KEYIS1:
JB K1FLAG,KEY1 ;时间设置键(k1)已按下,则转其余键判断
MOV R7,#00H
CLR KEYCONCLICKFLAG
SETB INNORMALDISPFLAG
SETB K1FLAG
clr 23h.4
lcall output
aJMP KEYYEAR ;k1刚按下,则不再判断其余键--一次只处理一个按键
KEYIS2: ;手工步进键(k2)
MOV R7,#01H
CLR KEYCONCLICKFLAG
aJMP KEYYEAR
KEYIS3: ;设置时移位键(k3)
MOV R7,#02H
CLR KEYCONCLICKFLAG
aJMP KEYYEAR
KEYIS4: ;增一键
MOV R7,#03H
SETB KEYCONCLICKFLAG
KEYYEAR:
INC KEYLENGTH ;键年龄增1
JNB KEYRUNFLAG,KEYRUN ;是否已执行,没执行转执行
JNB KEYCONCLICKFLAG,RETURNKEY ;已执行,判断是否允许连击,不允许转退出
MOV A,KEYLENGTH
clr c
subb A,#19H ;允许连击,则判断键年龄(一秒击四次--250ms一次)是否到,不到转退出
jc returnkey
KEYRUN:
SETB KEYRUNFLAG ;设置运行标志
MOV KEYLENGTH,#00H ;键年龄清0
MOV DPTR,#KEYVALUERUN ;
MOV A,R7
RL A
JMP @A+DPTR
KEYVALUERUN:
AJMP K1
AJMP K2
AJMP K3
AJMP K4
KEYUP: ;按键全部抬起
JNB K1FLAG,KEYup1 ;时间设置键是否刚抬起
MOV A,SETTIMENO
RL A
DEC A
ORL A,#20H
MOV R0,A
MOV A,SETTIMEHOUR
MOVX @R0,A
INC R0
MOV A,SETTIMEMINATE
MOVX @R0,A
CLR K1FLAG ;清时间设置键按下标志
MOV FLASHCOUNT,#00H
SETB UPDATEDISPFLAG
MOV DISPNO,#01H
CLR INNORMALDISPFLAG ;清非正常标志
clr flashflag
keyup1:
MOV A,#0FH ;恢复本次读键值
KEYNE: ;相临两次读键值不等,即没有按键
MOV KEYLENGTH,#00H ;键年龄清零
CLR KEYRUNFLAG ;清已运行标志
MOV 25h,A ;保存本次按键值
RETURNKEY:
RET
;##################
K1:
MOV SETTIMENO,#01h ;当前运行号作为当前设置号
MOV A,SETTIMENO
RL A ;
DEC A ;
ORL A,#20H ;计算时钟芯片内地址--(当前设置号*2-1)+20H
MOV R0,A
MOVX A,@R0 ;取出原设置时间--小时
MOV SETTIMEHOUR,A ;放入SETTIMEHOUR
INC R0
MOVX A,@R0 ;取出原设置时间--分钟
MOV SETTIMEMINATE,A ;放入SETTIMEMINATE
MOV A,SETTIMEHOUR ;
SWAP A ;
ANL A,#0FH ;取小时的十位
MOV TEMPKEY,A ;放入调整区
MOV DISPNO,#02H ;设置显示号
MOV LOOPNO,#00H ;设置位置号为0
MOV FLASHPOS,#30H ;闪烁位对应显缓30H
SETB UPDATEDISPFLAG ;设置更新显缓标志
SETB FLASHFLAG ;设置闪烁标志
LJMP RETURNKEY
;##########################
K2:
JB K2FLAG,K20 ;
SETB K2FLAG ;如第一次按下k2,则设置按下标志
K20:
JB K1FLAG,K2SETTIME ;如k1按下,则转时间设置处理
jnb runstatusflag,r1
jb faoffflag,r1
clr madarunflag
SETB FAOFFFLAG ;如k1未按下,则按手工步进处理--关闭阀
MOV FAOFFTIME,#00H
clr 23H.0
clr 23h.1
clr 23h.2
clr 23h.3
lcall output ;输出控制
MOV RUNHOUR,#00H
MOV RUNMINATE,#00H
MOV A,#00H
MOV R0,#40H
MOVX @R0,A ;
MOV A,#00H
inc r0
MOVX @R0,A ;剩余时间清0,并记录;
MOV a,RUNNO
inc r0
MOVX @R0,A
SETB UPDATEDISPFLAG
MOV DISPNO,#01H ;设置显示号;
r1:
LJMP RETURNKEY
K2SETTIME:
MOV A,SETTIMENO
RL A
DEC A
ORL A,#20H
MOV R0,A
MOV A,SETTIMEHOUR
MOVX @R0,A
INC R0
MOV A,SETTIMEMINATE
MOVX @R0,A
INC SETTIMENO
MOV A,SETTIMENO
clr c
subb a,#07h
Jc READTIME
MOV SETTIMENO,#01H
READTIME:
MOV A,SETTIMENO
RL A
DEC A
ORL A,#20H
MOV R0,A
MOVX A,@R0
MOV SETTIMEHOUR,a
INC R0
MOVX A,@R0
MOV SETTIMEMINATE,a
MOV A,SETTIMEHOUR
SWAP A
ANL A,#0FH
MOV TEMPKEY,A
MOV DISPNO,#02H
MOV LOOPNO,#00H
MOV FLASHPOS,#30H
SETB UPDATEDISPFLAG
SETB FLASHFLAG
LJMP RETURNKEY
;###########################
K3:
jb k1flag,k30
ljmp returnkey
k30:
INC LOOPNO
MOV A,LOOPNO
clr c
subb a,#04h
Jc K31
MOV LOOPNO,#00H
K31:
MOV A,LOOPNO
RL A
MOV DPTR,#K32
JMP @A+DPTR
K32:
AJMP POS1
AJMP POS2
AJMP POS3
AJMP POS4
RETURNK3:
JB K3FLAG,K33
SETB K3FLAG
K33:
SETB FLASHFLAG
SETB UPDATEDISPFLAG
MOV DISPNO,#02H ;设置显示号
LJMP RETURNKEY
;#################
POS1:
MOV A,SETTIMEMINATE
aNL A,#0F0H
ORL A,TEMPKEY
MOV SETTIMEMINATE,A
MOV A,SETTIMEHOUR
ANL A,#0F0H
SWAP A
MOV TEMPKEY,A
MOV FLASHPOS,#30H
LJMP RETURNK3
POS2:
MOV A,SETTIMEHOUR
ANL A,#0FH
SWAP A
ORL A,TEMPKEY
SWAP A
MOV SETTIMEHOUR,A
MOV A,SETTIMEHOUR
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#31H
LJMP RETURNK3
POS3:
MOV A,SETTIMEHOUR
aNL A,#0F0H
oRL A,TEMPKEY
MOV SETTIMEHOUR,A
MOV A,SETTIMEMINATE
ANL A,#0F0H
SWAP A
MOV TEMPKEY,A
MOV FLASHPOS,#32H
LJMP RETURNK3
POS4:
MOV A,SETTIMEMINATE
ANL A,#0FH
SWAP A
ORL A,TEMPKEY
SWAP A
MOV SETTIMEMINATE,A
MOV A,SETTIMEMINATE
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#33H
LJMP RETURNK3
;#################
K4:
jnb k1flag,returnk4
SETB UPDATEDISPFLAG
SETB FLASHFLAG
INC TEMPKEY
mov a,loopno
cjne a,#02h,k40
clr c
mov a,tempkey
subb a,#06h
jc returnk4
mov tempkey,#00h
sjmp returnk4
k40:
clr c
mov a,tempkey
SUBB A,#0AH
JC RETURNK4
MOV TEMPKEY,#00H
RETURNK4:
mov a,loopno
cjne a,#00h,l1
mov a,settimehour
anl a,#0fh
swap a
orl a,tempkey
swap a
mov settimehour,a
sjmp returnk41
l1:
cjne a,#01h,l2
mov a,settimehour
anl a,#0f0h
;swap a
orl a,tempkey
;swap a
mov settimehour,a
sjmp returnk41
l2:
cjne a,#02h,l3
mov a,settimeminate
anl a,#0fh
swap a
orl a,tempkey
swap a
mov settimeminate,a
sjmp returnk41
l3:
mov a,settimeminate
anl a,#0f0h
orl a,tempkey
mov settimeminate,a
returnk41:
LJMP RETURNKEY
;######################
UPDATEDISPBUFFER:
JNB UPDATEDISPFLAG,LJ
MOV A,DISPNO
DISPNO0:
CJNE A,#00H,DISPNO1
MOV 30H,#09H
MOV 31H,#19H
MOV 32H,#29H
MOV 33H,#39H
MOV 34H,#49H
LJ:
LJMP FLASH
DISPNO1:
CJNE A,#01H,DISPNO2
MOV A,RUNHOUR
ANL A,#0F0H
SWAP A
ORL A,#00H
MOV 30H,A
MOV A,RUNHOUR
ANL A,#0FH
ORL A,#10H
MOV 31H,A
MOV A,RUNMINATE
ANL A,#0F0H
SWAP A
ORL A,#20H
MOV 32H,A
MOV A,RUNMINATE
ANL A,#0FH
ORL A,#30H
MOV 33H,A
MOV A,RUNNO
ORL A,#40H
MOV 34H,A
LJMP FLASH
DISPNO2:
CJNE A,#02H,FLASH
MOV A,SETTIMEHOUR
ANL A,#0F0H
SWAP A
ORL A,#00H
MOV 30H,A
MOV A,SETTIMEHOUR
ANL A,#0FH
ORL A,#10H
MOV 31H,A
MOV A,SETTIMEMINATE
ANL A,#0F0H
SWAP A
ORL A,#20H
MOV 32H,A
MOV A,SETTIMEMINATE
ANL A,#0FH
ORL A,#30H
MOV 33H,A
MOV A,SETTIMENO
ORL A,#40H
MOV 34H,A
FLASH:
CLR UPDATEDISPFLAG
JB INNORMALDISPFLAG,D1
jnb runstatusflag,d0
clr flashflag
INC FLASHCOUNT
MOV A,FLASHCOUNT
clr c
subb A,#32H
Jc RETURNUPDATE
CPL 23h.4
lcall output
MOV FLASHCOUNT,#00H
SJMP RETURNUPDATE
d0:
clr 23h.4
lcall output
SJMP RETURNUPDATE
D1:
;JNB FLASHFLAG,RETURNUPDATE
INC FLASHCOUNT
MOV A,FLASHCOUNT
clr c
subb A,#19H
Jc d2
CPL BLACKFLAG
MOV FLASHCOUNT,#00H
d2:
MOV R0,FLASHPOS
MOV A,FLASHPOS
ANL A,#0FH
SWAP A
JB BLACKFLAG,BLACK
ORL A,TEMPKEY
SJMP SETFLASH
BLACK:
ORL A,#0FH
SETFLASH:
MOV @R0,A
RETURNUPDATE:
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -