📄 时钟程序0701.asm
字号:
JNZ ADD_MED_QU
MOV MED_L,#00H
MOV MED_H,#01H
ADD_MED_QU:
RET
;*********************************************
ADD_EMEND: MOV A,EMEND_L
ADDC A,#1
DA A
MOV EMEND_L,A
CLR C
CJNE A,#11H,ADD_EMEND_1
ADD_EMEND_1:JC ADD_EMEND_QU
MOV EMEND_L,#10H
ADD_EMEND_QU:RET
;************************************************************************************
ANT_SUBB: JB 06H,SUBB_QU ;防抖时间未到退出
MOV A,24H ;SUBB查询子程序
MOV B,A
MOV C,P1.5 ;取样比较
MOV ACC.0,C
MOV 24H,A
XRL A,B
JZ SUBB_QU ;没有变化退出
JB 20H,SUBB_QU
CLR 01H ;按下键时必须亮数码管
MOV 72H,#0FFH ;置亮时限
MOV 73H,#2
MOV 5EH,#0FFH ;置连发时限
MOV 5FH,#3
SETB 06H
MOV 2EH,#0A0H ;置防抖时限
MOV 2FH,#01H ;置防抖延时限
CALL RETUN_EQU ;返回时间档延时时限
JB MED,SUBB_MED ;在药量档
JB ALLTIME,SUBB_QU
JB TEMP,SUBB_TEM
JB INTEN,SUBB_WU_DEC
JB TIME,SUBB_QU
JB TEMPTEST,SUBB_QU
JB 02H,SUBB_QU ;在运行时按下无效
MOV A,MINUTE ;分个位清零,保留十位
ANL A,#0F0H
MOV MINUTE,A
MOV A,HOUR ;小时单元为零查看分钟单元
XRL A,#00H
JZ SUBB_1
JMP SUBB_2
SUBB_1: MOV A,MINUTE
XRL A,#00H
JZ SUBB_QU ;小时分钟单元都有为零减键按下无效
SUBB_2: MOV SECOND,#00H ;秒清零
;CALL SUBB_DEC1
CALL SUBB_BCD ;调减10子程序
MOV A,MINUTE
ANL A,#0F0H
XRL A,#90H
JNZ SUBB_3
MOV MINUTE,#50H
SUBB_3: SETB 05H ;在暂停时有调整置标志
SUBB_QU: RET
;***************************
;SUBB查询子程序结束
SUBB_TEM:
CLR C
CLR A
ADDC A,#99H ;加99
SUBB A,#00H ;减去减数
ADD A,TEMPERATURE ;加被减数
DA A ;十进制调整
MOV TEMPERATURE,A
CLR C
CJNE A,#20H,SUBB_TEM1
SUBB_TEM1:JNC SUBB_TEM_QU
MOV TEMPERATURE,#20H
SUBB_TEM_QU: RET
;*************************************************
SUBB_WU_DEC:
MOV A,INTENSITY
DEC A
MOV INTENSITY,A
CLR C
CJNE A,#01H,SUBB_DEC_1
SUBB_DEC_1:JNC SUBB_DEC_QU
MOV INTENSITY,#01H ;不超过5,不超过按下才有效
SUBB_DEC_QU:MOV 49H,#00H ;按下键雾化时间间隔计数清零
RET
;************************************************
SUBB_MED:
CALL SUBB_MED_1
RET
;************************************************
SUBB_EMEND:CALL SUBB_EMEND_1
RET
;************************************************
SUBB_MED_1:
MOV A,MED_H
XRL A,#1
JZ SUBB_MED_0
MOV A,MED_L
XRL A,#0
JZ SUBB_MED_QU
SUBB_MED_0:
;CLR 00H ;开机在药量档按下加或减键终止待机状态
SETB PSW.3
SETB PSW.4
MOV R0,#5AH ;被减数高位地址送R0
MOV R1,#5CH ;减数高位地址送R1
MOV R3,#2 ;运算字节数送R3
MOV 5CH,#00H ;被减数为10,假放于两个字节
MOV 5DH,#10
MOV 5AH,MED_H
MOV 5BH,MED_L
MOV A,R0 ;从低位开始进行十进制减法
ADD A,R3
MOV R0,A
DEC R0
MOV A,R1
ADD A,R3
MOV R1,A
DEC R1
SETB C ;加1
SUBB_MED_2: CLR A
ADDC A,#99H ;加99
SUBB A,@R1 ;减去减数
ADD A,@R0 ;加被减数
DA A ;十进制调整
MOV @R0,A
DEC R0
DEC R1
DJNZ R3,SUBB_MED_2 ;循环N次
JC SUBB_MED_3
MOV MED_L,#00H ;如果CY为0,则差为负,不够减,减键无效
MOV MED_H,#00H
SUBB_MED_3:MOV MED_H,5AH
MOV MED_L,5BH
CLR PSW.3
CLR PSW.4
SUBB_MED_QU: RET
;*************************************************
SUBB_EMEND_1:
MOV A,EMEND_L
XRL A,#00H
JZ SUBB_EMEND_QU
CLR C
CLR A
ADDC A,#99H ;加99
SUBB A,#00H ;减去减数
ADD A,EMEND_L ;加被减数
DA A ;十进制调整
MOV EMEND_L,A
CLR C
;CJNE A,#01H,SUBB_EMEND_2
;SUBB_EMEND_2:JNC SUBB_EMEND_QU
;MOV EMEND_L,#00H
SUBB_EMEND_QU: RET
RET
;R0被减数高位地址,R1减数高位地址,R3为字节数
SUBB_BCD: SETB PSW.3
SETB PSW.4
MOV R0,#5AH ;被减数高位地址送R0
MOV R1,#5CH ;减数高位地址送R1
MOV R3,#2 ;运算字节数送R3
MOV 5CH,#00H ;被减数为10,假放于两个字节
MOV 5DH,#10
MOV 5AH,HOUR
MOV 5BH,MINUTE
MOV A,R0 ;从低位开始进行十进制减法
ADD A,R3
MOV R0,A
DEC R0
MOV A,R1
ADD A,R3
MOV R1,A
DEC R1
SETB C ;加1
CSUL1: CLR A
ADDC A,#99H ;加99
SUBB A,@R1 ;减去减数
ADD A,@R0 ;加被减数
DA A ;十进制调整
MOV @R0,A
DEC R0
DEC R1
DJNZ R3,CSUL1 ;循环N次
JC SUBB_OVER
MOV SECOND,#00H ;如果CY为0,则差为负,不够减,减键无效
MOV MINUTE,#00H
MOV HOUR,#00H
SUBB_OVER:MOV HOUR,5AH
MOV MINUTE,5BH
CLR PSW.3
CLR PSW.4
RET
;***********************************************************************************
;***********************************************************************************
;十位连发延时处理
AN_LFA: JB TEMPTEST,AN_LFB2
JB TIME,AN_LFB2
JB INTEN,AN_LFB2
JB ALLTIME,AN_LFB2
JB MED,AN_LFB2
JB TEMP,AN_LFB2
JB 02H,AN_LF2 ;在运行时按下无效
JB P1.4,AN_LF2
DEC 5EH
MOV A,5EH
JNZ AN_LF2
DEC 5FH
MOV A,5FH
JNZ AN_LF3
NOP
NOP
CLR 01H ;按下键时必须亮数码管
MOV 72H,#0FFH ;置亮时限
MOV 73H,#2
;连发加十,迢过50回到0,小时加1
CALL RETUN_EQU ;返回时间档延时时限
MOV SECOND,#00H ;秒清零
MOV A,MINUTE ;分个位清零,保留十位
ANL A,#0F0H
MOV MINUTE,A
MOV A,MINUTE ;分加10
ADD A,#10
DA A
MOV MINUTE,A
ANL A,#0F0H
XRL A,#60H
JNZ AN_LF4
MOV MINUTE,#00H
MOV A,HOUR
ADD A,#01H
DA A
MOV HOUR,A
AN_LF4: MOV 5EH,#0A0H ;重置初值,等待下一次连发
MOV 5FH,#1
JMP AN_LF2
AN_LF3: MOV 5EH,#0A0H
AN_LF2: RET
;************************************************************************************
AN_LFB2: RET
;**********************************
;十位连发延时处理
AN_LFB: JB TEMPTEST,AN_LFB2
JB TIME,AN_LFB2
JB INTEN,AN_LFB2
JB ALLTIME,AN_LFB2
JB MED,AN_LFB2
JB TEMP,AN_LFB2
JB 02H,AN_LFB2 ;在运行时按下无效
JB P1.5,AN_LFB2
DEC 5EH
MOV A,5EH
JNZ AN_LFB2
DEC 5FH
MOV A,5FH
JNZ AN_LFB3
NOP
NOP
CLR 01H ;按下键时必须亮数码管
MOV 72H,#0FFH ;置亮时限
MOV 73H,#2
CALL RETUN_EQU ;返回时间档延时时限
JMP AN_LFB_NEXT
;连发减十
AN_LFB_NEXT:
MOV A,MINUTE ;分个位清零,保留十位
ANL A,#0F0H
MOV MINUTE,A
MOV A,HOUR ;小时单元为零查看分钟单元
XRL A,#00H
JZ AN_LFBX
JMP AN_LFBY
AN_LFBX: MOV A,MINUTE
XRL A,#00H
JZ AN_LFB4 ;小时分钟单元都有为零减键按下无效
AN_LFBY: MOV SECOND,#00H ;秒清零
CALL SUBB_BCD ;调减10子程序
MOV A,MINUTE
ANL A,#0F0H
XRL A,#90H
JNZ AN_LFB4
MOV MINUTE,#50H
AN_LFB4: MOV 5EH,#0A0H ;重置初值,等待下一次连发
MOV 5FH,#1
JMP AN_LFB2
AN_LFB3: MOV 5EH,#0A0H
AN_LFB2_QU: RET
;********************************************************************************
;************************************************************************************
FDOU: DJNZ 2EH,FDOU_QU
DJNZ 2FH,FDOU_1
CLR 06H
MOV 2EH,#01H
MOV 2FH,#01H
JMP FDOU_QU
FDOU_1: MOV 2EH,#0FFH
FDOU_QU: RET
;************************************************************************************
RETUN_EQU:MOV 4EH,#0FFH ;返回时间档显示延时时限
MOV 4FH,#10H
RET
;************************************************************************************
RETUN_TIME:DJNZ 4EH,ST_1
DJNZ 4FH,ST_2
MOV 4EH,#00H
MOV 4FH,#00H
CLR MED
CLR SETTIME
CLR ALLTIME
CLR INTEN
CLR TEMPTEST
CLR TEMP
SETB TIME ;时限到回到时间档位显示时间
MOV 45H,#0FFH
MOV 46H,#0FFH
MOV 47H,#0FFH
MOV 48H,#0FFH
SETB 07H
MOV 34H,#01H
JMP ST_1
ST_2: MOV 4EH,#0FFH
ST_1: RET
;************************************************************************************
DELAY: MOV R7,#02H ;开机延时
YSA: MOV R6,#0FFH
YSB: MOV R5,#0FFH
YSC: DJNZ R5,YSC
DJNZ R6,YSB
DJNZ R7,YSA
RET
;*************************************************************************************
RETUN0: MOV 51H,SECOND
MOV 52H,SECOND
MOV A,#0FH
ANL A,51H
MOV 51H,A
MOV A,#0F0H
ANL A,52H
SWAP A
MOV 52H,A
;***************
MOV DPTR,#TAB
MOV A,51H
MOVC A,@A+DPTR
;MOV 33H,A
NOP
NOP
MOV A,52H
MOVC A,@A+DPTR
;MOV 32H,A
;**************************
RETUN1: MOV 53H,MINUTE
MOV 54H,MINUTE
MOV A,#0FH
ANL A,53H
MOV 53H,A
MOV A,#0F0H
ANL A,54H
SWAP A
MOV 54H,A
MOV DPTR,#TAB
MOV A,53H
MOVC A,@A+DPTR
MOV 33H,A
MOV A,54H
MOVC A,@A+DPTR
MOV 32H,A
RETUN2: MOV 55H,HOUR
MOV 56H,HOUR
MOV A,#0FH
ANL A,55H
MOV 55H,A
MOV A,#0F0H
ANL A,56H
SWAP A
MOV 56H,A
;***************
MOV DPTR,#TAB
MOV A,55H
MOVC A,@A+DPTR
MOV 31H,A
NOP
NOP
MOV A,56H
MOVC A,@A+DPTR
MOV 30H,A
RET
;************************************************************************************
MUSIC_0: DJNZ 4AH,MUSIC_QU
DJNZ 4BH,MUSIC_1
DJNZ 4CH,MUSIC_2
;SETB BEE
CLR TR2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -