📄 ds1302.lis
字号:
016E .dbline 175
016E ; CLEAR_CLK();
016E 0E940000 xcall _CLEAR_CLK
0172 .dbline 176
0172 ; SET_RST();
0172 0E940000 xcall _SET_RST
0176 .dbline 177
0176 ; W_Byte(0xff); /* 0xff:时钟多字节读命令 */
0176 0FEF ldi R16,255
0178 43DF xcall _W_Byte
017A .dbline 178
017A ; for (i=31; i>0; i--) /*31Byte 寄存器数据 */
017A 4FE1 ldi R20,31
017C 06C0 xjmp L36
017E L33:
017E .dbline 179
017E .dbline 180
017E 54DF xcall _R_Byte
0180 FB01 movw R30,R22
0182 0083 std z+0,R16
0184 .dbline 181
0184 6F5F subi R22,255 ; offset = 1
0186 7F4F sbci R23,255
0188 .dbline 182
0188 L34:
0188 .dbline 178
0188 4A95 dec R20
018A L36:
018A .dbline 178
018A 2224 clr R2
018C 2416 cp R2,R20
018E B8F3 brlo L33
0190 .dbline 183
0190 ; {
0190 ; *Cdata = R_Byte(); /* 读1Byte数据 */
0190 ; Cdata++;
0190 ; }
0190 ; SET_CLK();
0190 0E940000 xcall _SET_CLK
0194 .dbline 184
0194 ; CLEAR_RST();
0194 0E940000 xcall _CLEAR_RST
0198 .dbline -2
0198 L32:
0198 0E940000 xcall pop_gset2
019C .dbline 0 ; func end
019C 0895 ret
019E .dbsym r i 20 c
019E .dbsym r Cdata 22 pc
019E .dbend
019E .dbfunc e Set_1302 _Set_1302 fV
019E ; Addr -> R20
019E ; i -> R22
019E ; pClock -> R10,R11
.even
019E _Set_1302::
019E 0E940000 xcall push_gset3
01A2 5801 movw R10,R16
01A4 .dbline -1
01A4 .dbline 197
01A4 ; }
01A4 ; /********************************************************************
01A4 ;
01A4 ; 函 数 名:Set_1302()
01A4 ; 功 能:设置初始时间
01A4 ; 说 明:先写地址,后读命令/数据(寄存器多字节方式)
01A4 ; 调 用:W1302()
01A4 ; 入口参数:pClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
01A4 ; 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
01A4 ; 返 回 值:无
01A4 ; ***********************************************************************/
01A4 ; void Set_1302(unsigned char *pClock)
01A4 ; {
01A4 .dbline 199
01A4 ; unsigned char i;
01A4 ; unsigned char Addr = 0x80;
01A4 40E8 ldi R20,128
01A6 .dbline 200
01A6 ; W_1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
01A6 2227 clr R18
01A8 0EE8 ldi R16,142
01AA 55DF xcall _W_1302
01AC .dbline 201
01AC ; for(i=0;i<7;i++)
01AC 6627 clr R22
01AE 09C0 xjmp L41
01B0 L38:
01B0 .dbline 202
01B0 .dbline 203
01B0 F501 movw R30,R10
01B2 2081 ldd R18,z+0
01B4 042F mov R16,R20
01B6 4FDF xcall _W_1302
01B8 .dbline 204
01B8 C501 movw R24,R10
01BA 0196 adiw R24,1
01BC 5C01 movw R10,R24
01BE .dbline 205
01BE 4E5F subi R20,254 ; addi 2
01C0 .dbline 206
01C0 L39:
01C0 .dbline 201
01C0 6395 inc R22
01C2 L41:
01C2 .dbline 201
01C2 6730 cpi R22,7
01C4 A8F3 brlo L38
01C6 .dbline 207
01C6 ; {
01C6 ; W_1302(Addr,*pClock); /* 秒 分 时 日 月 星期 年 */
01C6 ; pClock++;
01C6 ; Addr +=2;
01C6 ; }
01C6 ; W_1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
01C6 20E8 ldi R18,128
01C8 0EE8 ldi R16,142
01CA 45DF xcall _W_1302
01CC .dbline -2
01CC L37:
01CC 0E940000 xcall pop_gset3
01D0 .dbline 0 ; func end
01D0 0895 ret
01D2 .dbsym r Addr 20 c
01D2 .dbsym r i 22 c
01D2 .dbsym r pClock 10 pc
01D2 .dbend
01D2 .dbfunc e Get_1302 _Get_1302 fV
01D2 ; Addr -> R20
01D2 ; i -> R22
01D2 ; Pclock -> R10,R11
.even
01D2 _Get_1302::
01D2 0E940000 xcall push_gset3
01D6 5801 movw R10,R16
01D8 .dbline -1
01D8 .dbline 220
01D8 ; }
01D8 ; /********************************************************************
01D8 ;
01D8 ; 函 数 名:Get_1302()
01D8 ; 功 能:读取DS1302当前时间
01D8 ; 说 明:
01D8 ; 调 用:R1302()
01D8 ; 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
01D8 ; 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
01D8 ; 返 回 值:无
01D8 ; ***********************************************************************/
01D8 ; void Get_1302(unsigned char *Pclock)
01D8 ; {
01D8 .dbline 222
01D8 ; unsigned char i;
01D8 ; unsigned char Addr = 0x81;
01D8 41E8 ldi R20,129
01DA .dbline 223
01DA ; for (i=0; i<7; i++)
01DA 6627 clr R22
01DC 07C0 xjmp L46
01DE L43:
01DE .dbline 224
01DE .dbline 225
01DE 042F mov R16,R20
01E0 51DF xcall _R_1302
01E2 F501 movw R30,R10
01E4 0193 st Z+,R16
01E6 5F01 movw R10,R30
01E8 .dbline 226
01E8 4E5F subi R20,254 ; addi 2
01EA .dbline 227
01EA L44:
01EA .dbline 223
01EA 6395 inc R22
01EC L46:
01EC .dbline 223
01EC 6730 cpi R22,7
01EE B8F3 brlo L43
01F0 .dbline -2
01F0 L42:
01F0 0E940000 xcall pop_gset3
01F4 .dbline 0 ; func end
01F4 0895 ret
01F6 .dbsym r Addr 20 c
01F6 .dbsym r i 22 c
01F6 .dbsym r Pclock 10 pc
01F6 .dbend
01F6 .dbfunc e Set_charge _Set_charge fV
01F6 ; Addr -> R20
.even
01F6 _Set_charge::
01F6 0E940000 xcall push_gset1
01FA .dbline -1
01FA .dbline 230
01FA ; {
01FA ; *Pclock++ = R_1302(Addr);/*格式为: 秒 分 时 日 月 星期 年 */
01FA ; Addr += 2;
01FA ; }
01FA ; }
01FA ; void Set_charge(void)
01FA ; {
01FA .dbline 231
01FA ; unsigned char Addr=0x90;
01FA 40E9 ldi R20,144
01FC .dbline 232
01FC ; W_1302(Addr,0xA6); //10100110 diode is one resistor is 4K
01FC 26EA ldi R18,166
01FE 042F mov R16,R20
0200 2ADF xcall _W_1302
0202 .dbline -2
0202 L47:
0202 0E940000 xcall pop_gset1
0206 .dbline 0 ; func end
0206 0895 ret
0208 .dbsym r Addr 20 c
0208 .dbend
0208 .dbfunc e delay_1 _delay_1 fV
0208 ; i -> R16
.even
0208 _delay_1::
0208 .dbline -1
0208 .dbline 235
0208 ; }
0208 ; void delay_1(void)
0208 ; {
0208 .dbline 237
0208 0027 clr R16
020A 01C0 xjmp L52
020C L49:
020C .dbline 237
020C L50:
020C .dbline 237
020C 0395 inc R16
020E L52:
020E .dbline 237
020E ; unsigned char i;
020E ; for(i=0;i<5;i++);
020E 0530 cpi R16,5
0210 E8F3 brlo L49
0212 .dbline -2
0212 L48:
0212 .dbline 0 ; func end
0212 0895 ret
0214 .dbsym r i 16 c
0214 .dbend
0214 .dbfunc e CLOCK _CLOCK fV
.even
0214 _CLOCK::
0214 .dbline -1
0214 .dbline 240
0214 ; }
0214 ; void CLOCK(void)
0214 ; {
0214 .dbline 241
0214 ; SET_CLK();
0214 0E940000 xcall _SET_CLK
0218 .dbline 242
0218 ; delay_1();
0218 F7DF xcall _delay_1
021A .dbline 243
021A ; CLEAR_CLK();
021A 0E940000 xcall _CLEAR_CLK
021E .dbline -2
021E L53:
021E .dbline 0 ; func end
021E 0895 ret
0220 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -