📄 ds1302.asm
字号:
;***********************************************
;***********************************************
;/* 读取时钟 DS1302 */
;***********************************************
DTIME: MOV DSMAND,#083H ;分
LCALL R_BYTE
MOV RMIN,DSDATA
MOV DSMAND,#085H ;时
LCALL R_BYTE
MOV RHOUR,DSDATA
MOV DSMAND,#087H ;日
LCALL R_BYTE
MOV RDATE,DSDATA
MOV DSMAND,#089H ;月
LCALL R_BYTE
MOV RMON,DSDATA
MOV DSMAND,#08BH ;星期
LCALL R_BYTE
MOV RDAY,DSDATA
MOV DSMAND,#08DH ;年
LCALL R_BYTE
MOV RYEAR,DSDATA
RET
;第一次上电时钟为 2000年01月01日星期六 00:00
INTI: MOV DSMAND,#08EH
MOV DSDATA,#00H ;允许数据写入寄存器
LCALL S_BYTE
MOV DSMAND,#080H
MOV DSDATA,#00H ;开始振荡 0秒开始
LCALL S_BYTE
MOV DSMAND,#082H
MOV DSDATA,#00H ;000分
LCALL S_BYTE
MOV DSMAND,#084H
MOV DSDATA,#000H ;00时
LCALL S_BYTE
MOV DSMAND,#086H
MOV DSDATA,#01H ;1日
LCALL S_BYTE
MOV DSMAND,#088H
MOV DSDATA,#01H ;1月
LCALL S_BYTE
MOV DSMAND,#08AH
MOV DSDATA,#02H ;星期二
LCALL S_BYTE
MOV DSMAND,#08CH
MOV DSDATA,#08H ;08年
LCALL S_BYTE
MOV DSMAND,#090H
MOV DSDATA,#0aaH ;4k两只二极管狷流充电
LCALL S_BYTE
RET
S_BYTE: CLR DSCE ;复位脚为低电平所有数据传送终止
NOP
CLR DSCK ;清时钟总线
NOP
SETB DSCE ;复位脚为高电平逻辑控制有效
NOP
MOV A,DSMAND
MOV R4094D,#08H
S_BYTE0: RRC A
MOV DSIO,C
NOP
NOP
SETB DSCK
NOP
NOP
NOP
CLR DSCK
DJNZ R4094D,S_BYTE0
NOP
NOP
NOP
S_BYTE1: MOV A,DSDATA
MOV R4094D,#08H
S_BYTE2: RRC A
MOV DSIO,C
NOP
NOP
SETB DSCK
NOP
NOP
NOP
CLR DSCK
DJNZ R4094D,S_BYTE2
NOP
NOP
CLR DSCE
LCALL DELAY10mS
RET
;************
R_BYTE: CLR DSCE ;复位脚为低电平所有数据传送终止
NOP
CLR DSCK ;清时钟总线
NOP
SETB DSCE ;复位脚为高电平逻辑控制有效
NOP
MOV A,DSMAND
MOV R4094D,#08H
R_BYTE0: RRC A
MOV DSIO,C
NOP
NOP
SETB DSCK
NOP
NOP
NOP
CLR DSCK
DJNZ R4094D,R_BYTE0
NOP
NOP
NOP
MOV R4094D,#08H
CLR C
R_BYTE1: NOP
MOV C,DSIO
NOP
NOP
RRC A
NOP
SETB DSCK
NOP
NOP
NOP
CLR DSCK
DJNZ R4094D,R_BYTE1
NOP
CLR DSCE
MOV DSDATA,A
LCALL DELAY10mS
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -