📄 clock.asm
字号:
;#################
DISPBUFFER DATA 30H
TEMPKey DATA 3DH
FLASHPOS DATA 3EH
RAMPOS DATA 3FH
DISPBITS DATA 40H
MAX DATA 41H
;SCOUNT1 DATA 42H
;SCOUNT2 DATA 43H
FLASHCOUNT DATA 44H
DISPNO DATA 45H
;FUNNO DATA 46H
KEYOLD DATA 47H
KEYLENGTH DATA 48H
LOOPNO DATA 4BH
;##################
;MAX1FLAG BIT 23H.0
;MAX2FLAG BIT 23H.1
;MAX3FLAG BIT 23H.2
;MAX5FLAG BIT 23H.3
;MAX7FLAG BIT 23H.4
;MAX9FLAG BIT 23H.5
;PORT0FLAG BIT 24H.0
;PORT1FLAG BIT 24H.1
;PORT2FLAG BIT 24H.2
DISPFLAG BIT 25H.0
;DISPDATEFLAG BIT 25H.1
UPDATEDISPFLAG BIT 25H.2
INNORMalDISPFLAG BIT 25H.3
KEYRUNFLAG BIT 25H.4
KEYCONCLICKFLAG BIT 25H.5
FLASHFLAG BIT 25H.6
;WRDATEFLAG BIT 26H.0
;WRCLOCKFLAG BIT 26H.1
;HIGHFLAG BIT 26H.2
BLACKFLAG BIT 26H.3
K1FLAG BIT 26H.4
;K3FLAG BIT 26H.5
;K4FLAG BIT 26H.6
;K3DOWNFLAG BIT 26H.7
;################
ORG 0000H
AJMP INIT
ORG 000BH
AJMP INT1MS
ORG 001BH
AJMP INT15MS
;###################
ORG 0050H
INIT:
MOV TMOD,#11H
MOV TL1,#20H
MOV TH1,#0d1H
MOV IE,#0AH
MOV IP,#02H
MOV SP,#5FH
MOV R7,#48H
MOV R0,#18H
INITRAM:
MOV @R0,#00H
INC R0
DJNZ R7,INITRAM
;--------------------------
MOV R0,#0AH
MOVX A,@R0
MOV R1,A
ANL A,#70H
XRL A,#20H
JZ START1
MOV A,R1
CLR ACC.4
SETB ACC.5
CLR ACC.6
MOVX @R0,A
MOV R0,#0BH
MOV A,#02H
MOVX @R0,A
MOV R0,#01H
MOV A,#00H
MOVX @R0,A
MOV R0,#03H
MOV A,#0ffH
MOVX @R0,A
MOV R0,#05H
MOVX @R0,A
;---------------------
START1:
SETB TR1
SETB EA
WAITINT:
SJMP WAITINT
;####################
INT15MS:
MOV TL1,#20H
MOV TH1,#0d1H
MOV TL0,#0ffH
MOV TH0,#0FfH
SETB DISPFLAG
;mov dispbits,#00h
SETB TR0
jb INNORMALDISPFLAG,readkey
MOV R0,#0CH
MOVX A,@R0
MOV 20H,A
JNB 20H.4,READKEY ;20H.4--SECONDUPDATEFLAG
LCALL RDCLOCKDATE
setb updatedispflag
;mov dispno,#01h
READKEY:
LCALL KEYSCAN
WAITINT1MS:
JB DISPFLAG,WAITINT1MS
LCALL UPDATEDISPBUFFER
RETI
;###################
INT1MS:
MOV TL0,#18H
MOV TH0,#0FCH
PUSH PSW
PUSH ACC
SETB PSW.3
MOV A,DISPBITS
ADD A,#30H; 30H--DISPBUFFER
MOV R0,A
MOV P2,@R0
INC DISPBITS
MOV A,DISPBITS
XRL A,#0bH
JZ DISPEND
SJMP RETURN1MS
DISPEND:
MOV DISPBITS,#00H
CLR DISPFLAG
CLR TR0
RETURN1MS:
POP ACC
POP PSW
RETI
;################
RDCLOCKDATE:
MOV R0,#0BH
MOVX A,@R0
SETB ACC.7
MOVX @R0,A
MOV R0,#00H
MOVX A,@R0
MOV R1,#18H
MOV @R1,A
MOV R0,#02H
MOVX A,@R0
INC R1
MOV @R1,A
MOV R0,#04H
MOVX A,@R0
INC R1
MOV @R1,A
MOV R6,#03H
INC R0
RDDATE:
INC R0
INC R1
MOVX A,@R0
MOV @R1,A
DJNZ R6,RDDATE
MOV R0,#0BH
MOVX A,@R0
CLR ACC.7
MOVX @R0,A
RET
;################
WRCLOCKDATE:
CLR EA
MOV R0,#0BH
MOVX A,@R0
SETB ACC.7
MOVX @R0,A
WRCLOCK:
MOV R1,#18H
MOV R0,#00H
MOV A,@R1
MOVX @R0,A
MOV R0,#02H
INC R1
MOV A,@R1
MOVX @R0,A
MOV R0,#04H
INC R1
MOV A,@R1
MOVX @R0,A
WRDATE:
MOV R6,#03H
MOV R1,#1BH
MOV R0,#06H
REWRDATE:
MOV A,@R1
MOVX @R0,A
INC R0
INC R1
DJNZ R6,REWRDATE
RETURNWR:
MOV R0,#0BH
MOVX A,@R0
CLR ACC.7
MOVX @R0,A
SETB EA
RET
;################
;---------------------------------------------
KEYSCAN:
ORL P1,#07H
MOV A,P1
ANL A,#07H
XRL A,#07H ;低3位
JZ KEYUP ;没有按键转走
XRL A,#07H
CJNE A,keyold,KEYne ;是否与上次读键相等,不等则转走
jnb acc.0,KEYIS1
JNB ACC.1,KEYIS2
JNB ACC.2,KEYIS3
AJMP RETURNKEY
KEYIS1: ;设置键
MOV R7,#00H
CLR KEYCONCLICKFLAG
aJMP KEYYEAR
KEYIS2: ;移位键(k2)
MOV R7,#01H
CLR KEYCONCLICKFLAG
aJMP KEYYEAR
KEYIS3: ;增一键,允许连击
MOV R7,#02H
SETB KEYCONCLICKFLAG
KEYYEAR:
INC KEYLENGTH ;键年龄增1
JNB KEYRUNFLAG,KEYRUN ;是否已执行,没执行转执行
JNB KEYCONCLICKFLAG,RETURNKEY ;已执行,判断是否允许连击,不允许转退出
MOV A,KEYLENGTH ;允许连击,则判断键年龄是否到
clr c
subb A,#15H ;允许连击,则判断键年龄(一秒击四次--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
KEYUP: ;按键全部抬起
MOV A,#07H ;恢复本次读键值
KEYNE: ;相临两次读键值不等,即没有按键
MOV KEYLENGTH,#00H ;键年龄清零
CLR KEYRUNFLAG ;清已运行标志
MOV keyold,A ;保存本次按键值
RETURNKEY:
RET
;##################
K1:
cpl k1flag
jnb k1flag,k1up
MOV A,1dh
SWAP A ;
ANL A,#0FH ;取月的十位
MOV TEMPKEY,A ;放入调整区
;MOV DISPNO,#02H ;设置显示号
MOV LOOPNO,#00H ;设置位置号为0
MOV FLASHPOS,#30H ;闪烁位对应显缓30H
mov max,#02h
setb innormaldispflag
clr UPDATEDISPFLAG ;清更新显缓标志
SETB FLASHFLAG ;设置闪烁标志
MOV FLASHCOUNT,#00H
LJMP RETURNKEY
k1up:
SETB UPDATEDISPFLAG
MOV DISPNO,#01H
CLR INNORMALDISPFLAG ;清非正常标志
clr flashflag
lcall movekey
lcall wrclockdate
LJMP RETURNKEY
;###########################
K2:
jb k1flag,k20
ljmp returnkey
k20:
lcall movekey
;JB K2FLAG,K22
;SETB K2FLAG
;K22:
SETB UPDATEDISPFLAG
;MOV DISPNO,#02H ;设置显示号
LJMP RETURNKEY
;#################
movekey:
INC LOOPNO
MOV A,LOOPNO
clr c
subb a,#0bh
Jc K21
MOV LOOPNO,#00H
K21:
MOV A,LOOPNO
RL A
MOV DPTR,#K22
JMP @A+DPTR
K22:
AJMP POS1
AJMP POS2
AJMP POS3
AJMP POS4
AJMP POS5
AJMP POS6
AJMP POS7
AJMP POS8
AJMP POS9
AJMP POS10
AJMP POS11
RETURNK2:
ret
;###################
POS1:
MOV A,1bh
aNL A,#0F0H
ORL A,TEMPKEY
MOV 1bh,A
MOV A,1dh
ANL A,#0F0H
SWAP A
MOV TEMPKEY,A
MOV FLASHPOS,#30H
MOV MAX,#02H
LJMP RETURNK2
POS2:
MOV A,1dh
ANL A,#0FH
SWAP A
ORL A,TEMPKEY
SWAP A
MOV 1dh,A
MOV A,1dh
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#31H
MOV MAX,#0AH
LJMP RETURNK2
POS3:
MOV A,1dh
aNL A,#0F0H
oRL A,TEMPKEY
MOV 1dh,A
MOV A,1ch
ANL A,#0F0H
SWAP A
MOV TEMPKEY,A
MOV FLASHPOS,#32H
MOV MAX,#04H
LJMP RETURNK2
POS4:
MOV A,1ch
ANL A,#0FH
SWAP A
ORL A,TEMPKEY
SWAP A
MOV 1ch,A
MOV A,1ch
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#33H
MOV MAX,#0AH
LJMP RETURNK2
POS5:
MOV A,1ch
aNL A,#0F0H
oRL A,TEMPKEY
MOV 1ch,A
MOV A,1ah
ANL A,#0F0H
SWAP A
MOV TEMPKEY,A
MOV FLASHPOS,#34H
MOV MAX,#03H
LJMP RETURNK2
POS6:
MOV A,1ah
ANL A,#0FH
SWAP A
ORL A,TEMPKEY
SWAP A
MOV 1ah,A
MOV A,1ah
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#35H
MOV MAX,#0AH
LJMP RETURNK2
POS7:
MOV A,1ah
aNL A,#0F0H
oRL A,TEMPKEY
MOV 1ah,A
MOV A,19h
ANL A,#0F0H
SWAP A
MOV TEMPKEY,A
MOV FLASHPOS,#36H
MOV MAX,#06H
LJMP RETURNK2
POS8:
MOV A,19h
ANL A,#0FH
SWAP A
ORL A,TEMPKEY
SWAP A
MOV 19h,A
MOV A,19h
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#37H
MOV MAX,#0AH
LJMP RETURNK2
POS9:
MOV A,19h
aNL A,#0F0H
oRL A,TEMPKEY
MOV 19h,A
MOV A,18h
ANL A,#0F0H
SWAP A
MOV TEMPKEY,A
MOV FLASHPOS,#38H
MOV MAX,#06H
LJMP RETURNK2
POS10:
MOV A,18h
ANL A,#0FH
SWAP A
ORL A,TEMPKEY
SWAP A
MOV 18h,A
MOV A,18h
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#39H
MOV MAX,#0AH
LJMP RETURNK2
POS11:
MOV A,18h
aNL A,#0F0H
oRL A,TEMPKEY
MOV 18h,A
MOV A,1bh
ANL A,#0FH
MOV TEMPKEY,A
MOV FLASHPOS,#3aH
MOV MAX,#08H
LJMP RETURNK2
;#################
K3:
jnb k1flag,returnk3
INC TEMPKEY
clr c
mov a,tempkey
SUBB A,MAX
JC RETURNK3
MOV TEMPKEY,#00H
MOV A,LOOPNO
CJNE A,#0AH,RETURNK3
MOV TEMPKEY,#01H
RETURNK3:
LJMP RETURNKEY
;######################
UPDATEDISPBUFFER:
JB UPDATEDISPFLAG,dispno1
LJMP FLASH
dispno1:
;mov a,dispno
;CJNE A,#01H,DISPNO2
MOV A,1dh
ANL A,#0F0H
SWAP A
ORL A,#00H
MOV 30H,A
MOV A,1dh
ANL A,#0FH
ORL A,#10H
MOV 31H,A
MOV A,1ch
ANL A,#0F0H
SWAP A
ORL A,#20H
MOV 32H,A
MOV A,1ch
ANL A,#0FH
ORL A,#30H
MOV 33H,A
MOV A,1ah
ANL A,#0F0H
SWAP A
ORL A,#40H
MOV 34H,A
MOV A,1ah
ANL A,#0FH
ORL A,#50H
MOV 35H,A
MOV A,19h
ANL A,#0F0H
SWAP A
ORL A,#60H
MOV 36H,A
MOV A,19h
ANL A,#0FH
ORL A,#70H
MOV 37H,A
MOV A,18h
ANL A,#0F0H
SWAP A
ORL A,#80H
MOV 38H,A
MOV A,18h
ANL A,#0FH
ORL A,#90H
MOV 39H,A
MOV A,1bh
ANL A,#0FH
ORL A,#0a0H
MOV 3aH,A
;ljmp flash
;DISPNO2:
;CJNE A,#02H,FLASH
FLASH:
CLR UPDATEDISPFLAG
JnB INNORMALDISPFLAG,RETURNUPDATE ;D1
;clr flashflag
;INC FLASHCOUNT
;MOV A,FLASHCOUNT
;clr c
;subb A,#32H
;Jc RETURNUPDATE
;MOV FLASHCOUNT,#00H
;SJMP RETURNUPDATE
D1:
INC FLASHCOUNT
MOV A,FLASHCOUNT
clr c
subb A,#15H
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 + -