📄 ds1302.lis
字号:
01FC 042F mov R16,R20
01FE B5DF xcall _DS1302_writeB
0200 .dbline 139
0200 C798 cbi 0x18,7
0202 .dbline 140
0202 0AE0 ldi R16,10
0204 10E0 ldi R17,0
0206 7FDF xcall _Delayus
0208 .dbline 141
0208 AF98 cbi 0x15,7
020A .dbline -2
020A .dbline 142
020A L60:
020A 0E940000 xcall pop_gset2
020E .dbline 0 ; func end
020E 0895 ret
0210 .dbsym r data 20 c
0210 .dbsym r addr 22 c
0210 .dbend
0210 .dbfunc e DS1302_readD _DS1302_readD fc
0210 ; data -> R20
0210 ; addr -> R20
.even
0210 _DS1302_readD::
0210 0E940000 xcall push_gset1
0214 402F mov R20,R16
0216 .dbline -1
0216 .dbline 150
0216 .dbline 152
0216 AF98 cbi 0x15,7
0218 .dbline 153
0218 C798 cbi 0x18,7
021A .dbline 154
021A 0AE0 ldi R16,10
021C 10E0 ldi R17,0
021E 73DF xcall _Delayus
0220 .dbline 155
0220 AF9A sbi 0x15,7
0222 .dbline 156
0222 0AE0 ldi R16,10
0224 10E0 ldi R17,0
0226 6FDF xcall _Delayus
0228 .dbline 157
0228 042F mov R16,R20
022A 9FDF xcall _DS1302_writeB
022C .dbline 158
022C 0AE0 ldi R16,10
022E 10E0 ldi R17,0
0230 6ADF xcall _Delayus
0232 .dbline 159
0232 B1DF xcall _DS1302_readB
0234 402F mov R20,R16
0236 .dbline 160
0236 0AE0 ldi R16,10
0238 10E0 ldi R17,0
023A 65DF xcall _Delayus
023C .dbline 161
023C C798 cbi 0x18,7
023E .dbline 162
023E AF98 cbi 0x15,7
0240 .dbline 163
0240 042F mov R16,R20
0242 .dbline -2
0242 L61:
0242 0E940000 xcall pop_gset1
0246 .dbline 0 ; func end
0246 0895 ret
0248 .dbsym r data 20 c
0248 .dbsym r addr 20 c
0248 .dbend
0248 .dbfunc e DS1302_setT _DS1302_setT fV
0248 ; addr -> R20
0248 ; i -> R22
0248 ; ptTimeD -> R10,R11
.even
0248 _DS1302_setT::
0248 0E940000 xcall push_gset3
024C 5801 movw R10,R16
024E .dbline -1
024E .dbline 172
024E .dbline 174
024E ; uchar i;
024E ; uchar addr = 0x80; //写入地址从秒寄存器开始
024E 40E8 ldi R20,128
0250 .dbline 175
0250 ; DS1302_writeD(C_WP|WR,UPROTECT); //控制命令,WP位为0,允许写操作
0250 2227 clr R18
0252 0EE8 ldi R16,142
0254 BDDF xcall _DS1302_writeD
0256 .dbline 176
0256 ; Delayms(5);
0256 05E0 ldi R16,5
0258 10E0 ldi R17,0
025A 6DDF xcall _Delayms
025C .dbline 177
025C ; for(i=0;i<7;i++)
025C 6627 clr R22
025E 0CC0 xjmp L66
0260 L63:
0260 .dbline 178
0260 .dbline 179
0260 E62F mov R30,R22
0262 FF27 clr R31
0264 EA0D add R30,R10
0266 FB1D adc R31,R11
0268 2081 ldd R18,z+0
026A 042F mov R16,R20
026C B1DF xcall _DS1302_writeD
026E .dbline 180
026E 4E5F subi R20,254 ; addi 2
0270 .dbline 181
0270 01E0 ldi R16,1
0272 10E0 ldi R17,0
0274 60DF xcall _Delayms
0276 .dbline 182
0276 L64:
0276 .dbline 177
0276 6395 inc R22
0278 L66:
0278 .dbline 177
0278 6730 cpi R22,7
027A 90F3 brlo L63
027C .dbline 183
027C ; {
027C ; DS1302_writeD(addr|WR,ptTimeD[i]); // 秒 分 时 日 月 星期 年
027C ; addr+=2;
027C ; Delayms(1);
027C ; }
027C ; DS1302_writeD(C_WP|WR,PROTECT); //控制命令,WP位为1,不允许写操作
027C 20E8 ldi R18,128
027E 0EE8 ldi R16,142
0280 A7DF xcall _DS1302_writeD
0282 .dbline -2
0282 .dbline 184
0282 ; }
0282 L62:
0282 0E940000 xcall pop_gset3
0286 .dbline 0 ; func end
0286 0895 ret
0288 .dbsym r addr 20 c
0288 .dbsym r i 22 c
0288 .dbsym r ptTimeD 10 pc
0288 .dbend
0288 .dbfunc e DS1302_getT _DS1302_getT fV
0288 ; i -> R20
0288 ; time -> R22,R23
.even
0288 _DS1302_getT::
0288 0E940000 xcall push_gset2
028C B801 movw R22,R16
028E .dbline -1
028E .dbline 192
028E ; /*******************************************
028E ; 函数名称: DS1302_getT
028E ; 功 能: 读取DS1302的当前时间
028E ; 参 数: time[]--读取的时间数组
028E ; 返回值 : 无
028E ; /********************************************/
028E ; void DS1302_getT(uchar time[])
028E ; {
028E .dbline 203
028E ; uchar i;
028E ; ////////下面的是单次读写//////////////////////////
028E ; /* uchar addr = 0x80; //读取地址从秒寄存器开始
028E ; for(i=0;i<7;i++)
028E ; {
028E ; time[i]=DS1302_readD(addr|RD); // 秒 分 时 日 月 星期 年
028E ; addr+=2;
028E ; }*/
028E ; ////////////////////////////////////////////////////
028E ; /////////下面是多字节读取///////////////
028E ; PORTC&=~BIT(RTC_CS); //拉低片选端
028E AF98 cbi 0x15,7
0290 .dbline 204
0290 ; Delayus(10);
0290 0AE0 ldi R16,10
0292 10E0 ldi R17,0
0294 38DF xcall _Delayus
0296 .dbline 205
0296 ; PORTC|=BIT(RTC_CS); //拉高片选端
0296 AF9A sbi 0x15,7
0298 .dbline 206
0298 ; Delayus(10); //调整片选脉冲
0298 0AE0 ldi R16,10
029A 10E0 ldi R17,0
029C 34DF xcall _Delayus
029E .dbline 207
029E ; DS1302_writeB(0xbf); // 0xbf:时钟多字节读取命令
029E 0FEB ldi R16,191
02A0 64DF xcall _DS1302_writeB
02A2 .dbline 208
02A2 ; for (i=0;i<8;i++) //时间数据的存放格式是:
02A2 4427 clr R20
02A4 07C0 xjmp L71
02A6 L68:
02A6 .dbline 209
02A6 .dbline 210
02A6 77DF xcall _DS1302_readB
02A8 E42F mov R30,R20
02AA FF27 clr R31
02AC E60F add R30,R22
02AE F71F adc R31,R23
02B0 0083 std z+0,R16
02B2 .dbline 211
02B2 L69:
02B2 .dbline 208
02B2 4395 inc R20
02B4 L71:
02B4 .dbline 208
02B4 4830 cpi R20,8
02B6 B8F3 brlo L68
02B8 .dbline 213
02B8 ; { //秒,分,时,日,月,星期,年,控制
02B8 ; time[i]=DS1302_readB(); //【7个数据(BCD格式)+1个控制】
02B8 ; }
02B8 ;
02B8 ; PORTC&=~BIT(RTC_CS); //拉低片选端
02B8 AF98 cbi 0x15,7
02BA .dbline 215
02BA ; ///////////////////////////////////////////////
02BA ; PORTB&=~BIT(RTC_CLK); //拉低时钟端(时钟端在不操作时为低)
02BA C798 cbi 0x18,7
02BC .dbline -2
02BC .dbline 216
02BC ; }
02BC L67:
02BC 0E940000 xcall pop_gset2
02C0 .dbline 0 ; func end
02C0 0895 ret
02C2 .dbsym r i 20 c
02C2 .dbsym r time 22 pc
02C2 .dbend
02C2 .dbfunc e DS1302_check _DS1302_check fc
02C2 ; exist -> R20
.even
02C2 _DS1302_check::
02C2 0E940000 xcall push_gset1
02C6 .dbline -1
02C6 .dbline 224
02C6 ; /*******************************************
02C6 ; 函数名称: DS1302_check
02C6 ; 功 能: 检测DS1302是否正常工作
02C6 ; 参 数: 无
02C6 ; 返回值 : exist--为TRUE为检测到DS1302,为FALSE为没检测到
02C6 ; /********************************************/
02C6 ; uchar DS1302_check(void)
02C6 ; {
02C6 .dbline 226
02C6 ; uchar exist;
02C6 ; DS1302_writeD(C_WP|WR,UPROTECT); //写入写允许命令
02C6 2227 clr R18
02C8 0EE8 ldi R16,142
02CA 82DF xcall _DS1302_writeD
02CC .dbline 227
02CC ; DS1302_writeD(C_RAMBASE|WR,0xA5); //RAM0写入0xA5
02CC 25EA ldi R18,165
02CE 00EC ldi R16,192
02D0 7FDF xcall _DS1302_writeD
02D2 .dbline 228
02D2 ; exist=DS1302_readD(C_RAMBASE|RD); //读取RAM0
02D2 01EC ldi R16,193
02D4 9DDF xcall _DS1302_readD
02D6 402F mov R20,R16
02D8 .dbline 229
02D8 ; if(exist==0xA5)
02D8 053A cpi R16,165
02DA 11F4 brne L73
02DC .dbline 230
02DC ; {
02DC .dbline 231
02DC ; exist=TRUE; //如果读取值与写入值相等,返回TRUE
02DC 41E0 ldi R20,1
02DE .dbline 232
02DE ; }
02DE 01C0 xjmp L74
02E0 L73:
02E0 .dbline 234
02E0 ; else
02E0 ; {
02E0 .dbline 235
02E0 ; exist=FALSE; //如果读取值与写入值不相等,返回FALSE
02E0 4427 clr R20
02E2 .dbline 236
02E2 ; }
02E2 L74:
02E2 .dbline 237
02E2 ; return exist;
02E2 042F mov R16,R20
02E4 .dbline -2
02E4 L72:
02E4 0E940000 xcall pop_gset1
02E8 .dbline 0 ; func end
02E8 0895 ret
02EA .dbsym r exist 20 c
02EA .dbend
02EA .dbfunc e DS1302_init _DS1302_init fV
.even
02EA _DS1302_init::
02EA .dbline -1
02EA .dbline 246
02EA ; }
02EA ; /*******************************************
02EA ; 函数名称: DS1302_init
02EA ; 功 能: 初始化DS1302
02EA ; 参 数: 无
02EA ; 返回值 : 无
02EA ; /********************************************/
02EA ; void DS1302_init(void)
02EA ; {
02EA .dbline 247
02EA ; DS1302_writeD(C_WP|WR,UPROTECT); //写入写允许命令
02EA 2227 clr R18
02EC 0EE8 ldi R16,142
02EE 70DF xcall _DS1302_writeD
02F0 .dbline 248
02F0 ; DS1302_writeD(C_SEC|WR,CLK_START); //启动振荡器,DS1302开始工作
02F0 2227 clr R18
02F2 00E8 ldi R16,128
02F4 6DDF xcall _DS1302_writeD
02F6 .dbline 249
02F6 ; DS1302_writeD(C_WP|WR,PROTECT); //控制命令,WP位为1,不允许写操作
02F6 20E8 ldi R18,128
02F8 0EE8 ldi R16,142
02FA .dbline -2
02FA .dbline 250
02FA ; }
02FA L75:
02FA .dbline 0 ; func end
02FA 6ACF xjmp _DS1302_writeD
02FC .dbend
02FC .dbfunc e BCD_ASCII _BCD_ASCII fV
02FC ; ptasc -> R20,R21
02FC ; BCD -> R22
.even
02FC _BCD_ASCII::
02FC 0E940000 xcall push_gset2
0300 A901 movw R20,R18
0302 602F mov R22,R16
0304 .dbline -1
0304 .dbline 259
0304 ; /*******************************************
0304 ; 函数名称: BCD_ASCII
0304 ; 功 能: 将压缩BCD码转换成ascii码
0304 ; 参 数: BCD--将要转换的压缩BCD码
0304 ; ptasc--转换后的ASCII码数组指针
0304 ; 返回值 : 无
0304 ; /********************************************/
0304 ; void BCD_ASCII(uchar BCD,uchar ptasc[])
0304 ; {
0304 .dbline 260
0304 ; ptasc[0]=BCD/16|0x30; //0X58 35 38 //转换十位
0304 10E1 ldi R17,16
0306 062F mov R16,R22
0308 0E940000 xcall div8u
030C 802F mov R24,R16
030E 8063 ori R24,48
0310 FA01 movw R30,R20
0312 8083 std z+0,R24
0314 .dbline 261
0314 ; ptasc[1]=BCD&0x0F|0x30; //转换个位
0314 862F mov R24,R22
0316 8F70 andi R24,15
0318 8063 ori R24,48
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -