📄 ds1302.asm
字号:
;/读DS1302秒寄存器内容通过164送LED显示/
;
TIME_RST BIT P1.4
TIME_IO BIT P1.3
TIME_SCLK BIT P1.2
TIME_REG EQU 2EH ;读写DS1302时存放地址
TIME_DT EQU 2FH ;读写DS1302时存放地址
ORG 0000H
AJMP SECOND
;
;***************************************************************
; /*主程序*/ *
;***************************************************************
;
ORG 0030H
SECOND: MOV SP,#60H
ACALL DSINIT ;初始化时钟芯片
MOV TIME_REG,#80H
MOV TIME_DT,#00H
CALL W_WORD ;送00到秒寄存器
ACALL DSWRPRT ;写保护
SECOND1: MOV TIME_REG,#81H ;读秒寄存器
CALL R_WORD
CALL DISP ;读到的内容送LED显示
CALL DELAY
CALL DELAY
CALL DELAY
AJMP SECOND1 ;继续读秒寄存器
;
;***************************************************************
; /*显示子程序*/ *
;***************************************************************
;
DISP: MOV A,TIME_DT ;取秒的低位
ANL A,#0FH
ACALL SEND ;显示
MOV A,TIME_DT
SWAP A
ANL A,#0FH ;取秒的高位
ACALL SEND ;显示
RET
SEND: MOV DPTR,#SGTB1
MOVC A,@A+DPTR ;取字符
MOV SBUF,A ;发送字符
JNB TI,$
CLR TI
RET
;
;***************************************************************
; /*万年历初始化程序*/ *
;***************************************************************
;
DSINIT: CLR TIME_SCLK
NOP
CLR TIME_RST
MOV TIME_REG,#8EH ;写保护寄存器(地址)
MOV TIME_DT,#00H ;打开写保护(指令)
ACALL W_WORD ;写地址、写指令
MOV TIME_REG,#90H ;涓流充电寄存器
MOV TIME_DT,#0A0H ;R=1K,2 个稳压管
ACALL W_WORD
RET
;
;***************************************************************
; /*DS1302 单字节命令(数据)写*/ *
;***************************************************************
;
W_WORD: PUSH PSW
CLR PSW.3
CLR PSW.4
CLR TIME_SCLK
NOP
SETB TIME_RST
MOV A,TIME_REG
ACALL W_BYTE
MOV A,TIME_DT
ACALL W_BYTE
CLR TIME_RST
NOP
CLR TIME_SCLK
POP PSW
RET
;
;***************************************************************
; /*DS1302 单字节命令(数据)读*/ *
;***************************************************************
;
R_WORD: CLR TIME_SCLK
NOP
SETB TIME_RST
MOV A,TIME_REG
ACALL W_BYTE
ACALL R_BYTE
MOV TIME_DT,A
CLR TIME_RST
NOP
CLR TIME_SCLK
RET
;
;***************************************************************
; /*DS1302 字节写时序*/ *
;***************************************************************
;
W_BYTE: MOV R6,#08H
CLR C
W_BYTE1: CLR TIME_SCLK
RRC A
MOV TIME_IO,C
NOP
SETB TIME_SCLK
DJNZ R6,W_BYTE1
RET
;
;***************************************************************
; /*DS1302 字节读时序*/ *
;***************************************************************
;
R_BYTE: MOV R6,#08H
CLR C
R_BYTE1: CLR TIME_SCLK
MOV C,TIME_IO
RRC A
SETB TIME_SCLK
DJNZ R6,R_BYTE1
RET
;
;***************************************************************
; /*万年历写保护子程序*/ *
;***************************************************************
;
DSWRPRT: MOV TIME_REG,#10001110B
MOV TIME_DT,#10000000B
CALL W_WORD
RET
;
;***************************************************************
; /*延时子程序*/ *
;***************************************************************
;
DELAY: MOV R4,#250 ;延时
DELAY1: MOV R5,#200
DJNZ R5,$
DJNZ R4,DELAY1
RET
;
;***************************************************************
; /*字符编码*/ *
;***************************************************************
;
SGTB1: DB 03H ;0
DB 9FH ;1
DB 25H ;2
DB 0DH ;3
DB 99H ;4
DB 49H ;5
DB 41H ;6
DB 1FH ;7
DB 01H ;8
DB 09H ;9
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -