📄 ds1302.lss
字号:
uchar line3[3]={'2','0','\0'};
for(i=0;i<3;i++) //为第2行的字符数组赋值
418: 9f e0 ldi r25, 0x0F ; 15
41a: 89 2e mov r8, r25
41c: 91 2c mov r9, r1
41e: 8c 0e add r8, r28
420: 9d 1e adc r9, r29
{
BCD_ASCII(time[2-i],asc);
422: f7 01 movw r30, r14
424: 82 81 ldd r24, Z+2 ; 0x02
426: b5 01 movw r22, r10
428: 0e 94 ca 01 call 0x394 ; 0x394 <BCD_ASCII>
line2[i*3]=asc[0];
42c: 89 81 ldd r24, Y+1 ; 0x01
42e: f8 01 movw r30, r16
430: 80 83 st Z, r24
line2[i*3+1]=asc[1];
432: 8a 81 ldd r24, Y+2 ; 0x02
434: 81 83 std Z+1, r24 ; 0x01
436: 08 94 sec
438: e1 08 sbc r14, r1
43a: f1 08 sbc r15, r1
43c: 0d 5f subi r16, 0xFD ; 253
43e: 1f 4f sbci r17, 0xFF ; 255
{
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行的字符数组
uchar line3[3]={'2','0','\0'};
for(i=0;i<3;i++) //为第2行的字符数组赋值
440: 08 15 cp r16, r8
442: 19 05 cpc r17, r9
444: 71 f7 brne .-36 ; 0x422 <Disp_time+0x7a>
{
BCD_ASCII(time[2-i],asc);
line2[i*3]=asc[0];
line2[i*3+1]=asc[1];
}
BCD_ASCII(time[6],asc); //为第1行的年赋值
446: f6 01 movw r30, r12
448: 86 81 ldd r24, Z+6 ; 0x06
44a: b5 01 movw r22, r10
44c: 0e 94 ca 01 call 0x394 ; 0x394 <BCD_ASCII>
line1[0]=asc[0];
450: 89 81 ldd r24, Y+1 ; 0x01
452: 8f 87 std Y+15, r24 ; 0x0f
line1[1]=asc[1];
454: 8a 81 ldd r24, Y+2 ; 0x02
456: 88 8b std Y+16, r24 ; 0x10
BCD_ASCII(time[4],asc); //为第1行的月赋值
458: f6 01 movw r30, r12
45a: 84 81 ldd r24, Z+4 ; 0x04
45c: b5 01 movw r22, r10
45e: 0e 94 ca 01 call 0x394 ; 0x394 <BCD_ASCII>
line1[3]=asc[0];
462: 89 81 ldd r24, Y+1 ; 0x01
464: 8a 8b std Y+18, r24 ; 0x12
line1[4]=asc[1];
466: 8a 81 ldd r24, Y+2 ; 0x02
468: 8b 8b std Y+19, r24 ; 0x13
BCD_ASCII(time[3],asc); //为第1行的日赋值
46a: f6 01 movw r30, r12
46c: 83 81 ldd r24, Z+3 ; 0x03
46e: b5 01 movw r22, r10
470: 0e 94 ca 01 call 0x394 ; 0x394 <BCD_ASCII>
line1[6]=asc[0];
474: 89 81 ldd r24, Y+1 ; 0x01
476: 8d 8b std Y+21, r24 ; 0x15
line1[7]=asc[1];
478: 8a 81 ldd r24, Y+2 ; 0x02
47a: 8e 8b std Y+22, r24 ; 0x16
BCD_ASCII(time[5],asc); //为第1行的星期赋值
47c: f6 01 movw r30, r12
47e: 85 81 ldd r24, Z+5 ; 0x05
480: b5 01 movw r22, r10
482: 0e 94 ca 01 call 0x394 ; 0x394 <BCD_ASCII>
line1[9]=asc[1];
486: 8a 81 ldd r24, Y+2 ; 0x02
488: 88 8f std Y+24, r24 ; 0x18
while(LCD1602_readBF());
48a: 0e 94 88 00 call 0x110 ; 0x110 <LCD1602_readBF>
48e: 88 23 and r24, r24
490: e1 f7 brne .-8 ; 0x48a <__stack+0x2b>
LCD1602_gotoXY(1,2); //第1行从第3个位置开始显示
492: 81 e0 ldi r24, 0x01 ; 1
494: 62 e0 ldi r22, 0x02 ; 2
496: 0e 94 8f 00 call 0x11e ; 0x11e <LCD1602_gotoXY>
49a: fe 01 movw r30, r28
49c: 33 96 adiw r30, 0x03 ; 3
milliseconds can be achieved.
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
49e: 28 ee ldi r18, 0xE8 ; 232
4a0: 33 e0 ldi r19, 0x03 ; 3
4a2: 09 c0 rjmp .+18 ; 0x4b6 <__stack+0x57>
********************************************/
void LCD1602_sendstr(uchar *ptString)
{
while((*ptString)!='\0') //字符串未结束
{
LCD1602_sendbyte(iDat, *ptString++);
4a4: 31 96 adiw r30, 0x01 ; 1
void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
{
if (DatCmd == iCmd) //指令操作
LCDa_CLR_RS;
else
LCDa_SET_RS;
4a6: dc 9a sbi 0x1b, 4 ; 27
LCDa_CLR_RW; //写操作
4a8: dd 98 cbi 0x1b, 5 ; 27
LCDa_SET_E;
4aa: de 9a sbi 0x1b, 6 ; 27
LCDa_DO = dByte; //写入数据
4ac: 88 bb out 0x18, r24 ; 24
4ae: c9 01 movw r24, r18
4b0: 01 97 sbiw r24, 0x01 ; 1
4b2: f1 f7 brne .-4 ; 0x4b0 <__stack+0x51>
_delay_us(500);
// Delayms(1);
LCDa_CLR_E;
4b4: de 98 cbi 0x1b, 6 ; 27
参 数: ptString--字符串指针
返回值 : 无
********************************************/
void LCD1602_sendstr(uchar *ptString)
{
while((*ptString)!='\0') //字符串未结束
4b6: 80 81 ld r24, Z
4b8: 88 23 and r24, r24
4ba: a1 f7 brne .-24 ; 0x4a4 <__stack+0x45>
4bc: fe 01 movw r30, r28
4be: 3f 96 adiw r30, 0x0f ; 15
4c0: 28 ee ldi r18, 0xE8 ; 232
4c2: 33 e0 ldi r19, 0x03 ; 3
4c4: 09 c0 rjmp .+18 ; 0x4d8 <__stack+0x79>
{
LCD1602_sendbyte(iDat, *ptString++);
4c6: 31 96 adiw r30, 0x01 ; 1
void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
{
if (DatCmd == iCmd) //指令操作
LCDa_CLR_RS;
else
LCDa_SET_RS;
4c8: dc 9a sbi 0x1b, 4 ; 27
LCDa_CLR_RW; //写操作
4ca: dd 98 cbi 0x1b, 5 ; 27
LCDa_SET_E;
4cc: de 9a sbi 0x1b, 6 ; 27
LCDa_DO = dByte; //写入数据
4ce: 88 bb out 0x18, r24 ; 24
4d0: c9 01 movw r24, r18
4d2: 01 97 sbiw r24, 0x01 ; 1
4d4: f1 f7 brne .-4 ; 0x4d2 <__stack+0x73>
_delay_us(500);
// Delayms(1);
LCDa_CLR_E;
4d6: de 98 cbi 0x1b, 6 ; 27
参 数: ptString--字符串指针
返回值 : 无
********************************************/
void LCD1602_sendstr(uchar *ptString)
{
while((*ptString)!='\0') //字符串未结束
4d8: 80 81 ld r24, Z
4da: 88 23 and r24, r24
4dc: a1 f7 brne .-24 ; 0x4c6 <__stack+0x67>
LCD1602_sendstr(line3); //将07年显示为2007的形式
LCD1602_sendstr(line1); //第1行显示
while(LCD1602_readBF());
4de: 0e 94 88 00 call 0x110 ; 0x110 <LCD1602_readBF>
4e2: 88 23 and r24, r24
4e4: e1 f7 brne .-8 ; 0x4de <__stack+0x7f>
LCD1602_gotoXY(2,4); //第2行从第5个位置开始显示
4e6: 82 e0 ldi r24, 0x02 ; 2
4e8: 64 e0 ldi r22, 0x04 ; 4
4ea: 0e 94 8f 00 call 0x11e ; 0x11e <LCD1602_gotoXY>
4ee: fe 01 movw r30, r28
4f0: 36 96 adiw r30, 0x06 ; 6
4f2: 28 ee ldi r18, 0xE8 ; 232
4f4: 33 e0 ldi r19, 0x03 ; 3
4f6: 09 c0 rjmp .+18 ; 0x50a <__stack+0xab>
{
LCD1602_sendbyte(iDat, *ptString++);
4f8: 31 96 adiw r30, 0x01 ; 1
void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
{
if (DatCmd == iCmd) //指令操作
LCDa_CLR_RS;
else
LCDa_SET_RS;
4fa: dc 9a sbi 0x1b, 4 ; 27
LCDa_CLR_RW; //写操作
4fc: dd 98 cbi 0x1b, 5 ; 27
LCDa_SET_E;
4fe: de 9a sbi 0x1b, 6 ; 27
LCDa_DO = dByte; //写入数据
500: 88 bb out 0x18, r24 ; 24
502: c9 01 movw r24, r18
504: 01 97 sbiw r24, 0x01 ; 1
506: f1 f7 brne .-4 ; 0x504 <__stack+0xa5>
_delay_us(500);
// Delayms(1);
LCDa_CLR_E;
508: de 98 cbi 0x1b, 6 ; 27
参 数: ptString--字符串指针
返回值 : 无
********************************************/
void LCD1602_sendstr(uchar *ptString)
{
while((*ptString)!='\0') //字符串未结束
50a: 80 81 ld r24, Z
50c: 88 23 and r24, r24
50e: a1 f7 brne .-24 ; 0x4f8 <__stack+0x99>
LCD1602_sendstr(line2); //第2行显示
}
510: 69 96 adiw r28, 0x19 ; 25
512: 0f b6 in r0, 0x3f ; 63
514: f8 94 cli
516: de bf out 0x3e, r29 ; 62
518: 0f be out 0x3f, r0 ; 63
51a: cd bf out 0x3d, r28 ; 61
51c: cf 91 pop r28
51e: df 91 pop r29
520: 1f 91 pop r17
522: 0f 91 pop r16
524: ff 90 pop r15
526: ef 90 pop r14
528: df 90 pop r13
52a: cf 90 pop r12
52c: bf 90 pop r11
52e: af 90 pop r10
530: 9f 90 pop r9
532: 8f 90 pop r8
534: 08 95 ret
00000536 <main>:
功 能: 1. 在1602液晶上显示当前时间 2.可以设置时间(M1-M9为数字0-9,M13为设置模式和显示模式选择,M14为当前设置位选择)
参 数: 无
返回值 : 无
********************************************/
int main(void)
{
536: ff 92 push r15
538: 0f 93 push r16
53a: 1f 93 push r17
53c: df 93 push r29
53e: cf 93 push r28
540: cd b7 in r28, 0x3d ; 61
542: de b7 in r29, 0x3e ; 62
544: 2e 97 sbiw r28, 0x0e ; 14
546: 0f b6 in r0, 0x3f ; 63
548: f8 94 cli
54a: de bf out 0x3e, r29 ; 62
54c: 0f be out 0x3f, r0 ; 63
54e: cd bf out 0x3d, r28 ; 61
// uchar setadd,setdat,shift; //setadd指定将当前数值送入DS1302的哪个寄存器
//setdat是当前设置的数值,即被送入DS1302指定寄存器的数
//shift来实现十位和各位的设置相互独立(因为十位和个位是在一个寄存器里的)
//uchar dis_x,dis_y; //存储1602液晶当前光标的位置
uchar settime[7]={0x50,0x59,0x23,0x28,0x06,0x06,0x09};//设置的秒,分,时,日,月,星期,年
550: de 01 movw r26, r28
552: 11 96 adiw r26, 0x01 ; 1
554: e0 e6 ldi r30, 0x60 ; 96
556: f0 e0 ldi r31, 0x00 ; 0
558: 87 e0 ldi r24, 0x07 ; 7
55a: 01 90 ld r0, Z+
55c: 0d 92 st X+, r0
55e: 81 50 subi r24, 0x01 ; 1
560: e1 f7 brne .-8 ; 0x55a <main+0x24>
uchar gettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//保存当前时间的数组
562: 8e 01 movw r16, r28
564: 08 5f subi r16, 0xF8 ; 248
566: 1f 4f sbci r17, 0xFF ; 255
568: 87 e0 ldi r24, 0x07 ; 7
56a: f8 01 movw r30, r16
56c: 11 92 st Z+, r1
56e: 8a 95 dec r24
570: e9 f7 brne .-6 ; 0x56c <main+0x36>
//uchar gettime[7]={0x59,0x54,0x12,0x01,0x01,0x02,0x05};
LCD1602_initial(); //初始化1602液晶
572: 0e 94 a9 00 call 0x152 ; 0x152 <LCD1602_initial>
参 数: 无
返回值 : 无
********************************************/
void DS1302_portinit(void)
{
CTRL_DDR|=_BV(RTC_CLK)|_BV(RTC_DATA)|_BV(RTC_CS);//将时钟端(RTC_CLK)数据端(RTC_DATA)片选端(RTC_CS)设置为输出
576: 84 b3 in r24, 0x14 ; 20
578: 87 60 ori r24, 0x07 ; 7
57a: 84 bb out 0x14, r24 ; 20
uchar settime[7]={0x50,0x59,0x23,0x28,0x06,0x06,0x09};//设置的秒,分,时,日,月,星期,年
uchar gettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//保存当前时间的数组
//uchar gettime[7]={0x59,0x54,0x12,0x01,0x01,0x02,0x05};
LCD1602_initial(); //初始化1602液晶
DS1302_portinit(); //初始化DS1302的三根数据线
DS1302_init(); //启动振荡器,DS1302开始工作
57c: 0e 94 bd 01 call 0x37a ; 0x37a <DS1302_init>
DS1302_setT(settime); //设置初始时间
580: ce 01 movw r24, r28
582: 01 96 adiw r24, 0x01 ; 1
584: 0e 94 57 01 call 0x2ae ; 0x2ae <DS1302_setT>
while(DS1302_check()) //以下程序完成显示和设置时间
{Disp_time(gettime); //显示当前时间
588: f0 2e mov r15, r16
58a: 01 2f mov r16, r17
58c: 08 c0 rjmp .+16 ; 0x59e <main+0x68>
58e: 8f 2d mov r24, r15
590: 90 2f mov r25, r16
592: 0e 94 d4 01 call 0x3a8 ; 0x3a8 <Disp_time>
DS1302_getT(gettime); //获得当前时间
596: 8f 2d mov r24, r15
598: 90 2f mov r25, r16
59a: 0e 94 85 01 call 0x30a ; 0x30a <DS1302_getT>
LCD1602_initial(); //初始化1602液晶
DS1302_portinit(); //初始化DS1302的三根数据线
DS1302_init(); //启动振荡器,DS1302开始工作
DS1302_setT(settime); //设置初始时间
while(DS1302_check()) //以下程序完成显示和设置时间
59e: 0e 94 ac 01 call 0x358 ; 0x358 <DS1302_check>
5a2: 88 23 and r24, r24
5a4: a1 f7 brne .-24 ; 0x58e <main+0x58>
{Disp_time(gettime); //显示当前时间
DS1302_getT(gettime); //获得当前时间
}
}
5a6: 80 e0 ldi r24, 0x00 ; 0
5a8: 90 e0 ldi r25, 0x00 ; 0
5aa: 2e 96 adiw r28, 0x0e ; 14
5ac: 0f b6 in r0, 0x3f ; 63
5ae: f8 94 cli
5b0: de bf out 0x3e, r29 ; 62
5b2: 0f be out 0x3f, r0 ; 63
5b4: cd bf out 0x3d, r28 ; 61
5b6: cf 91 pop r28
5b8: df 91 pop r29
5ba: 1f 91 pop r17
5bc: 0f 91 pop r16
5be: ff 90 pop r15
5c0: 08 95 ret
000005c2 <_exit>:
5c2: f8 94 cli
000005c4 <__stop_program>:
5c4: ff cf rjmp .-2 ; 0x5c4 <__stop_program>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -