📄 时钟程序0701.asm
字号:
;20H标志位
;00H位待机标志位(暂不用)
;01H设定时的闪烁标志
;02H运行标志
;03H暂停标志位
;(04H开机状态)没有用上
;05H为是否有调整预置时间标志
;06H防抖标志
;07H闪烁标志
;21H标志位
;08H药量档
;09H雾化强度档
;0AH设定时间
;0BH温度
;0CH运行时间
;0DH总时间
;0EH实时温度
;0FH查询键状态标志
;22H-29H键变化取样单元
;2EH2FH按键防抖兼EEPROM测试单元
;30-38H为段码显示缓冲
;39H为音乐计数
;3AH-3BH为参与药量转换时间中除法的高低字节(实际上是药量*10)
;3CH为雾化强度除数地址(实际上是雾化强度*10)
;3DH为药量转换成时间的商,形式为BCD码,单位为分钟
;3FH为雾化强度被除数地址(实际上是雾化强度*10)
;40-48H为位码显示缓冲
;49H为20MS中断次数计数单元
;4A-4CH为音乐停止软延时程序
;4EH-4FH为返回时间档延时时限
;50H为一秒时间记数单元
;51-56H分别为00:00:00送显阿拉伯数据
;5AH,5BH,5CH,5DH为参与BCD码减法的被减数与减数单元
;5EH,5FH分别为按键连发延时时限
;60H,61H分别为药量的低位和高位,形式为BCD码
;62H,63H为定时时间,形式为BCD码
;64H为雾化强度等级计数单元,形式为BCD码
;65H为秒记数单元
;66H为分记数单元
;67H为时记数单元
;68H-69H分别为预置时间的分钟单元和小时单元
;6AH-6BH-6CH分别为总时间的分钟,小时,百小时计数单元,形式为压缩BCD码
;6DH为温度记数单元
;6EH,6FH为实时温度
;70H,71H分别为20H,21H两个字节状态标志位的贝份
;72H,73H分别为设定闪烁延时时限
;************************************************************************
MED BIT 08H
INTEN BIT 09H
SETTIME BIT 0AH
TEMP BIT 0BH
TIME BIT 0CH
ALLTIME BIT 0DH
TEMPTEST BIT 0EH
CHANGE BIT 0FH
DI BIT P3.7
CK BIT P3.6
STROBE BIT P3.3
PTC BIT P2.6
WUZH BIT P2.5
MOTOR BIT P2.7
WUQI BIT P2.4
BEE BIT P0.7
WATER BIT P3.5
TEMP1 BIT P0.0
TEMP2 BIT P0.1
SI BIT P2.1
SO BIT P2.2
SCK BIT P2.0
EECS BIT P2.3
MED_H EQU 60H ;药量高字节
MED_L EQU 61H ;药量低字节
EMEND_L EQU 62H ;调整量低字节
EMEND_H EQU 63H ;调整量高字节
INTENSITY EQU 64H ;雾化强度
SECOND EQU 65H ;实时时间秒
MINUTE EQU 66H ;实时时间分
HOUR EQU 67H ;实时时间小时
MINUTE_SET EQU 68H ;预置时间分钟
MINUTE_STEP EQU 69H ;预置时间分钟记数单元
MINUTE_ALL EQU 6AH ;总时间分
HOUR1_ALL EQU 6BH ;总时间十小时
HOUR2_ALL EQU 6CH ;总时间百小时
TEMPERATURE EQU 6DH ;设定温度
TEMP_L EQU 6EH ;实时温度计数低字节
TEMP_H EQU 6FH ;实时温度计数高字节
;**************************************************************************************
ORG 0000H
LJMP START
ORG 000BH
LJMP INT_T0
RETI
ORG 001BH
LJMP INT_T1
RETI
ORG 002BH
CLR TF2
INC 39H ;中断服务,中断计数器加1
MOV TH2,#0EAH
MOV TL2,#0FFH ;12M晶振,形成10毫秒中断
INT_T2_QU:RETI
;**************************************************
START: MOV SP,#0A0H
NOP
NOP
MOV A,#00H
MOV R0,#7FH
CLR_RAM: MOV @R0,A
DJNZ R0,CLR_RAM
NOP
NOP
MOV TMOD,#11H ;T0设定为十六位定时器
SETB PT2
MOV TH0,#00H ;定时置初值
MOV TL0,#0FCH
MOV 50H,#10 ;一秒时间计数
MOV TH1,#3CH
MOV TL1,#0B0H
MOV TH2,#0D8H
MOV TL2,#0EFH
MOV R0,#30H
MOV R1,#40H
MOV R2,#09H
SETB EA
SETB PT2
SETB ET0
SETB ET1
SETB ET2
NOP
NOP
SETB TR0
CALL TEST_EEPROM ;测试EEPROM
CALL TEST_TEMP ;测试温度传感器
;CALL TEST_WATER ;测试水位
;******************************
;JNB 02H,BEGIN1
NOP
NOP
MOV 2EH,#01H
MOV 2FH,#01H ;防抖清时限
MOV 4EH,#0FFH ;返回时间显示清时限
MOV 4FH,#50H
MOV 72H,#1
MOV 73H,#1
MOV 30H,#0FEH ;第1位数码管内容
MOV 31H,#0FEH ;第2位数码管内容
MOV 32H,#0FEH ;第3位数码管内容
MOV 33H,#0FEH ;第4位数码管内容
MOV 34H,#01H ;秒闪亮与不亮
MOV 35H,#00H ;时间指示取反
MOV 36H,#00H ;总时间指示取反
MOV 37H,#00H ;温度指示取反
MOV 38H,#00H ;雾化强度批示灯
MOV 40H,#0BFH ;点亮第1位数码管
MOV 41H,#0DFH ;点亮第2位数码管
MOV 42H,#0EFH ;点亮第3位数码管
MOV 43H,#0F7H ;点亮第4位数码管
MOV 44H,#0DFH ;秒闪指示
MOV 45H,#0FBH ;点亮时间指示灯(0FB)
MOV 46H,#0FDH ;点亮总时间指示灯0FD)
MOV 47H,#0FEH ;点亮温度指示灯(0FE)
MOV 48H,#7FH
;MOV R0,#60H
;MOV R6,#8
;CALL REEPROM ;WATCHDOG复位读EEPROM数据
;MOV R0,#68H
;MOV R6,#8
;CALL REEPROM
MOV SECOND,#00H
MOV MINUTE,#00H
MOV HOUR,#00H
MOV MED_H,#10H
MOV MED_L,#00H
;MOV MINUTE_STEP,#01H
MOV INTENSITY,#1
;CLR 00H ;非待机状态
SETB 02H
CLR 03H ;关暂停
SETB 05H ;置时间改动标志
SETB 07H
CLR ALLTIME
CLR SETTIME
SETB TIME
SETB TR1
SETB EA
SETB ET1
JMP RESET
BEGIN1: CALL BEGIN
;****************************************************************************
RESET: NOP
NOP
;CALL TEST_WATER ;反复监测水位
NOP
NOP
CALL ANT_SET0 ;SET键处理子程序
NOP
NOP
CALL ANT_SET1 ;SET键处理子程序
NOP
NOP
CALL ANT_SET2 ;SET键处理子程序
NOP
NOP
CALL ANT_SET3 ;SET键处理子程序
NOP
NOP
CALL ANT_SET4 ;SET键处理子程序
NOP
NOP
CALL SELECTION ;功能指示处理子程序
NOP
NOP
CALL ANT_START ;START键处理子程序
NOP
NOP
CALL LIGHT_4 ;档位显示处理子程序
NOP
NOP
CALL RETUN_TIME ;返回时间显示时限
NOP
NOP
CALL ANT_ADD ;ADD键处理子程序
NOP
NOP
CALL ANT_SUBB ;SUBB键处理子程序
NOP
NOP
CALL FDOU ;按键防抖子程序
NOP
NOP
CALL coruscate ;功能闪烁子程序
NOP
NOP
CALL AN_LFA ;加键连发子程序
NOP
NOP
CALL AN_LFB ;减键连发子程序
NOP
NOP
CALL MED_TIME ;药量转换为雾化时间子程序
NOP
NOP
;CALL AN_SETLF ;SET键连发子程序
NOP
NOP
;CALL MUSIC_0 ;音乐终止软延时子程序
NOP
NOP
;MOV 70H,20H
;MOV 71H,21H
RESET_QU:JMP RESET
;****************************************************************************
INT_T0: PUSH PSW ;T0显示扫描中断处理子程序
PUSH ACC
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
PUSH 05H
PUSH 06H
PUSH 07H
SETB PSW.3
CLR PSW.4
MOV TL0,#00H
MOV TH0,#0FCH ;扫描时间初值
MOV A,@R1 ;R1为段码地址
CALL XS_OUT
INC R1
NOP
NOP
MOV A,@R0 ;R0为位码地址
CALL XS_OUT
INC R0
NOP
NOP
DJNZ R2,INTT0_QU ;R2为显示位码数目
MOV R0,#30H
MOV R1,#40H
MOV R2,#09H
INTT0_QU:SETB STROBE ;锁存
CLR STROBE
CLR PSW.3
CLR PSW.4
POP 07H
POP 06H
POP 05H
POP 04H
POP 03H
POP 02H
POP 01H
POP 00H
POP ACC
POP PSW
RETI
;*****************************************************************************
;*****************************************************************************
INT_T1: PUSH PSW ;秒中断处理子程序
PUSH ACC
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
PUSH 05H
PUSH 06H
PUSH 07H
MOV TH1,#0F6H
MOV TL1,#5CH ;5毫秒置初值
CALL WU_NUMBER ;调雾化强度处理子程序
DEC 50H
MOV A,50H
XRL A,#100
JNZ CPL_SAN1 ;半秒闪烁一次
JB TEMPTEST,CPL_SAN1 ;运行时在总时间和温度档不能秒闪不能有闪烁
JB ALLTIME,CPL_SAN1
JB INTEN,CPL_SAN1
JB MED,CPL_SAN1
JB SETTIME,CPL_SAN1
JB TEMP,CPL_SAN1
SETB 07H
NOP
NOP
CPL_SAN1:
MOV A,50H
XRL A,#00H
JNZ CPL_A ;一秒时间未到退出
JMP CPL_A1 ;时间到
CPL_A:
CALL CPL_ABCD
POP 07H
POP 06H
POP 05H
POP 04H
POP 03H
POP 02H
POP 01H
POP 00H
POP ACC
POP PSW
RETI
NOP
NOP
CPL_A1: CLR 07H ;时间到秒闪暗
MOV 50H,#200 ;置一秒初值
;*****************************
MOV A,#01H ;2AH秒单元加1
ADD A,SECOND
DA A ;换算成BCD码
MOV SECOND,A
NOP
NOP
MOV 51H,SECOND ;取秒钟个位放于51H,十位放于52H
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
JB TEMPTEST,CPL_1 ;非时间档秒个位不更新
JB ALLTIME,CPL_1
JB INTEN,CPL_1
JB MED,CPL_1
JB SETTIME,CPL_1
JB TEMP,CPL_1
;MOV 33H,A
CPL_1: NOP
NOP
MOV A,52H
MOVC A,@A+DPTR
JB TEMPTEST,CPL_2 ;非时间档秒十位不更新
JB TEMPTEST,CPL_2 ;非时间档秒个位不更新
JB ALLTIME,CPL_2
JB INTEN,CPL_2
JB MED,CPL_2
JB SETTIME,CPL_2
JB TEMP,CPL_2
;MOV 32H,A
;**************************
CPL_2: MOV A,52H
CJNE A,#06H,CPL_B ;不足一分钟退出
JMP CPL_B1 ;迢过一分钟
CPL_B: CALL CPL_ABCD
POP 07H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -