📄 ds1302.lis
字号:
02EC 0E940000 xcall push_gset3
02F0 5801 movw R10,R16
02F2 .dbline -1
02F2 .dbline 168
02F2 ; }
02F2 ; /*******************************************
02F2 ; 函数名称: DS1302_setT
02F2 ; 功 能: 设置DS1302的时间
02F2 ; 参 数: ptTimeD--设置时间数组指针
02F2 ; 返回值 : 无
02F2 ; /********************************************/
02F2 ; void DS1302_setT(uchar ptTimeD[])
02F2 ; {
02F2 .dbline 170
02F2 ; uchar i;
02F2 ; uchar addr = 0x80; //写入地址从秒寄存器开始
02F2 40E8 ldi R20,128
02F4 .dbline 171
02F4 ; DS1302_writeD(C_WP|WR,UPROTECT); //控制命令,WP位为0,允许写操作
02F4 2227 clr R18
02F6 0EE8 ldi R16,142
02F8 BDDF xcall _DS1302_writeD
02FA .dbline 172
02FA ; Delayms(5);
02FA 05E0 ldi R16,5
02FC 10E0 ldi R17,0
02FE 6DDF xcall _Delayms
0300 .dbline 173
0300 ; for(i=0;i<7;i++)
0300 6627 clr R22
0302 0CC0 xjmp L64
0304 L61:
0304 .dbline 174
0304 .dbline 175
0304 E62F mov R30,R22
0306 FF27 clr R31
0308 EA0D add R30,R10
030A FB1D adc R31,R11
030C 2081 ldd R18,z+0
030E 042F mov R16,R20
0310 B1DF xcall _DS1302_writeD
0312 .dbline 176
0312 4E5F subi R20,254 ; addi 2
0314 .dbline 177
0314 01E0 ldi R16,1
0316 10E0 ldi R17,0
0318 60DF xcall _Delayms
031A .dbline 178
031A L62:
031A .dbline 173
031A 6395 inc R22
031C L64:
031C .dbline 173
031C 6730 cpi R22,7
031E 90F3 brlo L61
0320 .dbline 179
0320 ; {
0320 ; DS1302_writeD(addr|WR,ptTimeD[i]); // 秒 分 时 日 月 星期 年
0320 ; addr+=2;
0320 ; Delayms(1);
0320 ; }
0320 ; DS1302_writeD(C_WP|WR,PROTECT); //控制命令,WP位为1,不允许写操作
0320 20E8 ldi R18,128
0322 0EE8 ldi R16,142
0324 A7DF xcall _DS1302_writeD
0326 .dbline -2
0326 L60:
0326 0E940000 xcall pop_gset3
032A .dbline 0 ; func end
032A 0895 ret
032C .dbsym r addr 20 c
032C .dbsym r i 22 c
032C .dbsym r ptTimeD 10 pc
032C .dbend
032C .dbfunc e DS1302_getT _DS1302_getT fV
032C ; i -> R20
032C ; time -> R22,R23
.even
032C _DS1302_getT::
032C 0E940000 xcall push_gset2
0330 B801 movw R22,R16
0332 .dbline -1
0332 .dbline 188
0332 ; }
0332 ; /*******************************************
0332 ; 函数名称: DS1302_getT
0332 ; 功 能: 读取DS1302的当前时间
0332 ; 参 数: time[]--读取的时间数组
0332 ; 返回值 : 无
0332 ; /********************************************/
0332 ; void DS1302_getT(uchar time[])
0332 ; {
0332 .dbline 199
0332 ; uchar i;
0332 ; ////////下面的是单次读写//////////////////////////
0332 ; /* uchar addr = 0x80; //读取地址从秒寄存器开始
0332 ; for(i=0;i<7;i++)
0332 ; {
0332 ; time[i]=DS1302_readD(addr|RD); // 秒 分 时 日 月 星期 年
0332 ; addr+=2;
0332 ; }*/
0332 ; ////////////////////////////////////////////////////
0332 ; /////////下面是多字节读取///////////////
0332 ; PORTB&=~BIT(RTC_CS); //拉低片选端
0332 C498 cbi 0x18,4
0334 .dbline 200
0334 ; Delayus(10);
0334 0AE0 ldi R16,10
0336 10E0 ldi R17,0
0338 4EDF xcall _Delayus
033A .dbline 201
033A ; PORTB|=BIT(RTC_CS); //拉高片选端
033A C49A sbi 0x18,4
033C .dbline 202
033C ; Delayus(10); //调整片选脉冲
033C 0AE0 ldi R16,10
033E 10E0 ldi R17,0
0340 4ADF xcall _Delayus
0342 .dbline 203
0342 ; DS1302_writeB(0xbf); // 0xbf:时钟多字节读取命令
0342 0FEB ldi R16,191
0344 64DF xcall _DS1302_writeB
0346 .dbline 204
0346 ; for (i=0;i<8;i++) //时间数据的存放格式是:
0346 4427 clr R20
0348 07C0 xjmp L69
034A L66:
034A .dbline 205
034A .dbline 206
034A 77DF xcall _DS1302_readB
034C E42F mov R30,R20
034E FF27 clr R31
0350 E60F add R30,R22
0352 F71F adc R31,R23
0354 0083 std z+0,R16
0356 .dbline 207
0356 L67:
0356 .dbline 204
0356 4395 inc R20
0358 L69:
0358 .dbline 204
0358 4830 cpi R20,8
035A B8F3 brlo L66
035C .dbline 209
035C ; { //秒,分,时,日,月,星期,年,控制
035C ; time[i]=DS1302_readB(); //【7个数据(BCD格式)+1个控制】
035C ; }
035C ;
035C ; PORTB&=~BIT(RTC_CS); //拉低片选端
035C C498 cbi 0x18,4
035E .dbline 211
035E ; ///////////////////////////////////////////////
035E ; PORTB&=~BIT(RTC_CLK); //拉低时钟端(时钟端在不操作时为低)
035E C798 cbi 0x18,7
0360 .dbline -2
0360 L65:
0360 0E940000 xcall pop_gset2
0364 .dbline 0 ; func end
0364 0895 ret
0366 .dbsym r i 20 c
0366 .dbsym r time 22 pc
0366 .dbend
0366 .dbfunc e DS1302_init _DS1302_init fV
.even
0366 _DS1302_init::
0366 .dbline -1
0366 .dbline 242
0366 ; }
0366 ; /*******************************************
0366 ; 函数名称: DS1302_check
0366 ; 功 能: 检测DS1302是否正常工作
0366 ; 参 数: 无
0366 ; 返回值 : exist--为TRUE为检测到DS1302,为FALSE为没检测到
0366 ; /********************************************/
0366 ; /*uchar DS1302_check(void)
0366 ; {
0366 ; uchar exist;
0366 ; DS1302_writeD(C_WP|WR,UPROTECT); //写入写允许命令
0366 ; DS1302_writeD(C_RAMBASE|WR,0xA5); //RAM0写入0xA5
0366 ; exist=DS1302_readD(C_RAMBASE|RD); //读取RAM0
0366 ; if(exist==0xA5)
0366 ; {
0366 ; exist=TRUE; //如果读取值与写入值相等,返回TRUE
0366 ; }
0366 ; else
0366 ; {
0366 ; exist=FALSE; //如果读取值与写入值不相等,返回FALSE
0366 ; }
0366 ; return exist;
0366 ; }*/
0366 ; /*******************************************
0366 ; 函数名称: DS1302_init
0366 ; 功 能: 初始化DS1302
0366 ; 参 数: 无
0366 ; 返回值 : 无
0366 ; /********************************************/
0366 ; void DS1302_init(void)
0366 ; {
0366 .dbline 243
0366 ; DS1302_writeD(C_WP|WR,UPROTECT); //写入写允许命令
0366 2227 clr R18
0368 0EE8 ldi R16,142
036A 84DF xcall _DS1302_writeD
036C .dbline 244
036C ; DS1302_writeD(C_SEC|WR,CLK_START); //启动振荡器,DS1302开始工作
036C 2227 clr R18
036E 00E8 ldi R16,128
0370 81DF xcall _DS1302_writeD
0372 .dbline 245
0372 ; DS1302_writeD(C_WP|WR,PROTECT); //控制命令,WP位为1,不允许写操作
0372 20E8 ldi R18,128
0374 0EE8 ldi R16,142
0376 7EDF xcall _DS1302_writeD
0378 .dbline -2
0378 L70:
0378 .dbline 0 ; func end
0378 0895 ret
037A .dbend
037A .dbfunc e BCD_ASCII _BCD_ASCII fV
037A ; ptasc -> R18,R19
037A ; BCD -> R16
.even
037A _BCD_ASCII::
037A .dbline -1
037A .dbline 255
037A ; }
037A ; /*******************************************
037A ; 函数名称: BCD_ASCII
037A ; 功 能: 将压缩BCD码转换成ascii码
037A ; 参 数: BCD--将要转换的压缩BCD码
037A ; ptasc--转换后的ASCII码数组指针
037A ; 返回值 : 无
037A ; /********************************************/
037A ; void BCD_ASCII(uchar BCD,uchar ptasc[])
037A ; {
037A .dbline 256
037A ; ptasc[0]=BCD/16|0x30; //0X58 35 38 //转换十位
037A 802F mov R24,R16
037C 8295 swap R24
037E 8F70 andi R24,#0x0F
0380 8063 ori R24,48
0382 F901 movw R30,R18
0384 8083 std z+0,R24
0386 .dbline 257
0386 ; ptasc[1]=BCD&0x0F|0x30; //转换个位
0386 802F mov R24,R16
0388 8F70 andi R24,15
038A 8063 ori R24,48
038C 8183 std z+1,R24
038E .dbline -2
038E L71:
038E .dbline 0 ; func end
038E 0895 ret
0390 .dbsym r ptasc 18 pc
0390 .dbsym r BCD 16 c
0390 .dbend
.area lit(rom, con, rel)
0000 L73:
0000 0000 .byte 0,0
0002 2D00 .byte 45,0
0004 002D .byte 0,45
0006 0000 .byte 0,0
0008 2000 .byte 32,0
000A 00 .byte 0
000B L74:
000B 0000 .byte 0,0
000D 3A00 .byte 58,0
000F 003A .byte 0,58
0011 0000 .byte 0,0
0013 00 .byte 0
.area text(rom, con, rel)
0390 .dbfile D:\单片机\ds1302\ds1302_end\ds1302.c
0390 .dbfunc e Disp_time _Disp_time fV
0390 ; line1 -> y+11
0390 ; line2 -> y+2
0390 ; asc -> y+0
0390 ; i -> R20
0390 ; time -> R22,R23
.even
0390 _Disp_time::
0390 0E940000 xcall push_gset2
0394 B801 movw R22,R16
0396 6697 sbiw R28,22
0398 .dbline -1
0398 .dbline 266
0398 ; }
0398 ; /*******************************************
0398 ; 函数名称: Disp_time
0398 ; 功 能: 在1602液晶上显示当前时间(第1行格式:年-月-日 星期;第2行格式:时-分-秒)
0398 ; 参 数: time[]--时间数组
0398 ; 返回值 : 无
0398 ; /********************************************/
0398 ; void Disp_time(uchar time[])
0398 ; {
0398 .dbline 268
0398 ; uchar i,asc[2];
0398 ; uchar line1[11]={0,0,'-',0,0,'-',0,0,' ',0,'\0'};//显示第1行的字符数组
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -