📄 main.asm
字号:
CALL UPDATA_ON
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^关于小时的设置
CHANGE_HOUR_L:
CALL TIME_DISP
CHANGE_HOUR:
MOV R7, #00000011B
CALL FLASH
CHANGE_HOUR2:
CALL KEYBO
JNB OVER3S, HOUR_NEXT
MOV A, KEY_VOL
CJNE A, #82H, HOUR_NEXT
CALL INC_HOUR
CALL DLY100MS
CALL SAVE_12887 ;更新DS12887的数据
SJMP CHANGE_HOUR2
HOUR_NEXT:
JNB KEY_DIR,CHANGE_HOUR
CLR KEY_DIR
MOV A, KEY_VOL
CJNE A, #01H, HOUR_KEY2 ;按功能键的处理
SJMP CHANGE_MUNITE
HOUR_KEY2:CJNE A, #02H, HOUR_KEY3 ;按调整键的处理
CALL INC_HOUR
CALL SAVE_12887
SJMP CHANGE_HOUR
HOUR_KEY3:CJNE A, #04H, CHANGE_HOUR ;按返回键的处理
CALL UPDATA_ON
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^关于分钟的设置
CHANGE_MUNITE:
MOV R7, #00011000B
CALL FLASH
CHANGE_MUNITE2:
CALL KEYBO
JNB OVER3S, MUNITE_NEXT
MOV A, KEY_VOL
CJNE A, #82H, MUNITE_NEXT
CALL INC_MUNITE
CALL DLY100MS
CALL SAVE_12887 ;更新DS12887的数据
SJMP CHANGE_MUNITE2
MUNITE_NEXT:
JNB KEY_DIR,CHANGE_MUNITE
CLR KEY_DIR
MOV A, KEY_VOL
CJNE A, #01H, MUNITE_KEY2 ;按功能键的处理
SJMP CHANGE_SECOND
MUNITE_KEY2:CJNE A, #02H, MUNITE_KEY3 ;按调整键的处理
CALL INC_MUNITE
CALL SAVE_12887
SJMP CHANGE_MUNITE
MUNITE_KEY3:CJNE A, #04H, CHANGE_MUNITE ;按返回键的处理
CALL UPDATA_ON
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^关于秒钟的设置
CHANGE_SECOND:
MOV R7, #11000000B
CALL FLASH
CHANGE_SECOND2:
CALL KEYBO
JNB OVER3S, SECOND_NEXT
MOV A, KEY_VOL
CJNE A, #82H, SECOND_NEXT
CALL INC_SECOND
CALL DLY100MS
CALL SAVE_12887 ;更新DS12887的数据
SJMP CHANGE_SECOND2
SECOND_NEXT:
JNB KEY_DIR,CHANGE_SECOND
CLR KEY_DIR
MOV A, KEY_VOL
CJNE A, #01H, SECOND_KEY2 ;按功能键的处理
SJMP CHANGE_RI_HOUR
SECOND_KEY2:CJNE A, #02H, SECOND_KEY3 ;按调整键的处理
CALL INC_SECOND
CALL SAVE_12887
SJMP CHANGE_SECOND
SECOND_KEY3:CJNE A, #04H, CHANGE_SECOND ;按返回键的处理
CALL UPDATA_ON
RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;系统返回
CHANGE_RI_HOUR:
CALL UPDATA_ON
RET
CHANGE_RET:RET
;***************************************************************
;关于打铃设置
CHANGE_RING:
JB OVER3S, CHANGE_RING1
CGE_RET:LJMP CHANGE_RING_RET
CHANGE_RING1:
MOV A, KEY_VOL
CJNE A, #82H, CGE_RET
MOV 30H, #31H ;以下八行程序用于显示;"ring set"
MOV 31H, #06H
MOV 32H, #37H
MOV 33H, #7DH
MOV 34H, #00H
MOV 35H, #6DH
MOV 36H, #79H
MOV 37H, #78H
DLY_RLY:CALL KEYBO
JNB KEY_DIR,DLY_RLY
MOV 31H, #00H
MOV 32H, #00H
MOV 33H, #00H
SJMP $
CHANGE_RING_RET:RET
;***************************************************************
;更新DS12887的子程序
SAVE_12887:
CLR TR0 ;以下程序用于将新数据存入DS12887中
CLR CS
PUSH P0
MOV DPH, P2
MOV DPL, #09H
MOV A, YEAR
MOVX @DPTR, A
MOV DPL, #08H
MOV A, MONTH
MOVX @DPTR, A
MOV DPL, #07H
MOV A, DAY
MOVX @DPTR, A
MOV DPL, #04H
MOV A, HOUR
MOVX @DPTR, A
MOV DPL, #02H
MOV A, MUNITE
MOVX @DPTR, A
MOV DPL, #00H
MOV A, SECOND
MOVX @DPTR, A
POP P0
SETB CS
SETB TR0
RET
;****************************************************************
;年加1
INC_YEAR:
MOV FLASH_BIT,#00H ;以下程序用于连续步进年份
MOV A, YEAR
ADD A, #01H
DA A
MOV YEAR, A ;以下产生年的高位
ANL A, #0F0H
SWAP A
MOV DPTR, #TIME_TAB
MOVC A, @A+DPTR
MOV 30H, A
MOV A, YEAR ;以下产生年的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 31H, A
RET
;****************************************************************
;月加1
INC_MONTH:
MOV FLASH_BIT,#00H ;以下程序用于连续步进年份
MOV A, MONTH
ADD A, #01H
DA A
MOV MONTH, A ;以下产生月的高位
CJNE A, #13H, ZERO_MONTH
MOV MONTH, #01H
ZERO_MONTH:
MOV A, MONTH
ANL A, #0F0H
SWAP A
MOV DPTR, #TIME_TAB
MOVC A, @A+DPTR
MOV 33H, A
MOV A, MONTH ;以下产生月的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 34H, A
RET
;****************************************************************
;日加1
INC_DAY:
MOV FLASH_BIT,#00H ;以下程序用于连续步进日
MOV A, DAY
ADD A, #01H
DA A
MOV DAY, A ;以下产生日的高位
CJNE A, #32H, ZERO_DAY
MOV DAY, #01H
ZERO_DAY:
MOV A, DAY
ANL A, #0F0H
SWAP A
MOV DPTR, #TIME_TAB
MOVC A, @A+DPTR
MOV 36H, A
MOV A, DAY ;以下产生日的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 37H, A
RET
;****************************************************************
;小时加1
INC_HOUR:
MOV FLASH_BIT,#00H ;以下程序用于连续步进小时
MOV A, HOUR
ADD A, #01H
DA A
MOV HOUR, A ;以下产生小时的高位
CJNE A, #24H, ZERO_HOUR
MOV HOUR, #00H
ZERO_HOUR:
MOV A, HOUR
ANL A, #0F0H
SWAP A
MOV DPTR, #TIME_TAB
MOVC A, @A+DPTR
MOV 30H, A
MOV A, HOUR ;以下产生小时的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 31H, A
RET
;****************************************************************
;分钟加1
INC_MUNITE:
MOV FLASH_BIT,#00H ;以下程序用于连续步进分钟
MOV A, MUNITE
ADD A, #01H
DA A
MOV MUNITE, A ;以下产生分钟的高位
CJNE A, #60H, ZERO_MUNITE
MOV MUNITE, #00H
ZERO_MUNITE:
MOV A, MUNITE
ANL A, #0F0H
SWAP A
MOV DPTR, #TIME_TAB
MOVC A, @A+DPTR
MOV 33H, A
MOV A, MUNITE ;以下产生分钟的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 34H, A
RET
;****************************************************************
;秒钟加1
INC_SECOND:
MOV FLASH_BIT,#00H ;以下程序用于连续步进秒钟
MOV A, SECOND
ADD A, #01H
DA A
MOV SECOND, A ;以下产生秒钟的高位
CJNE A, #60H, ZERO_SECOND
MOV SECOND, #00H
ZERO_SECOND:
MOV A, SECOND
ANL A, #0F0H
SWAP A
MOV DPTR, #TIME_TAB
MOVC A, @A+DPTR
MOV 36H, A
MOV A, SECOND ;以下产生秒钟的低位
ANL A, #0FH
MOVC A, @A+DPTR
MOV 37H, A
RET
;****************************************************************
;启动时钟更新
UPDATA_ON:
CLR TR0 ;以下十行程序用于开启DS12887的时钟更新
CLR CS
PUSH P0
MOV DPH, P2
MOV DPL, #0BH
MOV A, #02H
MOVX @DPTR, A
CALL GET_DATE
POP P0
SETB CS
SETB TR0
RET
;****************************************************************
;按键子程序
KEYBO:
JB KEY_DIR_1, D_RELAY
MOV A, P1
CPL A
ANL A, #07H
JZ KEY_RET
CALL DLY10MS ;消抖动
MOV A, P1
CPL A
ANL A, #07H
JZ KEY_RET
MOV KEY_VOL, A;存按键值
SETB KEY_DIR_1
MOV MS, #00H
MOV MS255, #00H
D_RELAY:MOV A, P1 ;等待按键释放
CPL A
ANL A, #07H
JZ KEY_RELAY
MOV A, MS255
CJNE A, #0BH, KEY_RET
SETB OVER3S ;当按键按下超过三秒,设标志位
MOV A, KEY_VOL
ORL A, #80H
MOV KEY_VOL, A
SJMP KEY_RET
KEY_RELAY: ;当按键放开时,设KEY_DIR标志
CLR KEY_DIR_1
CLR OVER3S
SETB KEY_DIR
KEY_RET:RET
;***********************************************************
;闪泺子程序
FLASH:
MOV A, MS255 ;以下六行程序用于闪泺
JB ACC.1, HIDE
MOV FLASH_BIT, #00H
SJMP FLASH_RET
HIDE: MOV FLASH_BIT, R7;R7存用户的闪烁位设置
FLASH_RET:
RET
;***********************************************************
;延时子程序
D1MS: MOV R7, #23 ;delay time 1 ms
DL_1: MOV R6, #20
DJNZ R6, $
DJNZ R7, DL_1
NOP
RET
DLY10MS:MOV R5, #10 ;delay time 10 ms
DL_2: LCALL D1MS
DJNZ R5, DL_2
NOP
RET
DLY100MS:
MOV R4, #0CH ;以下三行程序用于连续步进的延时处理
DL_3: CALL DLY10MS
DJNZ R4, DL_3
RET
;************************************************************
END
;*********************************************************
;BIT
;00H:256豪秒指针
;01H: KEY_DIR_1,是否按下按键
;OVER3S 02H;是否按住按键超过三秒
;KEY_DIR 03H 是否有按键输出
;BYTE:
;30H-37H:8位的动态显示缓存
;38H:动态显示中,位选的标志,每隔一豪秒左移一次
;39H:动态显示缓存指针
;MS: 3AH,256豪秒计数
;MS255:3BH,计时
;3CH,KEY_VOL,用于存按键值
;3DH,FLASH_BIT,用于指示闪烁的位
;40H,41H,42H:HOUR,MUNITE,SECOND,小时,分钟,秒
;43H,44H,45H,46H:YEAR,MONTH,DAY,HOLIDAY,年,月,日,星期
;
;
;
;
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -