📄 ds1302.s43
字号:
#include "msp430x14x.h"
#define SCLK 01h
#define IO 02h
#define RST 04h
#define SEC 0200h
#define MIN 0201h
#define HR 0202h
#define DAY 0203h
#define MON 0204h
#define WEEK 0205h
#define YEAR 0206h
#define DS_ADD 0207h
#define DS_COM 0208h
;------------------------------------------------------------------------------
ORG 0F000h ; Program Start
;------------------------------------------------------------------------------
RESET mov.w #0A00h,SP ; Initialize 'F149 stackpointer
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
clr.b &P3SEL ;P3各端口均设为数字I/O口
bis.b #SCLK+RST+IO,&P3DIR ;将SCLK、RST、IO均设为输出
INIT bic.b #SCLK+RST,&P3OUT ;清SCLK(串行时钟)和RST
mov.b #08Eh,&DS_ADD ;对控制寄存器进行操作
mov.b #000h,&DS_COM ;打开写保护
CALL #WRRTC
mov.b #090h,&DS_ADD ;对充电控制寄存器进行操作
mov.b #0A5h,&DS_COM ;在充电电路上选择1个二极管、2K电阻
CALL #WRRTC
;时间初始化
mov.b #080h,&DS_ADD ;这两句语句用来启动时钟;
mov.b #000h,&DS_COM
CALL #WRRTC
mov.b #080h,&DS_ADD ;这两句语句用来启动时钟;
mov.b #000h,&DS_COM
CALL #WRRTC
;设置一个时间 2002年3月25日20时25分0秒,星期是随便写的。
mov.b #0,&SEC
mov.b #025h,&MIN ;注意数据的表示
mov.b #030h,&HR
mov.b #025h,&DAY
mov.b #003h,&MON
mov.b #001h,&WEEK
mov.b #002h,&YEAR
CALL #WR_TIME
SetupP1 bis.b #001h,&P1DIR ; P1.0 output
;
Mainloop
xor.b #001h,&P1OUT ; Toggle P1.0
Wait mov.w #050000,R15 ; Delay to R15
L1 dec.w R15 ; Decrement R15
jnz L1 ; Delay over?
jmp Mainloop ; Again
;
;------------------------------------------------------------------------------
WR_TIME
;------------------------------------------------------------------------------
mov.b #7,R7 ;因为秒分时日月周年共7个字节。
WR_T1 bic.b #SCLK,&P3OUT
NOP
bis.b #RST,&P3OUT
;首先写入命令字10000000b,表示系统即将执行写命令
mov.b #8,R6
mov.b #080h,R4 ;80h=10000000b
WR_T2 bic.b #SCLK,&P3OUT
RRC.b R4
jc WR_T3
bic.b #IO,&P3OUT
jmp WR_T4
WR_T3 bis.b #IO,&P3OUT
WR_T4 NOP
bis.b #SCLK,&P3OUT
dec.b R6
jnz WR_T1
;以下开始写入各时间字节,从秒开始写到年,注意存储器中第六个字节是星期
;因此不管是读还是写,都应跳过它
mov.b #8,R6
mov #SEC,R5
mov.b @R5,R4
WR_T5 bic.b #SCLK,&P3OUT
RRC.b R4
jc WR_T6
bic.b #IO,&P3OUT
jmp WR_T7
WR_T6 bis.b #IO,&P3OUT
WR_T7 NOP
bis.b #SCLK,&P3OUT
dec.b R6
jnz WR_T5
WR_T8 inc R5
mov.b @R5,R4
bic.b #RST,&P3OUT
NOP
bic.b #SCLK,&P3OUT
dec.b R7
jnz WR_T1
RET
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
READ_TIME ;从DS1302中读出时间,注意抛掉星期
;------------------------------------------------------------------------------
mov.b #7,R7 ;因为秒分时日月周年共7个字节。
RD_T1 bic.b #SCLK,&P3OUT
NOP
bis.b #RST,&P3OUT
;首先写入命令字10000001b,表示系统即将执行读命令
mov.b #8,R6
mov.b #081h,R4 ;81h=10000001b
RD_T2 bic.b #SCLK,&P3OUT
RRC.b R4
jc RD_T3
bic.b #IO,&P3OUT
jmp RD_T4
RD_T3 bis.b #IO,&P3OUT
RD_T4 NOP
bis.b #SCLK,&P3OUT
dec.b R6
jnz RD_T1
;以下开始写入各时间字节,从秒开始写到年,注意存储器中第六个字节是星期
;因此不管是读还是写,都应跳过它
mov.b #8,R6
mov #SEC,R5
RD_T5 bic.b #SCLK,&P3OUT
NOP
bit.b #IO,&P3OUT
jz RD_T6
SETC
jmp RD_T7
RD_T6 CLRC
RRC.b R4
RD_T7 bis.b #SCLK,&P3OUT
dec.b R6
jnz RD_T5
RD_T8 mov.b R4,0(R5)
inc R5
bic.b #RST,&P3OUT
NOP
bic.b #SCLK,&P3OUT
dec.b R7
jnz RD_T1
RET
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
WRRTC ;single byte(command/data)write to DS1302
;将DS_ADD和DS_COM依次从I/O端口发送出去
;------------------------------------------------------------------------------
bis.b #SCLK+RST+IO,&P3DIR
bic.b #SCLK,&P3OUT
NOP
bis.b #RST,&P3OUT
NOP
NOP
mov.b #2,R7
WRRTC1 mov.b #8,R6
mov.b &DS_ADD,R4
WRRTC2 bic.b #SCLK,&P3OUT
RRC.b R4
jc WRRTC3
bic.b #IO,&P3OUT
jmp WRRTC4
WRRTC3 bis.b #IO,&P3OUT
WRRTC4 NOP
bis.b #SCLK,&P3OUT
dec.b R6
jnz WRRTC2
dec.b R7
jz WRRTC5
mov.b #8,R6
mov.b &DS_COM,R4
jmp WRRTC2
WRRTC5 bic.b #RST,&P3OUT
NOP
bic.b #SCLK,&P3OUT
RET
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; Interrupt Vectors Used MSP430x13x/14x
;------------------------------------------------------------------------------
ORG 0FFFEh ; MSP430 RESET Vector
DW RESET ;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -