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

📄 rtc.s

📁 AVRkaifashili.rar
💻 S
📖 第 1 页 / 共 3 页
字号:
	ldi R30,0
	cpc R25,R30
	brne X17
	rjmp L171
X17:
	rjmp L153
X1:
	.dbline 287
; 		 {case 0x04:                   //"+"按键处理
L155:
	.dbline 288
; 		       (*Flag)++;
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	subi R24,255    ; addi 1
	std z+0,R24
	.dbline 289
; 			   if(((*Flag)&0x7f)==10) *Flag=0|0x80;
	andi R24,127
	cpi R24,10
	breq X18
	rjmp L153
X18:
	.dbline 289
	ldi R24,128
	std z+0,R24
	.dbline 290
; 		       break;
	rjmp L153
L158:
	.dbline 292
; 		  case 0x08:                   //"-"按键处理
; 		        if(((*Flag)&0x7f)==0)	*Flag=10|0x80; 
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	andi R24,127
	brne L159
	.dbline 292
	ldi R24,138
	std z+0,R24
L159:
	.dbline 293
; 				(*Flag)--;
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	subi R24,1
	std z+0,R24
	.dbline 294
; 				break;
	rjmp L153
L161:
	.dbline 296
; 		  case 0x10:                   //"下一位"按键处理
; 		        Flag++;
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 297
; 				(*(Flag-1))&=0x7f;     //上一位去掉小数点显示
	mov R24,R22
	mov R25,R23
	sbiw R24,1
	mov R30,R24
	mov R31,R25
	ldd R24,z+0
	andi R24,127
	std z+0,R24
	.dbline 298
; 				(*Flag)|=0x80;         //当前位加上小数点显示
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	ori R24,128
	std z+0,R24
	.dbline 299
; 				if(Flag==temp1+13) 
	mov R24,R28
	mov R25,R29
	adiw R24,16
	cp R30,R24
	cpc R31,R25
	breq X19
	rjmp L153
X19:
	.dbline 300
; 				 {(*Flag)&=0x7f;
	.dbline 300
	ldd R24,z+0
	andi R24,127
	std z+0,R24
	.dbline 301
; 				  Flag=temp1+9;
	mov R22,R28
	mov R23,R29
	subi R22,244  ; offset = 12
	sbci R23,255
	.dbline 302
; 				  (*Flag)|=0x80;}
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	ori R24,128
	std z+0,R24
	.dbline 302
	.dbline 303
; 				break;
	rjmp L153
L166:
	.dbline 305
; 		  case 0x20:                   //"上一位"按键处理
; 		        if(Flag==temp1+9) 
	mov R24,R28
	mov R25,R29
	adiw R24,12
	cp R22,R24
	cpc R23,R25
	brne L167
	.dbline 306
; 				 {(*Flag)&=0x7f;
	.dbline 306
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	andi R24,127
	std z+0,R24
	.dbline 307
; 				  Flag=temp1+13;
	mov R22,R28
	mov R23,R29
	subi R22,240  ; offset = 16
	sbci R23,255
	.dbline 308
; 				  (*Flag)|=0x80;}
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	ori R24,128
	std z+0,R24
	.dbline 308
	rjmp L168
L167:
	.dbline 309
; 				else Flag--;
	subi R22,1
	sbci R23,0
L168:
	.dbline 310
; 				(*Flag)|=0x80;         //当前位加上小数点显示
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	ori R24,128
	std z+0,R24
	.dbline 311
; 				(*(Flag+1))&=0x7f;     //下一位去掉小数点显示
	adiw R30,1
	ldd R24,z+0
	andi R24,127
	std z+0,R24
	.dbline 312
; 				break;
	rjmp L153
L171:
	.dbline 313
; 		  case 0x40:Enter_Flag=1;break;//"确定"键处理
	ldi R24,1
	sts _Enter_Flag,R24
	.dbline 313
	.dbline 315
; 		//  case 0x80:Enter_Flag=1;break;//测试用
; 		  default:break;}
L153:
	.dbline 317
L146:
	.dbline 282
	lds R2,_Enter_Flag
	tst R2
	brne X20
	rjmp L145
X20:
	.dbline 318
; 	    
; 	   }
; 	 Enter_Flag=0;
	clr R2
	sts _Enter_Flag,R2
	.dbline 319
;      temp3[0]=((temp1[11]<<4)|temp1[12])&0x7f; //分数据处理,去掉小数点
	ldd R2,y+15
	ldd R24,y+14
	andi R24,#0x0F
	swap R24
	or R24,R2
	andi R24,127
	std y+27,R24
	.dbline 320
; 	 temp3[1]=((temp1[9]<<4)|temp1[10])&0x7f;  //时数据处理,去掉小数点
	ldd R2,y+13
	ldd R24,y+12
	andi R24,#0x0F
	swap R24
	or R24,R2
	andi R24,127
	std y+28,R24
	.dbline 321
; 	 if((temp3[0]<0x60)&&(temp3[1]<0x24))      //判断是否为合法时间
	ldd R24,y+27
	cpi R24,96
	brsh L181
	ldd R24,y+28
	cpi R24,36
	brsh L181
	.dbline 322
; 	   {Write_1byte(SD2303,0x0e,0b10110000);   //开启闹铃使能
	.dbline 322
	ldi R24,176
	std y+0,R24
	ldi R18,14
	ldi R16,100
	rcall _Write_1byte
	.dbline 323
; 	    Write_1byte(SD2303,0x0f,0b00101000);   //开始中断使能
	ldi R24,40
	std y+0,R24
	ldi R18,15
	ldi R16,100
	rcall _Write_1byte
	.dbline 324
; 		Write_Nbyte(SD2303,0x08,temp3,3);}     //初始化闹铃设置
	ldi R24,3
	std y+2,R24
	mov R24,R28
	mov R25,R29
	adiw R24,27
	std y+1,R25
	std y+0,R24
	ldi R18,8
	ldi R16,100
	rcall _Write_Nbyte
	.dbline 324
	rjmp L182
L181:
	.dbline 326
; 	 else  
; 	    Write_1byte(SD2303,0x0e,0b00110000);   //取消闹铃功能
	ldi R24,48
	std y+0,R24
	ldi R18,14
	ldi R16,100
	rcall _Write_1byte
L182:
	.dbline 327
;     }
L141:
	.dbline 328
L89:
	.dbline -2
	.dbline 329
;   }
; }
L85:
	adiw R28,30
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym l temp3 27 A[3:3]c
	.dbsym l temp2 20 A[7:7]c
	.dbsym r Flag 22 pc
	.dbsym r Key 10 c
	.dbsym l temp1 3 A[17:17]c
	.dbsym r i 20 c
	.dbend
	.dbfunc e Convert _Convert fV
;           temp -> <dead>
;             p2 -> R20,R21
;             p1 -> R22
	.even
_Convert::
	rcall push_gset2
	mov R20,R18
	mov R21,R19
	mov R22,R16
	.dbline -1
	.dbline 335
;  
;  
; //***************************DS1722函数开始************************//
; 
; void Convert(uchar p1,uchar *p2)
; {uchar temp;
	.dbline 336
;  if(p1&0x80)   
	sbrs R22,7
	rjmp L185
	.dbline 337
;    {p2[13]=10;               //零下温度用10表示                    
	.dbline 337
	ldi R24,10
	mov R30,R20
	mov R31,R21
	std z+13,R24
	.dbline 338
;     p1=0xff-p1;}             //温度绝对值
	mov R2,R22
	clr R3
	ldi R22,255
	sub R22,R2
	sbc R23,R3
	.dbline 338
	rjmp L186
L185:
	.dbline 340
;  else
;    p2[13]=11;                //零上温度用11表示
	ldi R24,11
	mov R30,R20
	mov R31,R21
	std z+13,R24
L186:
	.dbline 341
;    p2[14]=p1/10;             //温度十位
	ldi R17,10
	mov R16,R22
	rcall div8u
	mov R30,R20
	mov R31,R21
	std z+14,R16
	.dbline 342
;    p2[15]=p1-p2[14]*10;      //温度个位
	mov R30,R20
	mov R31,R21
	ldd R17,z+14
	ldi R16,10
	rcall mpy8s
	mov R2,R22
	sub R2,R16
	mov R30,R20
	mov R31,R21
	std z+15,R2
	.dbline -2
	.dbline 343
; }
L184:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l temp 1 c
	.dbsym r p2 20 pc
	.dbsym r p1 22 c
	.dbend
	.dbfunc e DSWrite_Byte _DSWrite_Byte fV
;          clear -> R20
;           Data -> R18
;        Address -> R16
	.even
_DSWrite_Byte::
	rcall push_gset1
	.dbline -1
	.dbline 350
; 
; //***************************通过SPI接口写数据函数*****************//
; //函数参数说明:
; //Address:DS1722寄存器地址
; //Data:写入的数据
; void DSWrite_Byte(uchar Address,uchar Data)
; {uchar clear;
	.dbline 351
;  PORTB=PORTB|0x10;           //使能SPI器件
	sbi 0x18,4
	.dbline 352
;  SPDR=Address;
	out 0xf,R16
L188:
	.dbline 353
	.dbline 353
	.dbline 353
L189:
	.dbline 353
;  while(!(SPSR&0x80)) {;}
	sbis 0xe,7
	rjmp L188
	.dbline 354
;  clear=SPSR;
	in R20,0xe
	.dbline 355
;  clear=SPDR;
	in R20,0xf
	.dbline 356
;  SPDR=Data;
	out 0xf,R18
L191:
	.dbline 357
	.dbline 357
	.dbline 357
L192:
	.dbline 357
;  while(!(SPSR&0x80)) {;}
	sbis 0xe,7
	rjmp L191
	.dbline 358
;  clear=SPSR;
	in R20,0xe
	.dbline 359
;  clear=SPDR;
	in R20,0xf
	.dbline 360
;  PORTB=PORTB&0xef;
	in R24,0x18
	andi R24,239
	out 0x18,R24
	.dbline -2
	.dbline 361
; }
L187:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r clear 20 c
	.dbsym r Data 18 c
	.dbsym r Address 16 c
	.dbend
	.dbfunc e DSRead_Byte _DSRead_Byte fc
;           Data -> R20
;          clear -> R22
;        Address -> R16
	.even
_DSRead_Byte::
	rcall push_gset2
	.dbline -1
	.dbline 369
; 
; 
; //***************************通过SPI接口读数据函数*****************//
; //函数参数说明:
; //Address:DS1722寄存器地址
; //返回值:读取的温度数据
; uchar DSRead_Byte(uchar Address)
; {uchar clear;
	.dbline 371
;  uchar Data;
;  PORTB=PORTB|0x10;
	sbi 0x18,4
	.dbline 372
;  SPDR=Address;
	out 0xf,R16
L195:
	.dbline 373
	.dbline 373
	.dbline 373
L196:
	.dbline 373
;  while(!(SPSR&0x80)) {;}
	sbis 0xe,7
	rjmp L195
	.dbline 374
;  clear=SPSR;
	in R22,0xe
	.dbline 375
;  clear=SPDR;
	in R22,0xf
	.dbline 376
;  SPDR=Address;               //发空数据
	out 0xf,R16
L198:
	.dbline 377
	.dbline 377
	.dbline 377
L199:
	.dbline 377
;  while(!(SPSR&0x80)) {;}
	sbis 0xe,7
	rjmp L198
	.dbline 378
;  clear=SPSR;
	in R22,0xe
	.dbline 379
;  Data=SPDR;
	in R20,0xf
	.dbline 380
;  PORTB=PORTB&0xef;
	in R24,0x18
	andi R24,239
	out 0x18,R24
	.dbline 381
;  return(Data);
	mov R16,R20
	.dbline -2
L194:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r Data 20 c
	.dbsym r clear 22 c
	.dbsym r Address 16 c
	.dbend
	.area lit(rom, con, rel)
L202:
	.byte 2,0
	.byte 0,4
	.byte 1,2
	.byte 2,7
	.byte 1,1
	.byte 7,3
	.byte 0,0
	.byte 0,0
L203:
	.byte 'P,48
	.byte 32,3
	.byte 5,1
	.byte 5
	.area text(rom, con, rel)
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
	.dbfunc e main _main fV
;              i -> <dead>
; SD2303_Controller2 -> R20
; SD2303_Controller1 -> R22
;             DS -> R20
;             SD -> y+26
;       Set_Time -> y+19
;           time -> y+3
	.even
_main::
	sbiw R28,27
	.dbline -1
	.dbline 385
; }
;  
; void main(void)
; {uchar i;
	.dbline 386
;  uchar time[16]={2,0,0,4,1,2,2,7,1,1,7,3,0,0,0,0};
	ldi R24,<L202
	ldi R25,>L202
	mov R30,R28
	mov R31,R29
	adiw R30,3
	ldi R16,16
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 387
;  uchar Set_Time[7]={0x50,0x30,0x20,0x03,0x05,0x01,0x05};
	ldi R24,<L203
	ldi R25,>L203
	mov R30,R28
	mov R31,R29
	adiw R30,19
	ldi R16,7
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 390
;      //初始化时间   2005-01-05 Wed 20-30-50
;  uchar SD,DS; 
;  uchar SD2303_Controller1=0x00;              //禁止中断
	clr R22
	.dbline 391
;  uchar SD2303_Controller2=0x20;              //时间格式:24小时制
	ldi R20,32
	.dbline 392
;  DDRA=0xff;                                  //A口输出
	ldi R24,255
	out 0x1a,R24
	.dbline 393
;  DDRC=0xff;                                  //C口输出
	out 0x14,R24
	.dbline 394
;  DDRD=0x80;                                  //D口最高位输出,其他带上拉输入
	ldi R24,128
	out 0x11,R24
	.dbline 395
;  PORTD=0x7F;
	ldi R24,127
	out 0x12,R24
	.dbline 396
;  DDRB=0xF3;                                  //B口带第2、3位带上拉输入,其他输出
	ldi R24,243
	out 0x17,R24
	.dbline 397
;  PORTB=0xF3;
	out 0x18,R24
	.dbline 398
;  Write_1byte(SD2303,0x0e,SD2303_Controller1);//写控制字
	std y+0,R22
	ldi R18,14
	ldi R16,100
	rcall _Write_1byte
	.dbline 399
;  Write_1byte(SD2303,0x0f,SD2303_Controller2);//写控制字
	std y+0,R20
	ldi R18,15
	ldi R16,100
	rcall _Write_1byte
	.dbline 400
;  Write_Nbyte(SD2303,0x00,Set_Time,7);        //初始化时间
	ldi R24,7
	std y+2,R24
	mov R24,R28
	mov R25,R29
	adiw R24,19
	std y+1,R25
	std y+0,R24
	clr R18
	ldi R16,100
	rcall _Write_Nbyte
	.dbline 401
;  SPCR=0b01011100;
	ldi R24,92
	out 0xd,R24
	.dbline 402
;  DSWrite_Byte(0x80,0xf0);                      //DS1722 8位分辨率自由转换模式
	ldi R18,240
	ldi R16,128
	rcall _DSWrite_Byte
	rjmp L205
L204:
	.dbline 404
;  while(1)
; 	{Key_Process();                          //按键处理		
	.dbline 404
	rcall _Key_Process
	.dbline 405
; 	 Read_Nbyte(SD2303,0x00,Set_Time,7);     //读取时间
	ldi R24,7
	std y+2,R24
	mov R24,R28
	mov R25,R29
	adiw R24,19
	std y+1,R25
	std y+0,R24
	clr R18
	ldi R16,100
	rcall _Read_Nbyte
	.dbline 406
;      time[2]=Set_Time[6]>>4;                 //年高位;
	ldd R24,y+25
	swap R24
	andi R24,#0x0F
	std y+5,R24
	.dbline 407
; 	 time[3]=Set_Time[6]&0x0f;               //年低位;
	ldd R24,y+25
	andi R24,15
	std y+6,R24
	.dbline 408
; 	 time[4]=Set_Time[5]>>4;                 //月高位;
	ldd R24,y+24
	swap R24
	andi R24,#0x0F
	std y+7,R24
	.dbline 409
;      time[5]=Set_Time[5]&0x0f;               //月低位;
	ldd R24,y+24
	andi R24,15
	std y+8,R24
	.dbline 410
; 	 time[6]=Set_Time[4]>>4;                 //日高位;
	ldd R24,y+23
	swap R24
	andi R24,#0x0F
	std y+9,R24
	.dbline 411
; 	 time[7]=Set_Time[4]&0x0f;               //日低位;
	ldd R24,y+23
	andi R24,15
	std y+10,R24
	.dbline 412
; 	 time[8]=Set_Time[3];                    //星期;
	ldd R2,y+22
	std y+11,R2
	.dbline 413
; 	 time[9]=Set_Time[2]>>4;                 //时高位;
	ldd R24,y+21
	swap R24
	andi R24,#0x0F
	std y+12,R24
	.dbline 414
; 	 time[10]=Set_Time[2]&0x0f;              //时低位;
	ldd R24,y+21
	andi R24,15
	std y+13,R24
	.dbline 415
; 	 time[11]=Set_Time[1]>>4;                //分高位;
	ldd R24,y+20
	swap R24
	andi R24,#0x0F
	std y+14,R24
	.dbline 416
;      time[12]=Set_Time[1]&0x0f;              //分低位;
	ldd R24,y+20
	andi R24,15
	std y+15,R24
	.dbline 417
; 	 time[13]=Set_Time[0]>>4;                //秒高位;
	ldd R24,y+19
	swap R24
	andi R24,#0x0F
	std y+16,R24
	.dbline 418
; 	 time[14]=Set_Time[0]&0x0f;              //秒低位;
	ldd R24,y+19
	andi R24,15
	std y+17,R24
	.dbline 419
; 	 Read_Nbyte(SD2303,0x0f,&SD,1);          //读取中断标志位
	ldi R24,1
	std y+2,R24
	mov R24,R28
	mov R25,R29
	adiw R24,26
	std y+1,R25
	std y+0,R24
	ldi R18,15
	ldi R16,100
	rcall _Read_Nbyte
	.dbline 420
; 	 if(SD&0x02)  PORTD=PORTD|0x80;          //响铃1分钟
	ldd R2,y+26
	sbrs R2,1
	rjmp L231
	.dbline 420
	sbi 0x12,7
	rjmp L232
L231:
	.dbline 421
; 	 else            PORTD=PORTD&0x7F;       //关闭闹铃 
	in R24,0x12
	andi R24,127
	out 0x12,R24
L232:
	.dbline 422
	ldi R16,2
	rcall _DSRead_Byte
	mov R20,R16
	.dbline 423
	mov R18,R28
	mov R19,R29
	subi R18,253  ; offset = 3
	sbci R19,255
	rcall _Convert
	.dbline 424
	mov R16,R28
	mov R17,R29
	subi R16,253  ; offset = 3
	sbci R17,255
	rcall _Display
	.dbline 425
L205:
	.dbline 403
	rjmp L204
X21:
	.dbline -2
	.dbline 426
;      DS=DSRead_Byte(0x02);                   //读取温度值
;      Convert(DS,time);
;      Display(time);                          //时间显示
;    }
; }
L201:
	adiw R28,27
	.dbline 0 ; func end
	ret
	.dbsym l i 4 c
	.dbsym r SD2303_Controller2 20 c
	.dbsym r SD2303_Controller1 22 c
	.dbsym r DS 20 c
	.dbsym l SD 26 c
	.dbsym l Set_Time 19 A[7:7]c
	.dbsym l time 3 A[16:16]c
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
_F_Flag::
	.blkb 1
	.dbsym e F_Flag _F_Flag c
_Enter_Flag::
	.blkb 1
	.dbsym e Enter_Flag _Enter_Flag c

⌨️ 快捷键说明

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