📄 ds1302.lss
字号:
278: 1f 91 pop r17
27a: 0f 91 pop r16
27c: 08 95 ret
0000027e <DS1302_readD>:
功 能: 从DS1302的某个地址读出一个字节数据
参 数: addr--地址值(寄存器或RAM)
返回值 : data--读出的数据
********************************************/
uchar DS1302_readD(uchar addr)
{
27e: 1f 93 push r17
uchar data;
CTRL_PORT&=~_BV(RTC_CS); //拉低片选端
280: a8 98 cbi 0x15, 0 ; 21
CTRL_PORT&=~_BV(RTC_CLK); //拉低时钟端
282: a9 98 cbi 0x15, 1 ; 21
284: 1a e1 ldi r17, 0x1A ; 26
286: 91 2f mov r25, r17
288: 9a 95 dec r25
28a: f1 f7 brne .-4 ; 0x288 <DS1302_readD+0xa>
//Delayus(10);
_delay_us(10);
CTRL_PORT|=_BV(RTC_CS); //拉高片选端
28c: a8 9a sbi 0x15, 0 ; 21
28e: 91 2f mov r25, r17
290: 9a 95 dec r25
292: f1 f7 brne .-4 ; 0x290 <DS1302_readD+0x12>
//Delayus(10); //调整片选脉冲
_delay_us(10);
DS1302_writeB(addr); //写入操作命令(地址)
294: 0e 94 f4 00 call 0x1e8 ; 0x1e8 <DS1302_writeB>
298: 81 2f mov r24, r17
29a: 8a 95 dec r24
29c: f1 f7 brne .-4 ; 0x29a <DS1302_readD+0x1c>
_delay_us(10);
//Delayus(10);
data=DS1302_readB(); //读出数据
29e: 0e 94 0a 01 call 0x214 ; 0x214 <DS1302_readB>
2a2: 1a 95 dec r17
2a4: f1 f7 brne .-4 ; 0x2a2 <DS1302_readD+0x24>
_delay_us(10);
//Delayus(10);
CTRL_PORT&=~_BV(RTC_CLK); //拉低时钟端
2a6: a9 98 cbi 0x15, 1 ; 21
CTRL_PORT&=~_BV(RTC_CS); //拉低片选端
2a8: a8 98 cbi 0x15, 0 ; 21
return data; //返回读出的数据
}
2aa: 1f 91 pop r17
2ac: 08 95 ret
000002ae <DS1302_setT>:
功 能: 设置DS1302的时间
参 数: ptTimeD--设置时间数组指针
返回值 : 无
********************************************/
void DS1302_setT(uchar ptTimeD[])
{
2ae: ef 92 push r14
2b0: ff 92 push r15
2b2: 0f 93 push r16
2b4: 1f 93 push r17
2b6: cf 93 push r28
2b8: df 93 push r29
2ba: 18 2f mov r17, r24
2bc: 09 2f mov r16, r25
uchar i;
uchar addr = 0x80; //写入地址从秒寄存器开始
DS1302_writeD(C_WP|WR,UPROTECT); //控制命令,WP位为0,允许写操作
2be: 8e e8 ldi r24, 0x8E ; 142
2c0: 60 e0 ldi r22, 0x00 ; 0
2c2: 0e 94 1f 01 call 0x23e ; 0x23e <DS1302_writeD>
milliseconds can be achieved.
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
2c6: 80 e7 ldi r24, 0x70 ; 112
2c8: 97 e1 ldi r25, 0x17 ; 23
2ca: 01 97 sbiw r24, 0x01 ; 1
2cc: f1 f7 brne .-4 ; 0x2ca <DS1302_setT+0x1c>
2ce: 21 2f mov r18, r17
2d0: 30 2f mov r19, r16
2d2: c9 01 movw r24, r18
2d4: ec 01 movw r28, r24
2d6: 10 e8 ldi r17, 0x80 ; 128
_delay_ms(3);
//Delayms(5);
for(i=0;i<7;i++)
{
DS1302_writeD(addr|WR,ptTimeD[i]); // 秒 分 时 日 月 星期 年
2d8: 88 ee ldi r24, 0xE8 ; 232
2da: e8 2e mov r14, r24
2dc: 83 e0 ldi r24, 0x03 ; 3
2de: f8 2e mov r15, r24
2e0: 81 2f mov r24, r17
2e2: 69 91 ld r22, Y+
2e4: 0e 94 1f 01 call 0x23e ; 0x23e <DS1302_writeD>
addr+=2;
2e8: 1e 5f subi r17, 0xFE ; 254
2ea: c7 01 movw r24, r14
2ec: 01 97 sbiw r24, 0x01 ; 1
2ee: f1 f7 brne .-4 ; 0x2ec <DS1302_setT+0x3e>
uchar i;
uchar addr = 0x80; //写入地址从秒寄存器开始
DS1302_writeD(C_WP|WR,UPROTECT); //控制命令,WP位为0,允许写操作
_delay_ms(3);
//Delayms(5);
for(i=0;i<7;i++)
2f0: 1e 38 cpi r17, 0x8E ; 142
2f2: b1 f7 brne .-20 ; 0x2e0 <DS1302_setT+0x32>
DS1302_writeD(addr|WR,ptTimeD[i]); // 秒 分 时 日 月 星期 年
addr+=2;
// Delayms(1);
_delay_us(500);
}
DS1302_writeD(C_WP|WR,PROTECT); //控制命令,WP位为1,不允许写操作
2f4: 8e e8 ldi r24, 0x8E ; 142
2f6: 60 e8 ldi r22, 0x80 ; 128
2f8: 0e 94 1f 01 call 0x23e ; 0x23e <DS1302_writeD>
}
2fc: df 91 pop r29
2fe: cf 91 pop r28
300: 1f 91 pop r17
302: 0f 91 pop r16
304: ff 90 pop r15
306: ef 90 pop r14
308: 08 95 ret
0000030a <DS1302_getT>:
功 能: 读取DS1302的当前时间
参 数: time[]--读取的时间数组
返回值 : 无
********************************************/
void DS1302_getT(uchar time[])
{
30a: 0f 93 push r16
30c: 1f 93 push r17
30e: cf 93 push r28
310: df 93 push r29
312: 8c 01 movw r16, r24
time[i]=DS1302_readD(addr|RD); // 秒 分 时 日 月 星期 年
addr+=2;
}*/
////////////////////////////////////////////////////
/////////下面是多字节读取///////////////
CTRL_PORT&=~_BV(RTC_CS); //拉低片选端
314: a8 98 cbi 0x15, 0 ; 21
can be achieved.
*/
void
_delay_loop_1(uint8_t __count)
{
__asm__ volatile (
316: 8a e1 ldi r24, 0x1A ; 26
318: 98 2f mov r25, r24
31a: 9a 95 dec r25
31c: f1 f7 brne .-4 ; 0x31a <DS1302_getT+0x10>
_delay_us(10);
//Delayus(10);
CTRL_PORT|=_BV(RTC_CS); //拉高片选端
31e: a8 9a sbi 0x15, 0 ; 21
320: 8a 95 dec r24
322: f1 f7 brne .-4 ; 0x320 <DS1302_getT+0x16>
_delay_us(10);
// Delayus(10); //调整片选脉冲
DS1302_writeB(C_BURSTD); // 0xbf:时钟多字节读取命令
324: 8f eb ldi r24, 0xBF ; 191
326: 0e 94 f4 00 call 0x1e8 ; 0x1e8 <DS1302_writeB>
32a: c0 e0 ldi r28, 0x00 ; 0
32c: d0 e0 ldi r29, 0x00 ; 0
for (i=0;i<8;i++) //时间数据的存放格式是:
{ //秒,分,时,日,月,星期,年,控制
time[i]=DS1302_readB(); //【7个数据(BCD格式)+1个控制】
32e: 0e 94 0a 01 call 0x214 ; 0x214 <DS1302_readB>
332: f8 01 movw r30, r16
334: ec 0f add r30, r28
336: fd 1f adc r31, r29
338: 80 83 st Z, r24
33a: 21 96 adiw r28, 0x01 ; 1
//Delayus(10);
CTRL_PORT|=_BV(RTC_CS); //拉高片选端
_delay_us(10);
// Delayus(10); //调整片选脉冲
DS1302_writeB(C_BURSTD); // 0xbf:时钟多字节读取命令
for (i=0;i<8;i++) //时间数据的存放格式是:
33c: c8 30 cpi r28, 0x08 ; 8
33e: d1 05 cpc r29, r1
340: b1 f7 brne .-20 ; 0x32e <DS1302_getT+0x24>
{ //秒,分,时,日,月,星期,年,控制
time[i]=DS1302_readB(); //【7个数据(BCD格式)+1个控制】
}
CTRL_PORT|=_BV(RTC_CS); //拉高片选端
342: a8 9a sbi 0x15, 0 ; 21
344: 8a e1 ldi r24, 0x1A ; 26
346: 8a 95 dec r24
348: f1 f7 brne .-4 ; 0x346 <DS1302_getT+0x3c>
_delay_us(10);
CTRL_PORT&=~_BV(RTC_CS); //拉低片选端
34a: a8 98 cbi 0x15, 0 ; 21
///////////////////////////////////////////////
CTRL_PORT&=~_BV(RTC_CLK); //拉低时钟端(时钟端在不操作时为低)
34c: a9 98 cbi 0x15, 1 ; 21
}
34e: df 91 pop r29
350: cf 91 pop r28
352: 1f 91 pop r17
354: 0f 91 pop r16
356: 08 95 ret
00000358 <DS1302_check>:
返回值 : exist--为TRUE为检测到DS1302,为FALSE为没检测到
********************************************/
uchar DS1302_check(void)
{
uchar exist;
DS1302_writeD(C_WP|WR,UPROTECT); //写入写允许命令
358: 8e e8 ldi r24, 0x8E ; 142
35a: 60 e0 ldi r22, 0x00 ; 0
35c: 0e 94 1f 01 call 0x23e ; 0x23e <DS1302_writeD>
DS1302_writeD(C_RAMBASE|WR,0xA5); //RAM0写入0xA5
360: 80 ec ldi r24, 0xC0 ; 192
362: 65 ea ldi r22, 0xA5 ; 165
364: 0e 94 1f 01 call 0x23e ; 0x23e <DS1302_writeD>
exist=DS1302_readD(C_RAMBASE|RD); //读取RAM0
368: 81 ec ldi r24, 0xC1 ; 193
36a: 0e 94 3f 01 call 0x27e ; 0x27e <DS1302_readD>
36e: 90 e0 ldi r25, 0x00 ; 0
370: 85 3a cpi r24, 0xA5 ; 165
372: 09 f4 brne .+2 ; 0x376 <DS1302_check+0x1e>
374: 91 e0 ldi r25, 0x01 ; 1
else
{
exist=FALSE; //如果读取值与写入值不相等,返回FALSE
}
return exist;
}
376: 89 2f mov r24, r25
378: 08 95 ret
0000037a <DS1302_init>:
参 数: 无
返回值 : 无
********************************************/
void DS1302_init(void)
{
DS1302_writeD(C_WP|WR,UPROTECT); //写入写允许命令
37a: 8e e8 ldi r24, 0x8E ; 142
37c: 60 e0 ldi r22, 0x00 ; 0
37e: 0e 94 1f 01 call 0x23e ; 0x23e <DS1302_writeD>
DS1302_writeD(C_SEC|WR,CLK_START); //启动振荡器,DS1302开始工作
382: 80 e8 ldi r24, 0x80 ; 128
384: 60 e0 ldi r22, 0x00 ; 0
386: 0e 94 1f 01 call 0x23e ; 0x23e <DS1302_writeD>
DS1302_writeD(C_WP|WR,PROTECT); //控制命令,WP位为1,不允许写操作
38a: 8e e8 ldi r24, 0x8E ; 142
38c: 60 e8 ldi r22, 0x80 ; 128
38e: 0e 94 1f 01 call 0x23e ; 0x23e <DS1302_writeD>
}
392: 08 95 ret
00000394 <BCD_ASCII>:
参 数: BCD--将要转换的压缩BCD码
ptasc--转换后的ASCII码数组指针
返回值 : 无
********************************************/
void BCD_ASCII(uchar BCD,uchar ptasc[])
{
394: fb 01 movw r30, r22
ptasc[0]=(BCD/16)|0x30; //0X58 35 38 //转换十位
396: 98 2f mov r25, r24
398: 92 95 swap r25
39a: 9f 70 andi r25, 0x0F ; 15
39c: 90 63 ori r25, 0x30 ; 48
39e: 90 83 st Z, r25
ptasc[1]=(BCD&0x0F)|0x30; //转换个位
3a0: 8f 70 andi r24, 0x0F ; 15
3a2: 80 63 ori r24, 0x30 ; 48
3a4: 81 83 std Z+1, r24 ; 0x01
}
3a6: 08 95 ret
000003a8 <Disp_time>:
功 能: 在1602液晶上显示当前时间(第1行格式:年-月-日 星期;第2行格式:时-分-秒)
参 数: time[]--时间数组
返回值 : 无
********************************************/
void Disp_time(uchar time[])
{
3a8: 8f 92 push r8
3aa: 9f 92 push r9
3ac: af 92 push r10
3ae: bf 92 push r11
3b0: cf 92 push r12
3b2: df 92 push r13
3b4: ef 92 push r14
3b6: ff 92 push r15
3b8: 0f 93 push r16
3ba: 1f 93 push r17
3bc: df 93 push r29
3be: cf 93 push r28
3c0: cd b7 in r28, 0x3d ; 61
3c2: de b7 in r29, 0x3e ; 62
3c4: 69 97 sbiw r28, 0x19 ; 25
3c6: 0f b6 in r0, 0x3f ; 63
3c8: f8 94 cli
3ca: de bf out 0x3e, r29 ; 62
3cc: 0f be out 0x3f, r0 ; 63
3ce: cd bf out 0x3d, r28 ; 61
3d0: 6c 01 movw r12, r24
uchar i=0,asc[2];
uchar line1[11]={0,0,'-',0,0,'-',0,0,' ',0,'\0'};//显示第1行的字符数组
3d2: de 01 movw r26, r28
3d4: 1f 96 adiw r26, 0x0f ; 15
3d6: e3 e7 ldi r30, 0x73 ; 115
3d8: f0 e0 ldi r31, 0x00 ; 0
3da: 8b e0 ldi r24, 0x0B ; 11
3dc: 01 90 ld r0, Z+
3de: 0d 92 st X+, r0
3e0: 81 50 subi r24, 0x01 ; 1
3e2: e1 f7 brne .-8 ; 0x3dc <Disp_time+0x34>
uchar line2[9]={0,0,':',0,0,':',0,0,'\0'}; //显示第2行的字符数组
3e4: de 01 movw r26, r28
3e6: 16 96 adiw r26, 0x06 ; 6
3e8: ea e6 ldi r30, 0x6A ; 106
3ea: f0 e0 ldi r31, 0x00 ; 0
3ec: 89 e0 ldi r24, 0x09 ; 9
3ee: 01 90 ld r0, Z+
3f0: 0d 92 st X+, r0
3f2: 81 50 subi r24, 0x01 ; 1
3f4: e1 f7 brne .-8 ; 0x3ee <Disp_time+0x46>
uchar line3[3]={'2','0','\0'};
3f6: de 01 movw r26, r28
3f8: 13 96 adiw r26, 0x03 ; 3
3fa: e7 e6 ldi r30, 0x67 ; 103
3fc: f0 e0 ldi r31, 0x00 ; 0
3fe: 83 e0 ldi r24, 0x03 ; 3
400: 01 90 ld r0, Z+
402: 0d 92 st X+, r0
404: 81 50 subi r24, 0x01 ; 1
406: e1 f7 brne .-8 ; 0x400 <Disp_time+0x58>
408: 76 01 movw r14, r12
40a: 8e 01 movw r16, r28
40c: 0a 5f subi r16, 0xFA ; 250
40e: 1f 4f sbci r17, 0xFF ; 255
for(i=0;i<3;i++) //为第2行的字符数组赋值
{
BCD_ASCII(time[2-i],asc);
410: 5e 01 movw r10, r28
412: 08 94 sec
414: a1 1c adc r10, r1
416: b1 1c adc r11, r1
{
uchar i=0,asc[2];
uchar line1[11]={0,0,'-',0,0,'-',0,0,' ',0,'\0'};//显示第1行的字符数组
uchar line2[9]={0,0,':',0,0,':',0,0,'\0'}; //显示第2行的字符数组
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -