⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.lss

📁 DS1302资料lcd.rar
💻 LSS
📖 第 1 页 / 共 4 页
字号:
 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 + -