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

📄 time-1302.s

📁 单片机实时时钟控制 C语言编写 源程序。
💻 S
📖 第 1 页 / 共 2 页
字号:
; 	DDRA &= ~(1<<DDA4);          //数据脚改为输入
	cbi 0x1a,4
	.dbline 219
; 	NOP();
	nop
	.dbline 220
; 	for (i=0;i<8;i++)
	clr R20
	rjmp L45
L42:
	.dbline 221
	.dbline 222
	rcall _OutputByte
	ldi R24,<_buf_read
	ldi R25,>_buf_read
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 223
L43:
	.dbline 220
	inc R20
L45:
	.dbline 220
	cpi R20,8
	brlo L42
	.dbline 224
; 	{
; 	   buf_read[i]=OutputByte();
; 	}
; 	PORTA &= ~(1<<PA5);          //RST=0
	cbi 0x1b,5
	.dbline -2
L41:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e write_pc232 _write_pc232 fV
;              i -> R20
	.even
_write_pc232::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 235
; }
; 
; /********************************************************
;   子程序名:   write_pc232()
;   功    能:   串口发送一个字节
;   输入参数:   /
;   输出参数:   /
;   描    述:   把数据发送出去先发送再检测,发完后,才离开
; ********************************************************/
; void write_pc232(uchar i)
; {
L47:
	.dbline 236
L48:
	.dbline 236
;  	 while(!(UCSRA&(1<<UDRE)));     //1字节发送完毕?
	sbis 0xb,5
	rjmp L47
	.dbline 237
; 	 UDR = i;                     //发送一个字符数据
	out 0xc,R20
	.dbline 238
; 	 DelaymS (10);
	ldi R16,10
	ldi R17,0
	rcall _DelaymS
	.dbline -2
L46:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e mcu_Init _mcu_Init fV
	.even
_mcu_Init::
	.dbline -1
	.dbline 248
; }
; /************************************************
; 函 数 名:    mcu_Init()
; 功    能:    单片机初始化函数
; 输入参数:     /
; 输出参数:    /
; 描    述:    相关口方向的设置等
; ***********************************************/
; void mcu_Init(void)
; {
	.dbline 249
;  	DDRC = 0xff;     //PC口为推挽1输出,段码
	ldi R24,255
	out 0x14,R24
	.dbline 250
; 	DDRD = 0xff;     //PD口为推挽1输出,位码,PD7为485DE脚。
	out 0x11,R24
	.dbline 251
; 	DDRA = 0xff;     //PA口接DS1302
	out 0x1a,R24
	.dbline -2
L50:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e usart_Init _usart_Init fV
	.even
_usart_Init::
	.dbline -1
	.dbline 261
; }
; /********************************************************
;   子程序名:   usart_Init()
;   功    能:   串口初始化
;   输入参数:   /
;   输出参数:   /
;   描    述:   /
; ********************************************************/
; void usart_Init (void)
; {
	.dbline 262
; 	 UBRRL=51; //波特率寄存器,UART:9600bps,8.000MHz
	ldi R24,51
	out 0x9,R24
	.dbline 263
; 	 UCSRB = (1<<RXEN)|(1<<TXEN);    //UART控制寄存器,RXD&TXD使能
	ldi R24,24
	out 0xa,R24
	.dbline -2
L51:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e spk _spk fV
;              i -> R20
	.even
_spk::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 273
; }
; /************************************************
; 函 数 名:    spk()
; 功    能:    蜂鸣器鸣叫一声函数
; 输入参数:     
; 输出参数:    
; 描    述:    /
; ***********************************************/
; void spk (uchar i) 
; {
	.dbline 274
;  	 DDRA |= (1<<2);    //DDRA2为输出。
	sbi 0x1a,2
	.dbline 275
; 	 PORTA &= ~(1<<PA2);     //蜂鸣器响
	cbi 0x1b,2
	.dbline 276
; 	 DelaymS (i);          //延迟
	mov R16,R20
	clr R17
	rcall _DelaymS
	.dbline 277
; 	 PORTA |= (1<<PA2);     //蜂鸣器关闭
	sbi 0x1b,2
	.dbline -2
L52:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e data_conversion _data_conversion fV
	.even
_data_conversion::
	.dbline -1
	.dbline 288
; }
; /********************************************************
;   子程序名:   data_conversion()
;   输入参数:   数据转换程序
;   输出参数:   /
;   描    述:   /1302读出的数据是BCD码形式,必须进行数制转换。
;   数据格式:    秒   分   时    日   月 星期 年  写保护字节
;   显示格式:   秒秒 分分 时时  日日 月月    年年 辅助
; ********************************************************/
; void data_conversion (void)
; {
	.dbline 289
; 	 buf_time[29] = (buf_read[0] & 0x0f) + '0';   //秒的低位
	lds R24,_buf_read
	andi R24,15
	subi R24,208    ; addi 48
	sts _buf_time+29,R24
	.dbline 290
; 	 buf_time[28] = (buf_read[0] >> 4 ) + '0';  //秒的高位
	lds R24,_buf_read
	swap R24
	andi R24,#0x0F
	subi R24,208    ; addi 48
	sts _buf_time+28,R24
	.dbline 292
; 	 
; 	 buf_time[26] = (buf_read[1] & 0x0f) + '0';   //分的低位
	lds R24,_buf_read+1
	andi R24,15
	subi R24,208    ; addi 48
	sts _buf_time+26,R24
	.dbline 293
; 	 buf_time[25] = (buf_read[1] >> 4 ) + '0';  //分的高位
	lds R24,_buf_read+1
	swap R24
	andi R24,#0x0F
	subi R24,208    ; addi 48
	sts _buf_time+25,R24
	.dbline 295
; 	 
; 	 buf_time[23] = (buf_read[2] & 0x0f) + '0';   //时的低位
	lds R24,_buf_read+2
	andi R24,15
	subi R24,208    ; addi 48
	sts _buf_time+23,R24
	.dbline 296
; 	 buf_time[22] = (buf_read[2] >> 4 ) + '0';  //时的高位
	lds R24,_buf_read+2
	swap R24
	andi R24,#0x0F
	subi R24,208    ; addi 48
	sts _buf_time+22,R24
	.dbline 298
; 	 
; 	 buf_time[14] = (buf_read[3] & 0x0f) + '0';   //日的低位
	lds R24,_buf_read+3
	andi R24,15
	subi R24,208    ; addi 48
	sts _buf_time+14,R24
	.dbline 299
; 	 buf_time[13] = (buf_read[3] >> 4 ) + '0';  //日的高位
	lds R24,_buf_read+3
	swap R24
	andi R24,#0x0F
	subi R24,208    ; addi 48
	sts _buf_time+13,R24
	.dbline 301
; 	 
; 	 buf_time[11] = (buf_read[4] & 0x0f) + '0';   //月的高位
	lds R24,_buf_read+4
	andi R24,15
	subi R24,208    ; addi 48
	sts _buf_time+11,R24
	.dbline 302
; 	 buf_time[10] = (buf_read[4] >> 4 ) + '0';  //月的高位
	lds R24,_buf_read+4
	swap R24
	andi R24,#0x0F
	subi R24,208    ; addi 48
	sts _buf_time+10,R24
	.dbline 304
; 	 
; 	 buf_time[8]  = (buf_read[6] & 0x0f) + '0';   //年的高位
	lds R24,_buf_read+6
	andi R24,15
	subi R24,208    ; addi 48
	sts _buf_time+8,R24
	.dbline 305
; 	 buf_time[7]  = (buf_read[6] >> 4 ) + '0';  //年的高位
	lds R24,_buf_read+6
	swap R24
	andi R24,#0x0F
	subi R24,208    ; addi 48
	sts _buf_time+7,R24
	.dbline -2
L53:
	.dbline 0 ; func end
	ret
	.dbend
	.area lit(rom, con, rel)
L77:
	.byte 32,32,189,241,204,236,181,196,200,213,198,218,202,199,163,186
L78:
	.byte 32,32,181,177,199,176,181,196,202,177,188,228,202,199,163,186
	.area text(rom, con, rel)
	.dbfile E:\iccavr代码\实验6_实时时钟DS1302\time-1302.c
	.dbfunc e out_data_pc232 _out_data_pc232 fV
;          time2 -> y+16
;          time1 -> y+0
;              i -> R20
	.even
_out_data_pc232::
	rcall push_gset1
	sbiw R28,32
	.dbline -1
	.dbline 315
; }
; /********************************************************
;   子程序名:   out_data_pc232()
;   功    能:   串口发送时间数据到PC,
;   输入参数:   /
;   输出参数:   /
;   描    述:   包括"当前的温度是:xxx.xx摄氏度",此程序借助LCD的显示缓冲区
; ********************************************************/
; void out_data_pc232(void) 
; {
	.dbline 317
; 	 uchar i;
; 	 uchar time1[16]="  今天的日期是:";
	ldi R24,<L77
	ldi R25,>L77
	movw R30,R28
	ldi R16,16
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 318
; 	 uchar time2[16]="  当前的时间是:";
	ldi R24,<L78
	ldi R25,>L78
	movw R30,R28
	adiw R30,16
	ldi R16,16
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 320
; 	 
;      for(i=0;i<16;i++)    //向串口发送数据
	clr R20
	rjmp L82
L79:
	.dbline 321
	.dbline 322
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	rcall _write_pc232
	.dbline 323
L80:
	.dbline 320
	inc R20
L82:
	.dbline 320
	cpi R20,16
	brlo L79
	.dbline 324
;      { 
;          write_pc232(time1[i]);
;      } 
; 	  write_pc232('2');            //年
	ldi R16,50
	rcall _write_pc232
	.dbline 325
; 	  write_pc232('0');
	ldi R16,48
	rcall _write_pc232
	.dbline 326
; 	  write_pc232(buf_time[7]);
	lds R16,_buf_time+7
	rcall _write_pc232
	.dbline 327
; 	  write_pc232(buf_time[8]);
	lds R16,_buf_time+8
	rcall _write_pc232
	.dbline 328
; 	  write_pc232('-');
	ldi R16,45
	rcall _write_pc232
	.dbline 329
; 	  write_pc232(buf_time[10]);   //月
	lds R16,_buf_time+10
	rcall _write_pc232
	.dbline 330
; 	  write_pc232(buf_time[11]);
	lds R16,_buf_time+11
	rcall _write_pc232
	.dbline 331
; 	  write_pc232('-');
	ldi R16,45
	rcall _write_pc232
	.dbline 332
; 	  write_pc232(buf_time[13]);   //日
	lds R16,_buf_time+13
	rcall _write_pc232
	.dbline 333
; 	  write_pc232(buf_time[14]);
	lds R16,_buf_time+14
	rcall _write_pc232
	.dbline 335
; 	  
;      for(i=0;i<16;i++)    //向串口发送数据
	clr R20
	rjmp L92
L89:
	.dbline 336
	.dbline 337
	movw R24,R28
	adiw R24,16
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	rcall _write_pc232
	.dbline 338
L90:
	.dbline 335
	inc R20
L92:
	.dbline 335
	cpi R20,16
	brlo L89
	.dbline 339
;      { 
;          write_pc232(time2[i]);
;      } 
; 	  write_pc232(buf_time[22]);   //时
	lds R16,_buf_time+22
	rcall _write_pc232
	.dbline 340
; 	  write_pc232(buf_time[23]);
	lds R16,_buf_time+23
	rcall _write_pc232
	.dbline 341
; 	  write_pc232(':');
	ldi R16,58
	rcall _write_pc232
	.dbline 342
; 	  write_pc232(buf_time[25]);   //分
	lds R16,_buf_time+25
	rcall _write_pc232
	.dbline 343
; 	  write_pc232(buf_time[26]);
	lds R16,_buf_time+26
	rcall _write_pc232
	.dbline 344
; 	  write_pc232(':');
	ldi R16,58
	rcall _write_pc232
	.dbline 345
; 	  write_pc232(buf_time[28]);   //秒
	lds R16,_buf_time+28
	rcall _write_pc232
	.dbline 346
; 	  write_pc232(buf_time[29]);
	lds R16,_buf_time+29
	rcall _write_pc232
	.dbline 348
; 	  
; 	  write_pc232('\n'); 
	ldi R16,10
	rcall _write_pc232
	.dbline 349
;  	  write_pc232('\r'); //显示回车换行
	ldi R16,13
	rcall _write_pc232
	.dbline -2
L76:
	adiw R28,32
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym l time2 16 A[16:16]c
	.dbsym l time1 0 A[16:16]c
	.dbsym r i 20 c
	.dbend
	.area lit(rom, con, rel)
L100:
	.byte 32,32,32,32,'w,'e,'l,'c,'o,'m,'e,33,32,32,32,32
	.byte 32,32,'w,'w,'w,46,'i,'t,'s,'n,46,'c,'n,33,32,32
	.byte 0
	.area text(rom, con, rel)
	.dbfile E:\iccavr代码\实验6_实时时钟DS1302\time-1302.c
	.dbfunc e main _main fV
;       buf_logo -> y+0
;       data_old -> R20
	.even
_main::
	sbiw R28,33
	.dbline -1
	.dbline 353
; }
; //*****************主程序**********************************
; void main (void)
; {
	.dbline 355
;      uchar data_old;
; 	 uchar buf_logo[]="    welcome!      www.itsn.cn!  ";
	ldi R24,<L100
	ldi R25,>L100
	movw R30,R28
	ldi R16,33
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 357
; 	 
;      mcu_Init();       //单片机初始化
	rcall _mcu_Init
	.dbline 358
; 	 usart_Init();     //串口初始化
	rcall _usart_Init
	.dbline 359
; 	 init_lcd();        //lcd初始化
	rcall _init_lcd
	.dbline 361
; 	 
; 	 write_pc232('o'); //测试串口
	ldi R16,111
	rcall _write_pc232
	.dbline 362
;      write_pc232('k'); //测试串口
	ldi R16,107
	rcall _write_pc232
	.dbline 363
; 	 write_pc232('\n'); 
	ldi R16,10
	rcall _write_pc232
	.dbline 364
;  	 write_pc232('\r'); //显示回车换行
	ldi R16,13
	rcall _write_pc232
	.dbline 366
; 	 
; 	 display_lcd(buf_logo);  //显示LOGO
	movw R16,R28
	rcall _display_lcd
	.dbline 367
; 	 spk (1000);           //上电蜂鸣器长响
	ldi R16,232
	rcall _spk
	.dbline 368
; 	 DelaymS(2000);    //长延迟
	ldi R16,2000
	ldi R17,7
	rcall _DelaymS
	.dbline 369
; 	 display_lcd(buf_time);  //开始工作,LCD刷新显示一屏
	ldi R16,<_buf_time
	ldi R17,>_buf_time
	rcall _display_lcd
	.dbline 370
; 	 spk (100);           //开始工作,蜂鸣器短响
	ldi R16,100
	rcall _spk
	.dbline 373
; 	 
; 	 //---------此段测试1302是否已经写过内容了,若写过就不再重新写。
; 	 read_DS1302();      //读时间
	rcall _read_DS1302
	.dbline 374
; 	 if(buf_read[0] & 0x80)
	lds R2,_buf_read
	sbrs R2,7
	rjmp L101
	.dbline 375
; 	 {
	.dbline 376
; 	    write_DS1302();  //写入需要的初始时间值,
	rcall _write_DS1302
	.dbline 377
; 	 }
L101:
	.dbline 380
; 	 //------------------
; 	 
; 	 DelaymS(1);       //延迟
	ldi R16,1
	ldi R17,0
	rcall _DelaymS
	.dbline 381
; 	 read_DS1302();      //读时间
	rcall _read_DS1302
	.dbline 382
; 	 data_old = buf_read[0];  //提取旧时钟的秒数值
	lds R20,_buf_read
	rjmp L104
L103:
	.dbline 384
; 	 while(1) //无限循环执行,此程序保证了一秒钟更新一次串口数据,更新一次LCD显示。
; 	 {
	.dbline 385
; 		   DelaymS(10);       //延迟
	ldi R16,10
	ldi R17,0
	rcall _DelaymS
	.dbline 386
; 		   read_DS1302();      //读时间
	rcall _read_DS1302
	.dbline 387
; 		   if (data_old == buf_read[0])
	lds R2,_buf_read
	cp R20,R2
	brne L106
	.dbline 388
; 		   {
	.dbline 389
; 		       DelaymS(10);       //延迟
	ldi R16,10
	ldi R17,0
	rcall _DelaymS
	.dbline 390
; 		   }
	rjmp L107
L106:
	.dbline 392
; 		   else
; 		   {
	.dbline 393
; 		       data_conversion();  //将读出的数据分开,分别装入显存
	rcall _data_conversion
	.dbline 394
; 		       display_lcd(buf_time);  //刷新显示一屏
	ldi R16,<_buf_time
	ldi R17,>_buf_time
	rcall _display_lcd
	.dbline 395
; 		       out_data_pc232();  //串口将时间数据送PC
	rcall _out_data_pc232
	.dbline 396
; 			   data_old = buf_read[0]; //更新时钟的秒数值
	lds R20,_buf_read
	.dbline 397
; 		   }		   
L107:
	.dbline 398
L104:
	.dbline 383
	rjmp L103
X0:
	.dbline -2
L99:
	adiw R28,33
	.dbline 0 ; func end
	ret
	.dbsym l buf_logo 0 A[33:33]c
	.dbsym r data_old 20 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\iccavr代码\实验6_实时时钟DS1302\time-1302.c
_buf_read::
	.blkb 8
	.dbsym e buf_read _buf_read A[8:8]c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -