⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 用51单片机做的时钟
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	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 + -