📄 ds1305.asm
字号:
;*****************************************************************
; 这是DS1305汇编程序, 文件名为DS1305.ASM
; 功能:本程序主要是读DS1305的日历时钟值(共7个字节)、置DS1305的
; 日历时钟值、读DS1305的RAM区特定单元(共96个字节)的内容和
; 写DS1305的RAM区特定单元。本程序中对DS1305 RAM区的读写均为
; 16个字节。
;*****************************************************************
CE BIT P1.2
SCLK BIT P1.1
IO BIT P1.0
ORG 0000H
MOV SP,#30H ; 堆栈初始化
LCALL DELAY ; 调用延时程序
CLR EA
LCALL INTDS1305
LCALL SDAT3
LCALL CLEARWP
LCALL WRITETIME
LCALL SDAT4
LCALL WRITERAM
LCALL READTIME
LCALL READRAM
LJMP $
SDAT3: MOV 60H,#10H ;待写的时钟值初始化
MOV 61H,#05
MOV 62H,#10H
MOV 63H,#07
MOV 64H,#26H
MOV 65H,#11H
MOV 66H,#06
RET
SDAT4: MOV 60H,#11H ;待写的RAM区数据初始化
MOV 61H,#22H
MOV 62H,#33H
MOV 63H,#44H
MOV 64H,#55H
MOV 65H,#66H
MOV 66H,#0
MOV 67H,#1
MOV 68H,#2
MOV 69H,#3
MOV 6AH,#4
MOV 6BH,#5
MOV 6CH,#6
MOV 6DH,#7
MOV 6EH,#8
MOV 6FH,#9
RET
RESET: CLR SCLK ; DS1305复位
CLR CE
SETB CE
RET
DSW: MOV R7,#08H ;对DS1305进行写操作程序-通过单片机写入地址或数据
WLOOP1: RRC A ;A中为要写入的数据或地址
MOV IO,C
SETB SCLK
NOP
CLR SCLK
DJNZ R7,WLOOP1
RET
DSR: SETB IO ;对DS1305进行读操作程序
CLR A
MOV R7,#08H
RLOOP1: CLR SCLK
MOV C,IO
RRC A ;A中为读出的8位数据
SETB SCLK
DJNZ R7,RLOOP1
RET
INTDS1305: LCALL RESET ; 时钟初始化
MOV A,#8FH ; 往控制寄存器写0x05
LCALL DSW
MOV A,#05H
LCALL DSW
MOV A,#90H ; 往状态寄存器写0x01
LCALL DSW
MOV A,#01H
LCALL DSW
MOV A,#91H ; 往涓流充电寄存器写0xa5
LCALL DSW
MOV A,#0A5H
LCALL DSW
RET
READTIME: LCALL RESET ; 读时钟
MOV A,#0
LCALL DSW
LCALL DSR
MOV 60H,A
LCALL DSR
MOV 61H,A
LCALL DSR
MOV 62H,A
LCALL DSR
MOV 63H,A
LCALL DSR
MOV 64H,A
LCALL DSR
MOV 65H,A
LCALL DSR
MOV 66H,A
LCALL RESET
RET
WRITETIME: LCALL RESET ; 写时钟
MOV A,#80H
LCALL DSW
MOV A,60H
LCALL DSW
MOV A,61H
LCALL DSW
MOV A,62H
LCALL DSW
MOV A,63H
LCALL DSW
MOV A,64H
LCALL DSW
MOV A,65H
LCALL DSW
MOV A,66H
LCALL DSW
LCALL RESET
LCALL clockwp
RET
READRAM: LCALL RESET ; 读RAM区
MOV A,#20H
LCALL DSW
LCALL DSR
MOV 60H,A
LCALL DSR
MOV 61H,A
LCALL DSR
MOV 62H,A
LCALL DSR
MOV 63H,A
LCALL DSR
MOV 64H,A
LCALL DSR
MOV 65H,A
LCALL DSR
MOV 66H,A
LCALL DSR
MOV 67H,A
LCALL DSR
MOV 68H,A
LCALL DSR
MOV 69H,A
LCALL DSR
MOV 6AH,A
LCALL DSR
MOV 6BH,A
LCALL DSR
MOV 6CH,A
LCALL DSR
MOV 6DH,A
LCALL DSR
MOV 6EH,A
LCALL DSR
MOV 6FH,A
LCALL RESET
RET
WRITERAM: LCALL RESET ; 写RAM区
MOV A,#0A0H
LCALL DSW
MOV A,60H
LCALL DSW
MOV A,61H
LCALL DSW
MOV A,62H
LCALL DSW
MOV A,63H
LCALL DSW
MOV A,64H
LCALL DSW
MOV A,65H
LCALL DSW
MOV A,66H
LCALL DSW
MOV A,67H
LCALL DSW
MOV A,68H
LCALL DSW
MOV A,69H
LCALL DSW
MOV A,6AH
LCALL DSW
MOV A,6BH
LCALL DSW
MOV A,6CH
LCALL DSW
MOV A,6DH
LCALL DSW
MOV A,6EH
LCALL DSW
MOV A,6FH
LCALL DSW
LCALL RESET
RET
;一旦设置好,就必须调用时钟写保护来防止对时钟的误操作。
clockwp: SETB SCLK ; 时钟写保护
MOV A,#8FH ; 往控制寄存器写0x45
LCALL DSW
MOV A,#45H
LCALL DSW
CLR SCLK
RET
;在写时钟之前,必须清时钟写保护位,否则写不进去。
CLEARWP: SETB SCLK ; 清时钟写保护位
MOV A,#8FH ; 往控制寄存器写0x00
LCALL DSW
MOV A,#00H
LCALL DSW
CLR SCLK
RET
Delay: NOP ; 延时程序
MOV R2, #1
MOV R1, #0
MOV R0, #0
DLP: NOP
DJNZ R0, DLP
DJNZ R1, DLP
DJNZ R2, DLP
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -