📄 ds1302.s
字号:
.module DS1302.C
.area text(rom, con, rel)
.dbfile E:\software\MP3程序\Ds1302\DS1302.C
.dbfunc e ds1302_init _ds1302_init fV
.even
_ds1302_init::
.dbline -1
.dbline 44
; /*********************************************************************************
; *移植时一定要注意函数 void Ds1302buf_Write(uchar cmd, uchar data),中的方向和,读PIN引脚
; *********************************************************************************/
; #include <iom64v.h>
; #include <macros.h>
; #include "./ds1302.h"
; #define uchar unsigned char
; #define uint unsigned int
;
; #define nop NOP(); \
; NOP(); \
; NOP(); \
; NOP(); \
; NOP()
;
; #define sei() SEI()
; #define cli() CLI()
;
; #define DSCL(x) PORTE = (PORTE & ~(1<<2))|(x<<2)
; #define DSDA(x) PORTE = (PORTE & ~(1<<3))|(x<<3)
; #define DRST(x) PORTE = (PORTE & ~(1<<4))|(x<<4)
;
; #define SEC_W 0x80 /*Ds1302buf命令字*/
; #define SEC_R 0x81
; #define MIN_W 0x82
; #define MIN_R 0x83
; #define hour_W 0x84
; #define hour_R 0x85
; #define DATE_W 0x86
; #define DATE_R 0x87
; #define MONTH_W 0x88
; #define MONTH_R 0x89
; #define WEEK_W 0x8a
; #define WEEK_R 0x8b
; #define YEAR_W 0x8c
; #define YEAR_R 0x8d
; #define WP_W 0x8E
; #define POWER_W 0X90
; extern struct time_now timebuf;
; #define Ds1302buf timebuf
;
; //#define PRINTF_COM 1
; void ds1302_init(void)
; {
.dbline 45
; DDRE |= (1<<2)|(1<<3)|(1<<4);
in R24,0x2
ori R24,28
out 0x2,R24
.dbline 46
; PORTE |= (1<<2)|(1<<3)|(1<<4);
in R24,0x3
ori R24,28
out 0x3,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Ds1302buf_Write _Ds1302buf_Write fV
; i -> R20
; data -> R22
; cmd -> R10
.even
_Ds1302buf_Write::
xcall push_gset3
mov R22,R18
mov R10,R16
.dbline -1
.dbline 52
; }
; /*********************************************************************************************************************************************
; 写一个字节到Ds1302buf,参数分别为命令、数据
; *********************************************************************************************************************************************/
; void Ds1302buf_Write(uchar cmd, uchar data)
; {uchar i;
.dbline 53
; DSCL(0);
cbi 0x3,2
.dbline 54
; DRST(0);
cbi 0x3,4
.dbline 55
; nop;
nop
.dbline 55
nop
.dbline 55
nop
.dbline 55
nop
.dbline 55
nop
.dbline 56
; DRST(1);
in R24,0x3
andi R24,239
ori R24,16
out 0x3,R24
.dbline 57
; nop;
nop
.dbline 57
nop
.dbline 57
nop
.dbline 57
nop
.dbline 57
nop
.dbline 58
; for(i=0; i<8; i++)/*发送内部地址*/
clr R20
xjmp L6
L3:
.dbline 59
; {
.dbline 60
; DSCL(0);
cbi 0x3,2
.dbline 61
; nop;
nop
.dbline 61
nop
.dbline 61
nop
.dbline 61
nop
.dbline 61
nop
.dbline 62
; if(cmd & (1<<i)) DSDA(1);
ldi R16,1
mov R17,R20
xcall lsl8
mov R2,R10
and R2,R16
breq L7
.dbline 62
in R24,0x3
andi R24,247
ori R24,8
out 0x3,R24
xjmp L8
L7:
.dbline 63
; else DSDA(0);
cbi 0x3,3
L8:
.dbline 64
in R24,0x3
andi R24,251
ori R24,4
out 0x3,R24
.dbline 65
nop
.dbline 65
nop
.dbline 65
nop
.dbline 65
nop
.dbline 65
nop
.dbline 66
L4:
.dbline 58
inc R20
L6:
.dbline 58
cpi R20,8
brlo L3
.dbline 67
; DSCL(1);
; nop;
; }
; for(i=0; i<8; i++)/*发送数据*/
clr R20
xjmp L12
L9:
.dbline 68
; {
.dbline 69
; DSCL(0);
cbi 0x3,2
.dbline 70
; nop;
nop
.dbline 70
nop
.dbline 70
nop
.dbline 70
nop
.dbline 70
nop
.dbline 71
; if(data & (1<<i)) DSDA(1);
ldi R16,1
mov R17,R20
xcall lsl8
mov R2,R22
and R2,R16
breq L13
.dbline 71
in R24,0x3
andi R24,247
ori R24,8
out 0x3,R24
xjmp L14
L13:
.dbline 72
; else DSDA(0);
cbi 0x3,3
L14:
.dbline 73
in R24,0x3
andi R24,251
ori R24,4
out 0x3,R24
.dbline 74
nop
.dbline 74
nop
.dbline 74
nop
.dbline 74
nop
.dbline 74
nop
.dbline 75
L10:
.dbline 67
inc R20
L12:
.dbline 67
cpi R20,8
brlo L9
.dbline 76
; DSCL(1);
; nop;
; }
; DRST(0);
cbi 0x3,4
.dbline -2
L2:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r data 22 c
.dbsym r cmd 10 c
.dbend
.dbfunc e Ds1302buf_Read _Ds1302buf_Read fc
; data -> R20
; i -> R22
; cmd -> R10
.even
_Ds1302buf_Read::
xcall push_gset3
mov R10,R16
.dbline -1
.dbline 82
; }
; /*********************************************************************************************************************************************
; 从Ds1302buf读一个字节数据返回,参数只有命令,返回数据
; *******************************************************************************************************************************************/
; uchar Ds1302buf_Read(uchar cmd)
; {
.dbline 85
; uchar i;
; uchar data;
; DSCL(0);
cbi 0x3,2
.dbline 86
; DRST(0);
cbi 0x3,4
.dbline 87
; nop;
nop
.dbline 87
nop
.dbline 87
nop
.dbline 87
nop
.dbline 87
nop
.dbline 88
; DRST(1);
in R24,0x3
andi R24,239
ori R24,16
out 0x3,R24
.dbline 89
; nop;
nop
.dbline 89
nop
.dbline 89
nop
.dbline 89
nop
.dbline 89
nop
.dbline 90
; for(i=0; i<8; i++)/*发送内部地址*/
clr R22
xjmp L19
L16:
.dbline 91
; {
.dbline 92
; DSCL(0);
cbi 0x3,2
.dbline 93
; nop;
nop
.dbline 93
nop
.dbline 93
nop
.dbline 93
nop
.dbline 93
nop
.dbline 94
; if(cmd & (1<<i)) DSDA(1);
ldi R16,1
mov R17,R22
xcall lsl8
mov R2,R10
and R2,R16
breq L20
.dbline 94
in R24,0x3
andi R24,247
ori R24,8
out 0x3,R24
xjmp L21
L20:
.dbline 95
; else DSDA(0);
cbi 0x3,3
L21:
.dbline 96
in R24,0x3
andi R24,251
ori R24,4
out 0x3,R24
.dbline 97
nop
.dbline 97
nop
.dbline 97
nop
.dbline 97
nop
.dbline 97
nop
.dbline 98
L17:
.dbline 90
inc R22
L19:
.dbline 90
cpi R22,8
brlo L16
.dbline 99
; DSCL(1);
; nop;
; }
; DDRE &= ~(1<<3);
cbi 0x2,3
.dbline 100
; DSDA(0);
cbi 0x3,3
.dbline 101
; DSCL(0);
cbi 0x3,2
.dbline 102
; nop;
nop
.dbline 102
nop
.dbline 102
nop
.dbline 102
nop
.dbline 102
nop
.dbline 103
; if(PINE & (1<<3)) data |=0x80;
sbis 0x1,3
rjmp L22
.dbline 103
ori R20,128
xjmp L23
L22:
.dbline 104
; else data &= 0x7f;
andi R20,127
L23:
.dbline 105
; for(i=0; i<7; i++)/*读数据*/
clr R22
xjmp L27
L24:
.dbline 106
; { data >>=1;
.dbline 106
lsr R20
.dbline 107
; DSCL(1);
in R24,0x3
andi R24,251
ori R24,4
out 0x3,R24
.dbline 108
; nop;
nop
.dbline 108
nop
.dbline 108
nop
.dbline 108
nop
.dbline 108
nop
.dbline 109
; DSCL(0);
cbi 0x3,2
.dbline 110
; nop;
nop
.dbline 110
nop
.dbline 110
nop
.dbline 110
nop
.dbline 110
nop
.dbline 111
; if(PINE & (1<<3)) {data |=0x80;}
sbis 0x1,3
rjmp L28
.dbline 111
.dbline 111
ori R20,128
.dbline 111
xjmp L29
L28:
.dbline 112
; else {data &= 0x7f;}
.dbline 112
andi R20,127
.dbline 112
L29:
.dbline 113
L25:
.dbline 105
inc R22
L27:
.dbline 105
cpi R22,7
brlo L24
.dbline 114
; }
; DDRE |= 1<<3;
sbi 0x2,3
.dbline 115
; DRST(0);
cbi 0x3,4
.dbline 116
; return data;
mov R16,R20
.dbline -2
L15:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbsym r i 22 c
.dbsym r cmd 10 c
.dbend
.dbfunc e Read_InfoDs1302buf _Read_InfoDs1302buf fV
.even
_Read_InfoDs1302buf::
.dbline -1
.dbline 122
; }
; /*********************************************************************************************************************************************
; 从Ds1302buf中读取时钟日历信息
; *********************************************************************************************************************************************/
; void Read_InfoDs1302buf(void)
; {cli();
.dbline 122
cli
.dbline 123
; Ds1302buf.sec = Ds1302buf_Read(SEC_R) & 0x7f;
ldi R16,129
xcall _Ds1302buf_Read
mov R24,R16
andi R24,127
sts _timebuf,R24
.dbline 124
; Ds1302buf.min = Ds1302buf_Read(MIN_R) & 0x7f;
ldi R16,131
xcall _Ds1302buf_Read
mov R24,R16
andi R24,127
sts _timebuf+1,R24
.dbline 125
; Ds1302buf.hour = Ds1302buf_Read(hour_R) & 0x3f;
ldi R16,133
xcall _Ds1302buf_Read
mov R24,R16
andi R24,63
sts _timebuf+2,R24
.dbline 126
; Ds1302buf.date = Ds1302buf_Read(DATE_R)& 0x3f;
ldi R16,135
xcall _Ds1302buf_Read
mov R24,R16
andi R24,63
sts _timebuf+3,R24
.dbline 127
; Ds1302buf.month = Ds1302buf_Read(MONTH_R) & 0x1f;
ldi R16,137
xcall _Ds1302buf_Read
mov R24,R16
andi R24,31
sts _timebuf+4,R24
.dbline 128
; Ds1302buf.week = Ds1302buf_Read(WEEK_R) & 0x07;
ldi R16,139
xcall _Ds1302buf_Read
mov R24,R16
andi R24,7
sts _timebuf+5,R24
.dbline 129
; Ds1302buf.year = Ds1302buf_Read(YEAR_R);
ldi R16,141
xcall _Ds1302buf_Read
sts _timebuf+6,R16
.dbline 130
; sei();
sei
.dbline -2
L30:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Write_InfoDs1302buf _Write_InfoDs1302buf fV
.even
_Write_InfoDs1302buf::
.dbline -1
.dbline 136
; }
; /*********************************************************************************************************************************************
; 将时钟日历信息存储到Ds1302buf中
; *********************************************************************************************************************************************/
; void Write_InfoDs1302buf(void)
; {cli();
.dbline 136
cli
.dbline 137
; Ds1302buf_Write(WP_W, 0x00);
clr R18
ldi R16,142
xcall _Ds1302buf_Write
.dbline 138
; Ds1302buf_Write(SEC_W, Ds1302buf.sec);
lds R18,_timebuf
ldi R16,128
xcall _Ds1302buf_Write
.dbline 139
; Ds1302buf_Write(MIN_W, Ds1302buf.min);
lds R18,_timebuf+1
ldi R16,130
xcall _Ds1302buf_Write
.dbline 140
; Ds1302buf_Write(hour_W, Ds1302buf.hour);
lds R18,_timebuf+2
ldi R16,132
xcall _Ds1302buf_Write
.dbline 141
; Ds1302buf_Write(DATE_W, Ds1302buf.date);
lds R18,_timebuf+3
ldi R16,134
xcall _Ds1302buf_Write
.dbline 142
; Ds1302buf_Write(MONTH_W, Ds1302buf.month);
lds R18,_timebuf+4
ldi R16,136
xcall _Ds1302buf_Write
.dbline 143
; Ds1302buf_Write(WEEK_W, Ds1302buf.week);
lds R18,_timebuf+5
ldi R16,138
xcall _Ds1302buf_Write
.dbline 144
; Ds1302buf_Write(YEAR_W, Ds1302buf.year);
lds R18,_timebuf+6
ldi R16,140
xcall _Ds1302buf_Write
.dbline 145
; Ds1302buf_Write(POWER_W, 0x16);
ldi R18,22
ldi R16,144
xcall _Ds1302buf_Write
.dbline 146
; Ds1302buf_Write(WP_W, 0x80);
ldi R18,128
ldi R16,142
xcall _Ds1302buf_Write
.dbline 147
; sei();
sei
.dbline -2
L37:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Set_time _Set_time fV
.even
_Set_time::
.dbline -1
.dbline 158
; }
; /****************************************************************************************************************************************
; *****************************************************************************************************************************************
; *************************************以上的部分很重要不可以轻易更改!*********************************************************************
; *****************************************************************************************************************************************
; ****************************************************************************************************************************************/
; /*********************************************************************************************************************************************
; 设置时间日期
; *********************************************************************************************************************************************/
; void Set_time(void)
; {
.dbline 159
; Ds1302buf.sec = 0x10;
ldi R24,16
sts _timebuf,R24
.dbline 160
; Ds1302buf.min = 0x34;
ldi R24,52
sts _timebuf+1,R24
.dbline 161
; Ds1302buf.hour = 0x14;
ldi R24,20
sts _timebuf+2,R24
.dbline 162
; Ds1302buf.date = 0x19;
ldi R24,25
sts _timebuf+3,R24
.dbline 163
; Ds1302buf.month = 0x10;
ldi R24,16
sts _timebuf+4,R24
.dbline 164
; Ds1302buf.week = 0x04;
ldi R24,4
sts _timebuf+5,R24
.dbline 165
; Ds1302buf.year = 0x06;
ldi R24,6
sts _timebuf+6,R24
.dbline 166
; Write_InfoDs1302buf();
xcall _Write_InfoDs1302buf
.dbline -2
L44:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Printf_time _Printf_time fV
.even
_Printf_time::
.dbline -1
.dbline 172
; }
; /*********************************************************************************************************************************************
; 打印时间日期到超级终端
; *********************************************************************************************************************************************/
; void Printf_time(void)
; {
.dbline -2
L51:
.dbline 0 ; func end
ret
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -