📄 ds1302.lis
字号:
01A4 .dbline 159
01A4 ; Delayus(10); //调整片选脉冲
01A4 0AE0 ldi R16,10
01A6 10E0 ldi R17,0
01A8 64DF xcall _Delayus
01AA .dbline 160
01AA ; DS1302_writeB(addr); //写入操作命令(地址)
01AA 042F mov R16,R20
01AC 94DF xcall _DS1302_writeB
01AE .dbline 161
01AE ; Delayus(10);
01AE 0AE0 ldi R16,10
01B0 10E0 ldi R17,0
01B2 5FDF xcall _Delayus
01B4 .dbline 162
01B4 ; data=DS1302_readB(); //读出数据
01B4 A6DF xcall _DS1302_readB
01B6 402F mov R20,R16
01B8 .dbline 163
01B8 ; Delayus(10);
01B8 0AE0 ldi R16,10
01BA 10E0 ldi R17,0
01BC 5ADF xcall _Delayus
01BE .dbline 164
01BE ; PORTC&=~BIT(RTC_CLK); //拉低时钟端
01BE AF98 cbi 0x15,7
01C0 .dbline 165
01C0 ; PORTC&=~BIT(RTC_CS); //拉低片选端
01C0 A998 cbi 0x15,1
01C2 .dbline 166
01C2 ; return data; //返回读出的数据
01C2 042F mov R16,R20
01C4 .dbline -2
01C4 L41:
01C4 0E940000 xcall pop_gset1
01C8 .dbline 0 ; func end
01C8 0895 ret
01CA .dbsym r data 20 c
01CA .dbsym r addr 20 c
01CA .dbend
01CA .dbfunc e DS1302_setT _DS1302_setT fV
01CA ; addr -> R20
01CA ; i -> R22
01CA ; ptTimeD -> R10,R11
.even
01CA _DS1302_setT::
01CA 0E940000 xcall push_gset3
01CE 5801 movw R10,R16
01D0 .dbline -1
01D0 .dbline 175
01D0 ; }
01D0 ; /*******************************************
01D0 ; 函数名称: DS1302_setT
01D0 ; 功 能: 设置DS1302的时间
01D0 ; 参 数: ptTimeD--设置时间数组指针
01D0 ; 返回值 : 无
01D0 ; /********************************************/
01D0 ; void DS1302_setT(uchar ptTimeD[])
01D0 ; {
01D0 .dbline 177
01D0 ; uchar i;
01D0 ; uchar addr = 0x80; //写入地址从秒寄存器开始
01D0 40E8 ldi R20,128
01D2 .dbline 178
01D2 ; DS1302_writeD(C_WP|WR,UPROTECT); //控制命令,WP位为0,允许写操作
01D2 2227 clr R18
01D4 0EE8 ldi R16,142
01D6 BDDF xcall _DS1302_writeD
01D8 .dbline 179
01D8 ; Delayms(5);
01D8 05E0 ldi R16,5
01DA 10E0 ldi R17,0
01DC 62DF xcall _Delayms
01DE .dbline 180
01DE ; for(i=0;i<2;i++)
01DE 6627 clr R22
01E0 0CC0 xjmp L46
01E2 L43:
01E2 .dbline 181
01E2 .dbline 182
01E2 E62F mov R30,R22
01E4 FF27 clr R31
01E6 EA0D add R30,R10
01E8 FB1D adc R31,R11
01EA 2081 ldd R18,z+0
01EC 042F mov R16,R20
01EE B1DF xcall _DS1302_writeD
01F0 .dbline 183
01F0 4E5F subi R20,254 ; addi 2
01F2 .dbline 184
01F2 01E0 ldi R16,1
01F4 10E0 ldi R17,0
01F6 55DF xcall _Delayms
01F8 .dbline 185
01F8 L44:
01F8 .dbline 180
01F8 6395 inc R22
01FA L46:
01FA .dbline 180
01FA 6230 cpi R22,2
01FC 90F3 brlo L43
01FE .dbline 186
01FE ; {
01FE ; DS1302_writeD(addr|WR,ptTimeD[i]); // 秒 分 时 日 月 星期 年
01FE ; addr+=2;
01FE ; Delayms(1);
01FE ; }
01FE ; DS1302_writeD(C_WP|WR,PROTECT); //控制命令,WP位为1,不允许写操作
01FE 20E8 ldi R18,128
0200 0EE8 ldi R16,142
0202 A7DF xcall _DS1302_writeD
0204 .dbline -2
0204 L42:
0204 0E940000 xcall pop_gset3
0208 .dbline 0 ; func end
0208 0895 ret
020A .dbsym r addr 20 c
020A .dbsym r i 22 c
020A .dbsym r ptTimeD 10 pc
020A .dbend
020A .dbfunc e DS1302_getT _DS1302_getT fV
020A ; i -> R20
020A ; time -> R22,R23
.even
020A _DS1302_getT::
020A 0E940000 xcall push_gset2
020E B801 movw R22,R16
0210 .dbline -1
0210 .dbline 195
0210 ; }
0210 ; /*******************************************
0210 ; 函数名称: DS1302_getT
0210 ; 功 能: 读取DS1302的当前时间
0210 ; 参 数: time[]--读取的时间数组
0210 ; 返回值 : 无
0210 ; /********************************************/
0210 ; void DS1302_getT(uchar time[])
0210 ; {
0210 .dbline 197
0210 ; uchar i;
0210 ; PORTC&=~BIT(RTC_CS); //拉低片选端
0210 A998 cbi 0x15,1
0212 .dbline 198
0212 ; Delayus(10);
0212 0AE0 ldi R16,10
0214 10E0 ldi R17,0
0216 2DDF xcall _Delayus
0218 .dbline 199
0218 ; PORTC|=BIT(RTC_CS); //拉高片选端
0218 A99A sbi 0x15,1
021A .dbline 200
021A ; Delayus(10); //调整片选脉冲
021A 0AE0 ldi R16,10
021C 10E0 ldi R17,0
021E 29DF xcall _Delayus
0220 .dbline 201
0220 ; DS1302_writeB(0xbf); // 0xbf:时钟多字节读取命令
0220 0FEB ldi R16,191
0222 59DF xcall _DS1302_writeB
0224 .dbline 202
0224 ; for (i=0;i<2;i++) //时间数据的存放格式是:
0224 4427 clr R20
0226 07C0 xjmp L51
0228 L48:
0228 .dbline 203
0228 .dbline 204
0228 6CDF xcall _DS1302_readB
022A E42F mov R30,R20
022C FF27 clr R31
022E E60F add R30,R22
0230 F71F adc R31,R23
0232 0083 std z+0,R16
0234 .dbline 205
0234 L49:
0234 .dbline 202
0234 4395 inc R20
0236 L51:
0236 .dbline 202
0236 4230 cpi R20,2
0238 B8F3 brlo L48
023A .dbline 207
023A ; { //秒,分,时,日,月,星期,年,控制
023A ; time[i]=DS1302_readB(); //【7个数据(BCD格式)+1个控制】
023A ; }
023A ;
023A ; PORTC&=~BIT(RTC_CS); //拉低片选端
023A A998 cbi 0x15,1
023C .dbline 208
023C ; PORTC&=~BIT(RTC_CLK); //拉低时钟端(时钟端在不操作时为低)
023C AF98 cbi 0x15,7
023E .dbline -2
023E L47:
023E 0E940000 xcall pop_gset2
0242 .dbline 0 ; func end
0242 0895 ret
0244 .dbsym r i 20 c
0244 .dbsym r time 22 pc
0244 .dbend
0244 .dbfunc e DS1302_check _DS1302_check fc
0244 ; exist -> R20
.even
0244 _DS1302_check::
0244 0E940000 xcall push_gset1
0248 .dbline -1
0248 .dbline 217
0248 ; }
0248 ; /*******************************************
0248 ; 函数名称: DS1302_check
0248 ; 功 能: 检测DS1302是否正常工作
0248 ; 参 数: 无
0248 ; 返回值 : exist--为TRUE为检测到DS1302,为FALSE为没检测到
0248 ; /********************************************/
0248 ; uchar DS1302_check(void)
0248 ; {
0248 .dbline 219
0248 ; uchar exist;
0248 ; DS1302_writeD(C_WP|WR,UPROTECT); //写入写允许命令
0248 2227 clr R18
024A 0EE8 ldi R16,142
024C 82DF xcall _DS1302_writeD
024E .dbline 220
024E ; DS1302_writeD(C_RAMBASE|WR,0xA5); //RAM0写入0xA5
024E 25EA ldi R18,165
0250 00EC ldi R16,192
0252 7FDF xcall _DS1302_writeD
0254 .dbline 221
0254 ; exist=DS1302_readD(C_RAMBASE|RD); //读取RAM0
0254 01EC ldi R16,193
0256 9DDF xcall _DS1302_readD
0258 402F mov R20,R16
025A .dbline 222
025A ; if(exist==0xA5)
025A 053A cpi R16,165
025C 11F4 brne L53
025E .dbline 223
025E ; {
025E .dbline 224
025E ; exist=TRUE; //如果读取值与写入值相等,返回TRUE
025E 41E0 ldi R20,1
0260 .dbline 225
0260 ; }
0260 01C0 xjmp L54
0262 L53:
0262 .dbline 227
0262 ; else
0262 ; {
0262 .dbline 228
0262 ; exist=FALSE; //如果读取值与写入值不相等,返回FALSE
0262 4427 clr R20
0264 .dbline 229
0264 ; }
0264 L54:
0264 .dbline 230
0264 ; return exist;
0264 042F mov R16,R20
0266 .dbline -2
0266 L52:
0266 0E940000 xcall pop_gset1
026A .dbline 0 ; func end
026A 0895 ret
026C .dbsym r exist 20 c
026C .dbend
026C .dbfunc e DS1302_init _DS1302_init fV
.even
026C _DS1302_init::
026C .dbline -1
026C .dbline 239
026C ; }
026C ; /*******************************************
026C ; 函数名称: DS1302_init
026C ; 功 能: 初始化DS1302
026C ; 参 数: 无
026C ; 返回值 : 无
026C ; /********************************************/
026C ; void DS1302_init(void)
026C ; {
026C .dbline 240
026C ; DS1302_writeD(C_WP|WR,UPROTECT); //写入写允许命令
026C 2227 clr R18
026E 0EE8 ldi R16,142
0270 70DF xcall _DS1302_writeD
0272 .dbline 241
0272 ; DS1302_writeD(C_SEC|WR,CLK_START); //启动振荡器,DS1302开始工作
0272 2227 clr R18
0274 00E8 ldi R16,128
0276 6DDF xcall _DS1302_writeD
0278 .dbline 242
0278 ; DS1302_writeD(C_WP|WR,PROTECT); //控制命令,WP位为1,不允许写操作
0278 20E8 ldi R18,128
027A 0EE8 ldi R16,142
027C 6ADF xcall _DS1302_writeD
027E .dbline -2
027E L55:
027E .dbline 0 ; func end
027E 0895 ret
0280 .dbend
0280 .dbfunc e BCD_ASCII _BCD_ASCII fV
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -