📄 ds1302.h
字号:
;----------------------------------------------------------------------
;
; headfile for DS1302
; Timer IC
;
;----------------------------------------------------------------------
;----------------------------------------------------------------------
;
; macro define for ds1302
;
;----------------------------------------------------------------------
SET_DS1302_CE .MACRO
BSF PAD, B5
ENDM
CLR_DS1302_CE .MACRO
BCF PAD, B5
ENDM
SET_DS1302_CK .MACRO
BSF PAD, B3
ENDM
CLR_DS1302_CK .MACRO
BCF PAD, B3
ENDM
SET_DS1302_DA .MACRO
BSF PAD, B4
ENDM
CLR_DS1302_DA .MACRO
BCF PAD, B4
ENDM
DS1302_DA_OUT .MACRO
BCF PACONH, B0
BSF PACONH, B1
ENDM
DS1302_DA_IN .MACRO
BCF PACONH, B0
BCF PACONH, B1
ENDM
#DEFINE DS1302_DA PAD, B4
;address
WR_DS1302_SEC EQU 80H
RD_DS1302_SEC EQU 81H
WR_DS1302_MIN EQU 82H
RD_DS1302_MIN EQU 83H
WR_DS1302_HOUR EQU 84H
RD_DS1302_HOUR EQU 85H
WR_DS1302_DATE EQU 86H
RD_DS1302_DATE EQU 87H
WR_DS1302_MON EQU 88H
RD_DS1302_MON EQU 89H
WR_DS1302_DAY EQU 8AH
RD_DS1302_DAY EQU 8BH
WR_DS1302_YEAR EQU 8CH
RD_DS1302_YEAR EQU 8DH
WR_DS1302_WP EQU 8EH
RD_DS1302_WP EQU 8FH
WR_DS1302_TCS EQU 90H
RD_DS1302_TCS EQU 91H
;----------------------------------------------------------------------
;
;
;----------------------------------------------------------------------
TimeInitial:
MOVLW 00h ;wp disable
MOVWF Para ;bit7=1:enb
CALL Ds1302SetWp
CALL Ds1302ReadMin
MOVLW 60h
SUBWF DataB0, W
BTFSC STATUS, C
goto PowerOnTimeErr
MOVFW DataB0
CALL F_Getdb_Sub
MOVFW R_WorkRam0
MOVWF R_MinH
MOVFW R_WorkRam1
MOVWF R_MinL
CALL Ds1302ReadHour
MOVLW 24h
SUBWF DataB0, W
BTFSS STATUS, C
goto PowerOnTimeOk
PowerOnTimeErr:
MOVLW 00h ;00 sec clock start
MOVWF Para ;sec bit7=0 clk start
CALL Ds1302SetSec
MOVLW 00h ;00 min
MOVWF Para
CALL Ds1302SetMin
MOVLW 12h ;12 hour-->24 clock
MOVWF Para
CALL Ds1302SetHour
CLRF R_SecTmL
CLRF R_SecTmH
CLRF R_MinH
CLRF R_MinL
MOVLW 01h
MOVWF R_HourH
MOVLW 02h
MOVWF R_HourL
RET
PowerOnTimeOk:
MOVFW DataB0
CALL F_Getdb_Sub
MOVFW R_WorkRam0
MOVWF R_HourH
MOVFW R_WorkRam1
MOVWF R_HourL
CALL Ds1302ReadSec ;start time
MOVFW DataB0
MOVWF Para
MOVLW 01111111B
ANDWF DataB0, F
MOVLW 60h
SUBWF DataB0, W
BTFSC STATUS, C
goto PowerOnTimeErr
MOVFW DataB0
CALL F_Getdb_Sub
MOVFW R_WorkRam0
MOVWF R_SecTmH
MOVFW R_WorkRam1
MOVWF R_SecTmL
MOVLW 7fh
ANDWF Para, F ;SEC REG BIT7=0 --> START
CALL Ds1302SetSec
RET
;--------------------------------------------------------------
;
; Ds1302 WRITE BIT
; INPUT:Data,BitCnt
;
;--------------------------------------------------------------
WriteBitDs1302:
MOVWF DataB0
DS1302_DA_OUT
goto $+1
goto $+1
goto $+1
MOVLW 08h
MOVWF BitCntB0
WriteBitDs1302Go:
BTFSS DataB0, B0
goto Write0Ds1302
Write1Ds1302:
SET_DS1302_DA
goto $+1
CLR_DS1302_CK
goto $+1
SET_DS1302_CK
goto JudgeDs1302BitCnt
Write0Ds1302:
CLR_DS1302_DA
goto $+1
CLR_DS1302_CK
goto $+1
SET_DS1302_CK
JudgeDs1302BitCnt:
RRF DataB0, F
DECFSZ BitCntB0, F
goto WriteBitDs1302Go
RET
;--------------------------------------------------------------
;
; Ds1302 Read BIT
; INPUT:Data,BitCnt
;
;--------------------------------------------------------------
ReadBitDs1302:
DS1302_DA_IN
goto $+1
goto $+1
goto $+1
MOVLW 08h
MOVWF BitCntB0
ReadBitDs1302Go:
SET_DS1302_CK
goto $+1
CLR_DS1302_CK
goto $+1
goto $+1
BCF STATUS, C
BTFSC DS1302_DA
BSF STATUS, C
RRF DataB0, F
DECFSZ BitCntB0, F
goto ReadBitDs1302Go
RET
;--------------------------------------------------------------
;
; Ds1302 set wp disable
; input: Para
;
;--------------------------------------------------------------
Ds1302SetWp:
SET_DS1302_CE
MOVLW WR_DS1302_WP
CALL WriteBitDs1302
MOVFW Para
CALL WriteBitDs1302
CLR_DS1302_CK
CLR_DS1302_CE
RET
;--------------------------------------------------------------
;
; Ds1302 set second
; input: Para
;
;--------------------------------------------------------------
Ds1302SetSec:
SET_DS1302_CE
MOVLW WR_DS1302_SEC
CALL WriteBitDs1302
MOVFW Para
CALL WriteBitDs1302
CLR_DS1302_CK
CLR_DS1302_CE
RET
;--------------------------------------------------------------
;
; Ds1302 set minute
; input: Para
;
;--------------------------------------------------------------
Ds1302SetMin:
SET_DS1302_CE
MOVLW WR_DS1302_MIN
CALL WriteBitDs1302
MOVFW Para
CALL WriteBitDs1302
CLR_DS1302_CK
CLR_DS1302_CE
RET
;--------------------------------------------------------------
;
; Ds1302 set hour
; input: Para
;
;--------------------------------------------------------------
Ds1302SetHour:
SET_DS1302_CE
MOVLW WR_DS1302_HOUR
CALL WriteBitDs1302
MOVFW Para
CALL WriteBitDs1302
CLR_DS1302_CK
CLR_DS1302_CE
RET
;--------------------------------------------------------------
;
; Ds1302 set second
; output: Data
;
;--------------------------------------------------------------
Ds1302ReadSec:
SET_DS1302_CE
MOVLW RD_DS1302_SEC
CALL WriteBitDs1302
CALL ReadBitDs1302
CLR_DS1302_CE
RET
;--------------------------------------------------------------
;
; Ds1302 set minute
; output: Data
;
;--------------------------------------------------------------
Ds1302ReadMin:
SET_DS1302_CE
MOVLW RD_DS1302_MIN
CALL WriteBitDs1302
CALL ReadBitDs1302
CLR_DS1302_CE
RET
;--------------------------------------------------------------
;
; Ds1302 set hour
; output: Data
;
;--------------------------------------------------------------
Ds1302ReadHour:
SET_DS1302_CE
MOVLW RD_DS1302_HOUR
CALL WriteBitDs1302
CALL ReadBitDs1302
CLR_DS1302_CE
RET
;-------------------------------------------------------------------------
;
;--------------------------------------------------------------------------
L_ReSetDS1302:
MOVLW 00h
MOVWF Para
CALL Ds1302SetSec
SWAPF R_MinH, W
IORWF R_MinL, W
MOVWF Para
CALL Ds1302SetMin
SWAPF R_HourH, W
IORWF R_HourL, W
MOVWF Para
CALL Ds1302SetHour
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -