📄 ds1302.s
字号:
sbci R23,255
.dbline 133
L24:
.dbline 129
inc R20
L26:
.dbline 129
cpi R20,8
brlo L23
.dbline 134
; {
; *Cdata = R_Byte(); /* 读1Byte数据 */
; Cdata++;
; }
; SET_CLK();
cbi 0x2,4
.dbline 135
; CLEAR_RST();
sbi 0x2,6
.dbline -2
L22:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r Cdata 22 pc
.dbend
.dbfunc e BurstW1302R _BurstW1302R fV
; i -> R20
; Cdata -> R22,R23
.even
_BurstW1302R::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 147
; }
; /********************************************************************
;
; 函 数 名:BurstW1302R()
; 功 能:往DS1302寄存器数写入数据(多字节方式)
; 说 明:先写地址,后写数据(寄存器多字节方式)
; 调 用:W_Byte()
; 入口参数:pWReg: 寄存器数据地址
; 返 回 值:无
; ***********************************************************************/
; void BurstW1302R(unsigned char *Cdata)
; {
.dbline 149
; unsigned char i;
; W_1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
clr R18
ldi R16,142
xcall _W_1302
.dbline 150
; CLEAR_RST();
sbi 0x2,6
.dbline 151
; CLEAR_CLK();
sbi 0x2,4
.dbline 152
; SET_RST();
cbi 0x2,6
.dbline 153
; W_Byte(0xfe); /* 0xbe:时钟多字节写命令 */
ldi R16,254
xcall _W_Byte
.dbline 154
; for (i=31; i>0; i--) /* 31Byte 寄存器数据 */
ldi R20,31
xjmp L31
L28:
.dbline 155
.dbline 156
movw R30,R22
ldd R16,z+0
xcall _W_Byte
.dbline 157
subi R22,255 ; offset = 1
sbci R23,255
.dbline 158
L29:
.dbline 154
dec R20
L31:
.dbline 154
clr R2
cp R2,R20
brlo L28
.dbline 159
; {
; W_Byte(*Cdata); /* 写1Byte数据*/
; Cdata++;
; }
; SET_CLK();
cbi 0x2,4
.dbline 160
; CLEAR_RST();
sbi 0x2,6
.dbline -2
L27:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r Cdata 22 pc
.dbend
.dbfunc e BurstR1302R _BurstR1302R fV
; i -> R20
; Cdata -> R22,R23
.even
_BurstR1302R::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 172
; }
; /********************************************************************
;
; 函 数 名:BurstR1302R()
; 功 能:读取DS1302寄存器数据
; 说 明:先写地址,后读命令/数据(寄存器多字节方式)
; 调 用:W_Byte() , R_Byte()
; 入口参数:pRReg: 寄存器数据地址
; 返 回 值:无
; ***********************************************************************/
; void BurstR1302R(unsigned char *Cdata)
; {
.dbline 174
; unsigned char i;
; CLEAR_RST();
sbi 0x2,6
.dbline 175
; CLEAR_CLK();
sbi 0x2,4
.dbline 176
; SET_RST();
cbi 0x2,6
.dbline 177
; W_Byte(0xff); /* 0xff:时钟多字节读命令 */
ldi R16,255
xcall _W_Byte
.dbline 178
; for (i=31; i>0; i--) /*31Byte 寄存器数据 */
ldi R20,31
xjmp L36
L33:
.dbline 179
.dbline 180
xcall _R_Byte
movw R30,R22
std z+0,R16
.dbline 181
subi R22,255 ; offset = 1
sbci R23,255
.dbline 182
L34:
.dbline 178
dec R20
L36:
.dbline 178
clr R2
cp R2,R20
brlo L33
.dbline 183
; {
; *Cdata = R_Byte(); /* 读1Byte数据 */
; Cdata++;
; }
; SET_CLK();
cbi 0x2,4
.dbline 184
; CLEAR_RST();
sbi 0x2,6
.dbline -2
L32:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r Cdata 22 pc
.dbend
.dbfunc e Set_1302 _Set_1302 fV
; Addr -> R20
; i -> R22
; pClock -> R10,R11
.even
_Set_1302::
xcall push_gset3
movw R10,R16
.dbline -1
.dbline 197
; }
; /********************************************************************
;
; 函 数 名:Set_1302()
; 功 能:设置初始时间
; 说 明:先写地址,后读命令/数据(寄存器多字节方式)
; 调 用:W1302()
; 入口参数:pClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
; 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
; 返 回 值:无
; ***********************************************************************/
; void Set_1302(unsigned char *pClock)
; {
.dbline 199
; unsigned char i;
; unsigned char Addr = 0x80;
ldi R20,128
.dbline 200
; W_1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
clr R18
ldi R16,142
xcall _W_1302
.dbline 201
; for(i=0;i<7;i++)
clr R22
xjmp L41
L38:
.dbline 202
.dbline 203
movw R30,R10
ldd R18,z+0
mov R16,R20
xcall _W_1302
.dbline 204
movw R24,R10
adiw R24,1
movw R10,R24
.dbline 205
subi R20,254 ; addi 2
.dbline 206
L39:
.dbline 201
inc R22
L41:
.dbline 201
cpi R22,7
brlo L38
.dbline 207
; {
; W_1302(Addr,*pClock); /* 秒 分 时 日 月 星期 年 */
; pClock++;
; Addr +=2;
; }
; W_1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
ldi R18,128
ldi R16,142
xcall _W_1302
.dbline -2
L37:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r Addr 20 c
.dbsym r i 22 c
.dbsym r pClock 10 pc
.dbend
.dbfunc e Get_1302 _Get_1302 fV
; Addr -> R20
; i -> R22
; Pclock -> R10,R11
.even
_Get_1302::
xcall push_gset3
movw R10,R16
.dbline -1
.dbline 220
; }
; /********************************************************************
;
; 函 数 名:Get_1302()
; 功 能:读取DS1302当前时间
; 说 明:
; 调 用:R1302()
; 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
; 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
; 返 回 值:无
; ***********************************************************************/
; void Get_1302(unsigned char *Pclock)
; {
.dbline 222
; unsigned char i;
; unsigned char Addr = 0x81;
ldi R20,129
.dbline 223
; for (i=0; i<7; i++)
clr R22
xjmp L46
L43:
.dbline 224
.dbline 225
mov R16,R20
xcall _R_1302
movw R30,R10
st Z+,R16
movw R10,R30
.dbline 226
subi R20,254 ; addi 2
.dbline 227
L44:
.dbline 223
inc R22
L46:
.dbline 223
cpi R22,7
brlo L43
.dbline -2
L42:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r Addr 20 c
.dbsym r i 22 c
.dbsym r Pclock 10 pc
.dbend
.dbfunc e Set_charge _Set_charge fV
; Addr -> R20
.even
_Set_charge::
xcall push_gset1
.dbline -1
.dbline 230
; {
; *Pclock++ = R_1302(Addr);/*格式为: 秒 分 时 日 月 星期 年 */
; Addr += 2;
; }
; }
; void Set_charge(void)
; {
.dbline 231
; unsigned char Addr=0x90;
ldi R20,144
.dbline 232
; W_1302(Addr,0xA6); //10100110 diode is one resistor is 4K
ldi R18,166
mov R16,R20
xcall _W_1302
.dbline -2
L47:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r Addr 20 c
.dbend
.dbfunc e delay_1 _delay_1 fV
; i -> R16
.even
_delay_1::
.dbline -1
.dbline 235
; }
; void delay_1(void)
; {
.dbline 237
clr R16
xjmp L52
L49:
.dbline 237
L50:
.dbline 237
inc R16
L52:
.dbline 237
; unsigned char i;
; for(i=0;i<5;i++);
cpi R16,5
brlo L49
.dbline -2
L48:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e CLOCK _CLOCK fV
.even
_CLOCK::
.dbline -1
.dbline 240
; }
; void CLOCK(void)
; {
.dbline 241
; SET_CLK();
cbi 0x2,4
.dbline 242
; delay_1();
xcall _delay_1
.dbline 243
; CLEAR_CLK();
sbi 0x2,4
.dbline -2
L53:
.dbline 0 ; func end
ret
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -