📄 ds1305b.asm
字号:
;*****************************************************************
; 这是被CALLDS05.c调用的DS1305汇编程序,文件名为DS1305B.ASM
; 功能:本程序是DS1305的时钟日历和RAM读写程序, 单片机的 P1.0,P1.1,P1.2
; 依次和DS1305的IO、SCLK、CE脚相连。
;*****************************************************************
NAME DS1305B
?PR?_a_func3?DS1305B SEGMENT CODE
?DT?_a_func3?DS1305B SEGMENT DATA OVERLAYABLE
?DT?DS1305B SEGMENT DATA
PUBLIC chai3
PUBLIC ?_a_func3?BYTE
PUBLIC _a_func3
RSEG ?DT?_a_func3?DS1305B
?_a_func3?BYTE:
aa:DS 1
bb:DS 1
RSEG ?DT?DS1305B
chai3:DS 1
RSEG ?PR?_a_func3?DS1305B
_a_func3:
CE BIT P1.2
SCLK BIT P1.1
IO BIT P1.0
MOV aa,R7 ;R7中放传递进来的第一个字符型数
MOV bb,R5 ;R5中放传递进来的第二个字符型数
MOV A,aa
JNZ CAT1
NOP ; 读DS1305
MOV A,bb
JNZ DOG1
LCALL READTIME ; 读时钟
RET
DOG1: LCALL READRAM ; 读RAM区
RET
CAT1: NOP ; 写DS1305
LCALL INTDS1305
MOV A,bb
JNZ DOG2
LCALL CLEARWP
LCALL WRITETIME ; 写时钟
RET
DOG2: LCALL WRITERAM ; 写RAM区
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
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -