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

📄 rtc.s

📁 在AVR开发板驱动时钟芯片DS1302
💻 S
📖 第 1 页 / 共 4 页
字号:
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0
	.area text(rom, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\17_RTC\RTC.C
	.dbfunc e main _main fV
	.area func_lit(rom, con, rel)
L218:
	.word `L205
	.word `L206
	.word `L207
	.word `L208
	.word `L209
	.word `L210
	.word `L211
	.word `L212
	.word `L213
	.word `L214
	.word `L215
	.word `L216
	.word `L217
	.area text(rom, con, rel)
	.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\17_RTC\RTC.C
;        settime -> y+7
;        set_num -> y+17
;          dis_y -> R14
;          dis_x -> R22
;         setadd -> R20
;              i -> y+16
;          shift -> R10
;        gettime -> y+0
;       RD_TFLAG -> y+15
;         setdat -> y+14
	.even
_main::
	sbiw R28,20
	.dbline -1
	.dbline 253
; /*******************************************
; 函数名称: main
; 功    能: 1. 在1602液晶上显示当前时间 2.可以设置时间(M1-M9为数字0-9,M13为设置模式和显示模式选择,M14为当前设置位选择)
; 参    数: 无
; 返回值  : 无
; /********************************************/
; void main(void)
; {
	.dbline 254
;  uchar i,RD_TFLAG=1,set_num=0;//i为键盘译码值
	clr R0
	inc R0
	std y+15,R0
	.dbline 254
	clr R0
	std y+17,R0
	.dbline 261
;  	   						  //RD_TFLAG为是否设置时间的标志,为1是显示状态,不设置,为0时进入设置状态
; 							  //set_num是设置哪一位的标志,如为0的时候设置的是秒
;  uchar setadd,setdat,shift;	  //setadd指定将当前数值送入DS1302的哪个寄存器
;  	   						  //setdat是当前设置的数值,即被送入DS1302指定寄存器的数
; 							  //shift来实现十位和各位的设置相互独立(因为十位和个位是在一个寄存器里的)
;  uchar dis_x,dis_y;			  //存储1602液晶当前光标的位置
;  uchar settime[7]={0x15,0x58,0x13,0x01,0x01,0x06,0x07};//设置的秒,分,时,日,月,星期,年
	ldi R24,<L139
	ldi R25,>L139
	movw R30,R28
	adiw R30,7
	ldi R16,7
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 262
;  uchar gettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//保存当前时间的数组
	ldi R24,<L140
	ldi R25,>L140
	movw R30,R28
	ldi R16,7
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 263
;  Board_init();	   			//初始化开发板 
	xcall _Board_init
	.dbline 264
;  LCD1602_initial(); 		//初始化1602液晶
	xcall _LCD1602_initial
	.dbline 265
;  DS1302_portinit();			//初始化DS1302的三根数据线
	xcall _DS1302_portinit
	.dbline 266
;  DS1302_init();				//启动振荡器,DS1302开始工作 
	xcall _DS1302_init
	xjmp L142
L141:
	.dbline 270
;  //DS1302_setT(settime);		//设置初始时间
;  //DS1302_init();				//启动振荡器,DS1302开始工作 
;  while(1)					//以下程序完成显示和设置时间
;  {
	.dbline 271
;   if(RD_TFLAG)				//如果是设置模式则不更新时间显示
	ldd R0,y+15
	tst R0
	breq L144
	.dbline 272
;   {
	.dbline 273
;    DS1302_getT(gettime);	//获得当前时间
	movw R16,R28
	xcall _DS1302_getT
	.dbline 274
;    Disp_time(gettime);		//显示当前时间
	movw R16,R28
	xcall _Disp_time
	.dbline 275
;   }
L144:
	.dbline 276
;   if(Mkey_press())	  		//是否有按键按下
	xcall _Mkey_press
	tst R16
	brne X16
	xjmp L146
X16:
	.dbline 277
;   {
	.dbline 278
;    i=Mkey_scan();	  		//扫描并反回翻译后的键码 
	xcall _Mkey_scan
	std y+16,R16
	.dbline 279
;    switch(i)
	ldd R12,y+16
	clr R13
	tst R12
	brne X12
	tst R13
	brne X17
	xjmp L151
X17:
X12:
	movw R24,R12
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brne X18
	xjmp L155
X18:
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	brne X19
	xjmp L159
X19:
	cpi R24,3
	ldi R30,0
	cpc R25,R30
	brne X20
	xjmp L163
X20:
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	brne X21
	xjmp L167
X21:
	cpi R24,5
	ldi R30,0
	cpc R25,R30
	brne X22
	xjmp L171
X22:
	cpi R24,6
	ldi R30,0
	cpc R25,R30
	brne X23
	xjmp L175
X23:
	cpi R24,7
	ldi R30,0
	cpc R25,R30
	brne X24
	xjmp L179
X24:
	cpi R24,8
	ldi R30,0
	cpc R25,R30
	brne X25
	xjmp L183
X25:
	cpi R24,9
	ldi R30,0
	cpc R25,R30
	brne X26
	xjmp L187
X26:
	cpi R24,12
	ldi R30,0
	cpc R25,R30
	brne X27
	xjmp L191
X27:
	cpi R24,13
	ldi R30,0
	cpc R25,R30
	brne X28
	xjmp L197
X28:
	xjmp L149
X13:
	.dbline 280
;    {
L151:
	.dbline 282
;    	case 0x0:				//将当前设置位设置成0
; 		if(RD_TFLAG==0)		//检测是否是设置模式(为0就是设置模式)
	ldd R0,y+15
	tst R0
	breq X29
	xjmp L149
X29:
	.dbline 283
; 		{
	.dbline 284
; 		 setdat=DS1302_readD(setadd|RD);		//读出当前时间				   
	mov R16,R20
	ori R16,1
	xcall _DS1302_readD
	std y+14,R16
	.dbline 285
; 		 setdat=setdat>>shift|setdat<<shift;	//根据shift值来设置DS1302寄存器的十位还是个位(shift为0设置的是个位,为4设置的是十位)
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 286
; 		 setdat&=0xF0;							//保留高位不变(设置十位则个位不变,设置个位则十位不变,因为上条语句已经根据shift的值把需要设置的位移动到低位了)
	ldd R24,y+14
	andi R24,240
	std y+14,R24
	.dbline 287
; 		 setdat|=0;								//按下的是0键,所以把当前设置位设置成0
	.dbline 288
; 		 setdat=setdat>>shift|setdat<<shift;	//把十位和个位还原成正确值
	ldd R16,y+14
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 289
; 		 DS1302_writeD(C_WP|WR,UPROTECT);		//解除写保护
	clr R18
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 290
; 		 DS1302_writeD(setadd|WR,setdat);		//写入设置值
	ldd R18,y+14
	mov R16,R20
	xcall _DS1302_writeD
	.dbline 291
; 		 DS1302_writeD(C_WP|WR,PROTECT);		//写保护
	ldi R18,128
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 292
; 		 LCD1602_gotoXY(dis_x,dis_y);			//将当前设置位在1602液晶上对应的位置显示更新
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 293
; 		 LCD1602_sendstr("0");					//向1602写入0字符并显示
	ldi R16,<L154
	ldi R17,>L154
	xcall _LCD1602_sendstr
	.dbline 294
; 		 LCD1602_gotoXY(dis_x,dis_y);			//将光标保持在当前设置位上
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 295
; 		}
	.dbline 296
; 		break;		 
	xjmp L149
L155:
	.dbline 298
; 	case 0x1:	//过程和0键相同,只是将当前设置位设置成1并更新显示
; 	    if(RD_TFLAG==0)
	ldd R0,y+15
	tst R0
	breq X30
	xjmp L149
X30:
	.dbline 299
; 		{
	.dbline 300
; 		 setdat=DS1302_readD(setadd|RD);
	mov R16,R20
	ori R16,1
	xcall _DS1302_readD
	std y+14,R16
	.dbline 301
; 		 setdat=setdat>>shift|setdat<<shift;
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 302
; 		 setdat&=0xF0;
	ldd R24,y+14
	andi R24,240
	std y+14,R24
	.dbline 303
; 		 setdat|=1;
	ori R24,1
	std y+14,R24
	.dbline 304
; 		 setdat=setdat>>shift|setdat<<shift;
	ldd R16,y+14
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 305
; 		 DS1302_writeD(C_WP|WR,UPROTECT);
	clr R18
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 306
; 		 DS1302_writeD(setadd|WR,setdat);
	ldd R18,y+14
	mov R16,R20
	xcall _DS1302_writeD
	.dbline 307
; 		 DS1302_writeD(C_WP|WR,PROTECT);
	ldi R18,128
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 308
; 		 LCD1602_gotoXY(dis_x,dis_y);
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 309
; 		 LCD1602_sendstr("1");
	ldi R16,<L158
	ldi R17,>L158
	xcall _LCD1602_sendstr
	.dbline 310
; 		 LCD1602_gotoXY(dis_x,dis_y);
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 311
; 		}		 
	.dbline 312
; 		break;
	xjmp L149
L159:
	.dbline 314
; 	case 0x2: 	 //过程和0键相同,只是将当前设置位设置成2并更新显示
; 		if(RD_TFLAG==0)
	ldd R0,y+15
	tst R0
	breq X31
	xjmp L149
X31:
	.dbline 315
; 		{
	.dbline 316
; 		 setdat=DS1302_readD(setadd|RD);
	mov R16,R20
	ori R16,1
	xcall _DS1302_readD
	std y+14,R16
	.dbline 317
; 		 setdat=setdat>>shift|setdat<<shift;
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 318
; 		 setdat&=0xF0;
	ldd R24,y+14
	andi R24,240
	std y+14,R24
	.dbline 319
; 		 setdat|=2;
	ori R24,2
	std y+14,R24
	.dbline 320
; 		 setdat=setdat>>shift|setdat<<shift;
	ldd R16,y+14
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 321
; 		 DS1302_writeD(C_WP|WR,UPROTECT);
	clr R18
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 322
; 		 DS1302_writeD(setadd|WR,setdat);
	ldd R18,y+14
	mov R16,R20
	xcall _DS1302_writeD
	.dbline 323
; 		 DS1302_writeD(C_WP|WR,PROTECT);
	ldi R18,128
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 324
; 		 LCD1602_gotoXY(dis_x,dis_y);
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 325
; 		 LCD1602_sendstr("2");
	ldi R16,<L162
	ldi R17,>L162
	xcall _LCD1602_sendstr
	.dbline 326
; 		 LCD1602_gotoXY(dis_x,dis_y);
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 327
; 		}		 
	.dbline 328
; 		break;
	xjmp L149
L163:
	.dbline 330
; 	case 0x3:   //过程和0键相同,只是将当前设置位设置成3并更新显示
; 		if(RD_TFLAG==0)
	ldd R0,y+15
	tst R0
	breq X32
	xjmp L149
X32:
	.dbline 331
; 		{
	.dbline 332
; 		 setdat=DS1302_readD(setadd|RD);
	mov R16,R20
	ori R16,1
	xcall _DS1302_readD
	std y+14,R16
	.dbline 333
; 		 setdat=setdat>>shift|setdat<<shift;
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 334
; 		 setdat&=0xF0;
	ldd R24,y+14
	andi R24,240
	std y+14,R24
	.dbline 335
; 		 setdat|=3;
	ori R24,3
	std y+14,R24
	.dbline 336
; 		 setdat=setdat>>shift|setdat<<shift;
	ldd R16,y+14
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 337
; 		 DS1302_writeD(C_WP|WR,UPROTECT);
	clr R18
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 338
; 		 DS1302_writeD(setadd|WR,setdat);
	ldd R18,y+14
	mov R16,R20
	xcall _DS1302_writeD
	.dbline 339
; 		 DS1302_writeD(C_WP|WR,PROTECT);
	ldi R18,128
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 340
; 		 LCD1602_gotoXY(dis_x,dis_y);
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 341
; 		 LCD1602_sendstr("3");
	ldi R16,<L166
	ldi R17,>L166
	xcall _LCD1602_sendstr
	.dbline 342
; 		 LCD1602_gotoXY(dis_x,dis_y);
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 343
; 		}		 
	.dbline 344
; 		break;
	xjmp L149
L167:
	.dbline 346
; 	case 0x4:   //过程和0键相同,只是将当前设置位设置成4并更新显示
; 		if(RD_TFLAG==0)
	ldd R0,y+15
	tst R0
	breq X33
	xjmp L149
X33:
	.dbline 347
; 		{
	.dbline 348
; 		 setdat=DS1302_readD(setadd|RD);
	mov R16,R20
	ori R16,1
	xcall _DS1302_readD
	std y+14,R16
	.dbline 349
; 		 setdat=setdat>>shift|setdat<<shift;
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 350
; 		 setdat&=0xF0;
	ldd R24,y+14
	andi R24,240
	std y+14,R24
	.dbline 351
; 		 setdat|=4;
	ori R24,4
	std y+14,R24
	.dbline 352
; 		 setdat=setdat>>shift|setdat<<shift;
	ldd R16,y+14
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 353
; 		 DS1302_writeD(C_WP|WR,UPROTECT);
	clr R18
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 354
; 		 DS1302_writeD(setadd|WR,setdat);
	ldd R18,y+14
	mov R16,R20
	xcall _DS1302_writeD
	.dbline 355
; 		 DS1302_writeD(C_WP|WR,PROTECT);
	ldi R18,128
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 356
; 		 LCD1602_gotoXY(dis_x,dis_y);
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 357
; 		 LCD1602_sendstr("4");
	ldi R16,<L170
	ldi R17,>L170
	xcall _LCD1602_sendstr
	.dbline 358
; 		 LCD1602_gotoXY(dis_x,dis_y);
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 359
; 		}		 
	.dbline 360
; 		break;
	xjmp L149
L171:
	.dbline 362
; 	case 0x5:    //过程和0键相同,只是将当前设置位设置成5并更新显示
; 		if(RD_TFLAG==0)
	ldd R0,y+15
	tst R0
	breq X34
	xjmp L149
X34:
	.dbline 363
; 		{
	.dbline 364
; 		 setdat=DS1302_readD(setadd|RD);
	mov R16,R20
	ori R16,1
	xcall _DS1302_readD
	std y+14,R16
	.dbline 365
; 		 setdat=setdat>>shift|setdat<<shift;
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 366
; 		 setdat&=0xF0;
	ldd R24,y+14
	andi R24,240
	std y+14,R24
	.dbline 367
; 		 setdat|=5;
	ori R24,5
	std y+14,R24
	.dbline 368
; 		 setdat=setdat>>shift|setdat<<shift;
	ldd R16,y+14
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 369
; 		 DS1302_writeD(C_WP|WR,UPROTECT);
	clr R18
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 370
; 		 DS1302_writeD(setadd|WR,setdat);
	ldd R18,y+14
	mov R16,R20
	xcall _DS1302_writeD
	.dbline 371
; 		 DS1302_writeD(C_WP|WR,PROTECT);
	ldi R18,128
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 372
; 		 LCD1602_gotoXY(dis_x,dis_y);
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 373
; 		 LCD1602_sendstr("5");
	ldi R16,<L174
	ldi R17,>L174
	xcall _LCD1602_sendstr
	.dbline 374
; 		 LCD1602_gotoXY(dis_x,dis_y);
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 375
; 		}		 
	.dbline 376
; 		break;
	xjmp L149
L175:
	.dbline 378
; 	case 0x6:    //过程和0键相同,只是将当前设置位设置成6并更新显示
; 		if(RD_TFLAG==0)
	ldd R0,y+15
	tst R0
	breq X35
	xjmp L149
X35:
	.dbline 379
; 		{
	.dbline 380
; 		 setdat=DS1302_readD(setadd|RD);
	mov R16,R20
	ori R16,1
	xcall _DS1302_readD
	std y+14,R16
	.dbline 381
; 		 setdat=setdat>>shift|setdat<<shift;
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 382
; 		 setdat&=0xF0;
	ldd R24,y+14
	andi R24,240
	std y+14,R24
	.dbline 383
; 		 setdat|=6;
	ori R24,6
	std y+14,R24
	.dbline 384
; 		 setdat=setdat>>shift|setdat<<shift;
	ldd R16,y+14
	mov R17,R10
	xcall lsl8
	mov R2,R16
	ldd R16,y+14
	mov R17,R10
	xcall lsr8
	mov R3,R16
	or R3,R2
	std y+14,R3
	.dbline 385
; 		 DS1302_writeD(C_WP|WR,UPROTECT);
	clr R18
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 386
; 		 DS1302_writeD(setadd|WR,setdat);
	ldd R18,y+14
	mov R16,R20
	xcall _DS1302_writeD
	.dbline 387
; 		 DS1302_writeD(C_WP|WR,PROTECT);
	ldi R18,128
	ldi R16,142
	xcall _DS1302_writeD
	.dbline 388
; 		 LCD1602_gotoXY(dis_x,dis_y);
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 389
; 		 LCD1602_sendstr("6");
	ldi R16,<L178
	ldi R17,>L178
	xcall _LCD1602_sendstr
	.dbline 390
; 		 LCD1602_gotoXY(dis_x,dis_y);
	mov R18,R14
	mov R16,R22
	xcall _LCD1602_gotoXY
	.dbline 391
; 		}		 
	.dbline 392
; 		break;
	xjmp L149
L179:
	.dbline 394
; 	case 0x7:    //过程和0键相同,只是将当前设置位设置成7并更新显示
; 		if(RD_TFLAG==0)
	ldd R0,y+15
	tst R0
	breq X36
	xjmp L149
X36:
	.dbline 395
; 		{
	.dbline 396
; 		 setdat=DS1302_readD(setadd|RD);
	mov R16,R20
	ori R16,1
	xcall _DS1302_readD
	std y+14,R16

⌨️ 快捷键说明

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