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

📄 rtc.s

📁 AVRkaifashili.rar
💻 S
📖 第 1 页 / 共 3 页
字号:
	.dbsym r Number 22 c
	.dbsym r Array 10 pc
	.dbsym r Address 12 c
	.dbsym r Slave 14 c
	.dbend
	.dbfunc e Write_1byte _Write_1byte fV
;           Data -> R20
;        Address -> R22
;          Slave -> R10
	.even
_Write_1byte::
	rcall push_gset3
	mov R22,R18
	mov R10,R16
	ldd R20,y+6
	.dbline -1
	.dbline 177
; 
; //****************************写一个字节子程序**********************//
; //函数参数说明:
; //Slave:IIC器件地址,如上文定义的SD2303
; //Address:IIC器件寄存器地址
; //Data:数据
; void Write_1byte(uchar Slave,uchar Address,uchar Data)
; {writ:do                     //开始->写IIC器件地址->检查应答位
L62:
L63:
	.dbline 178
;     {Start();
	.dbline 178
	rcall _Start
	.dbline 179
;      Write_Byte(Slave);
	mov R16,R10
	rcall _Write_Byte
	.dbline 180
;      Check_Ack();
	rcall _Check_Ack
	.dbline 181
L64:
	.dbline 181
;     }while(F_Flag==1);
	lds R24,_F_Flag
	cpi R24,1
	breq L63
L66:
	.dbline 183
;    do
;     {Write_Byte(Address<<4); //送起始地址->检查应答位
	.dbline 183
	mov R16,R22
	andi R16,#0x0F
	swap R16
	rcall _Write_Byte
	.dbline 184
;      Check_Ack();
	rcall _Check_Ack
	.dbline 185
L67:
	.dbline 185
;     }while(F_Flag==1);
	lds R24,_F_Flag
	cpi R24,1
	breq L66
	.dbline 186
;    Write_Byte(Data);
	mov R16,R20
	rcall _Write_Byte
	.dbline 187
;    Check_Ack();              //检查应答位
	rcall _Check_Ack
	.dbline 188
;    Stop();                   //停止信号
	rcall _Stop
	.dbline -2
	.dbline 189
; }
L61:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r Data 20 c
	.dbsym r Address 22 c
	.dbsym r Slave 10 c
	.dbend
	.dbfunc e Read_Nbyte _Read_Nbyte fV
;          data0 -> R20
;              x -> R22
;         Number -> R10
;          Array -> R12,R13
;        Address -> R14
;          Slave -> y+10
	.even
_Read_Nbyte::
	rcall push_arg4
	rcall push_gset5
	mov R14,R18
	ldd R12,y+14
	ldd R13,y+15
	ldd R10,y+16
	.dbline -1
	.dbline 199
; 
; 
; //***************************读N个字节子程序***********************//
; //函数参数说明:
; //Slave:IIC器件地址,如上文定义的SD2303
; //Address:起始地址
; //Array:读数据存放的数组
; //Number:读取的字节数
; void Read_Nbyte(uchar Slave,uchar Address,uchar *Array,uchar Number)
; {uchar data0,x;
L70:
	.dbline 201
	.dbline 201
	rcall _Start
	.dbline 201
	ldd R16,y+10
	rcall _Write_Byte
	.dbline 201
	rcall _Check_Ack
	.dbline 201
L71:
	.dbline 201
;     //第一步:开始信号->写IIC器件地址->检查应答位
; 	do{Start();Write_Byte(Slave);Check_Ack();}while(F_Flag==1);
	lds R24,_F_Flag
	cpi R24,1
	breq L70
L73:
	.dbline 203
	.dbline 203
	mov R16,R14
	andi R16,#0x0F
	swap R16
	rcall _Write_Byte
	.dbline 203
	rcall _Check_Ack
	.dbline 203
L74:
	.dbline 203
;     //第二步:写起始地址->检查应答位
;     do {Write_Byte(Address<<4);Check_Ack();}while(F_Flag==1);
	lds R24,_F_Flag
	cpi R24,1
	breq L73
L76:
	.dbline 205
	.dbline 205
	rcall _Start
	.dbline 205
	ldd R16,y+10
	subi R16,255    ; addi 1
	rcall _Write_Byte
	.dbline 205
	rcall _Check_Ack
	.dbline 205
L77:
	.dbline 205
;     //第三步:开始信号->写IIC器件地址+1(表示读)->检查应答位
;     do{Start();Write_Byte(Slave+1);Check_Ack();}while(F_Flag==1);
	lds R24,_F_Flag
	cpi R24,1
	breq L76
	.dbline 207
;     //第四步:读N字节,每读完一字节发一个Ack应答,最后一字节发Nack
;     for(x=0;x<Number;x++)
	clr R22
	rjmp L82
L79:
	.dbline 208
;      {data0=Read_Byte();*Array=data0;Array++;
	.dbline 208
	rcall _Read_Byte
	mov R20,R16
	.dbline 208
	mov R30,R12
	mov R31,R13
	std z+0,R20
	.dbline 208
	mov R24,R30
	mov R25,R31
	adiw R24,1
	mov R12,R24
	mov R13,R25
	.dbline 209
	mov R24,R10
	subi R24,1
	cp R22,R24
	brsh L83
	.dbline 209
	.dbline 209
	rcall _Ack
	.dbline 209
L83:
	.dbline 209
L80:
	.dbline 207
	inc R22
L82:
	.dbline 207
	cp R22,R10
	brlo L79
	.dbline 210
; 	  if(x<(Number-1)) { Ack(); }}
;     Nack();
	rcall _Nack
	.dbline 212
;     //第五步:发停止信号,结束读操作
;     Stop();
	rcall _Stop
	.dbline -2
	.dbline 213
; }
L69:
	rcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r data0 20 c
	.dbsym r x 22 c
	.dbsym r Number 10 c
	.dbsym r Array 12 pc
	.dbsym r Address 14 c
	.dbsym l Slave 10 c
	.dbend
	.area lit(rom, con, rel)
L86:
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0
L87:
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0
L88:
	.byte 0,0
	.byte 255
	.area text(rom, con, rel)
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
	.dbfunc e Key_Process _Key_Process fV
;          temp3 -> y+27
;          temp2 -> y+20
;           Flag -> R22,R23
;            Key -> R10
;          temp1 -> y+3
;              i -> R20
	.even
_Key_Process::
	rcall push_gset4
	sbiw R28,30
	.dbline -1
	.dbline 218
; 
; //***************************按键处理程序**************************//
; //说明:为简化程序设计,此程序不保证输入的时间数据的合理性。
; void Key_Process(void)
; {uchar temp1[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	.dbline 218
	ldi R24,<L86
	ldi R25,>L86
	mov R30,R28
	mov R31,R29
	adiw R30,3
	ldi R16,17
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 220
;   //输入数据格式依次为年、月、日、星期、小时和分钟
;  uchar temp2[7]={0,0,0,0,0,0,0,};
	ldi R24,<L87
	ldi R25,>L87
	mov R30,R28
	mov R31,R29
	adiw R30,20
	ldi R16,7
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 221
;  uchar temp3[3]={0,0,0xff};
	ldi R24,<L88
	ldi R25,>L88
	mov R30,R28
	mov R31,R29
	adiw R30,27
	ldi R16,3
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	rcall asgncblk
	.dbline 226
;   //输入数据格式依次为小时和分钟
;  uchar Key;
;  uchar *Flag;
;  uchar i;
;  Flag=temp1;
	mov R22,R28
	mov R23,R29
	subi R22,253  ; offset = 3
	sbci R23,255
	.dbline 227
;  if(PIND!=0xff)
	in R24,0x10
	cpi R24,255
	brne X2
	rjmp L89
X2:
	.dbline 228
;   {DelayMs(20);                        //延时去抖
	.dbline 228
	ldi R16,20
	rcall _DelayMs
	.dbline 229
;    if(PIND!=0xff)
	in R24,0x10
	cpi R24,255
	breq L91
	.dbline 230
;    Key=PINB;
	in R10,0x16
L91:
	.dbline 231
;    if(Key==0xfe)                       //"时间设置"键按下
	mov R24,R10
	cpi R24,254
	breq X3
	rjmp L93
X3:
	.dbline 232
;     {temp1[0]|=0x80;                   //年高位设置提示
	.dbline 232
	ldd R24,y+3
	ori R24,128
	std y+3,R24
	rjmp L96
L95:
	.dbline 234
; 	 while(!Enter_Flag)                //直到按下确定键方停止
;        {for(i=0;i<50;i++)
	.dbline 234
	clr R20
	rjmp L101
L98:
	.dbline 235
	mov R16,R28
	mov R17,R29
	subi R16,253  ; offset = 3
	sbci R17,255
	rcall _Display
L99:
	.dbline 234
	inc R20
L101:
	.dbline 234
	cpi R20,50
	brlo L98
	.dbline 236
; 	      Display(temp1);              //显示和延时
; 		Key=~PIND;
	in R10,0x10
	com R10
	.dbline 237
; 		switch(Key)
	mov R12,R10
	clr R13
	mov R24,R12
	mov R25,R13
	cpi R24,16
	ldi R30,0
	cpc R25,R30
	brne X4
	rjmp L111
X4:
	ldi R24,16
	cp R24,R12
	cpc R25,R13
	brlt L121
L120:
	mov R24,R12
	mov R25,R13
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	breq L105
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	brge X5
	rjmp L103
X5:
L122:
	mov R24,R12
	mov R25,R13
	cpi R24,8
	ldi R30,0
	cpc R25,R30
	breq L108
	rjmp L103
L121:
	mov R24,R12
	mov R25,R13
	cpi R24,32
	ldi R30,0
	cpc R25,R30
	brne X6
	rjmp L115
X6:
	cpi R24,32
	ldi R30,0
	cpc R25,R30
	brge X7
	rjmp L103
X7:
L123:
	mov R24,R12
	mov R25,R13
	cpi R24,64
	ldi R30,0
	cpc R25,R30
	brne X8
	rjmp L119
X8:
	rjmp L103
X0:
	.dbline 238
; 		 {case 0x04:                   //"+"键处理
L105:
	.dbline 239
; 		       (*Flag)++;
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	subi R24,255    ; addi 1
	std z+0,R24
	.dbline 240
; 			   if(((*Flag)&0x7f)==10) *Flag=0|0x80;
	andi R24,127
	cpi R24,10
	breq X9
	rjmp L103
X9:
	.dbline 240
	ldi R24,128
	std z+0,R24
	.dbline 241
; 		       break;
	rjmp L103
L108:
	.dbline 243
; 		  case 0x08:                   //"-"键处理
; 		        if(((*Flag)&0x7f)==0)	*Flag=10|0x80; 
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	andi R24,127
	brne L109
	.dbline 243
	ldi R24,138
	std z+0,R24
L109:
	.dbline 244
; 				(*Flag)--;
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	subi R24,1
	std z+0,R24
	.dbline 245
; 				break;
	rjmp L103
L111:
	.dbline 247
; 		  case 0x10:                   //"下一位"键处理
; 		        Flag++;
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 248
; 				(*(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 249
; 				(*Flag)|=0x80;         //当前位加上小数点显示
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	ori R24,128
	std z+0,R24
	.dbline 250
; 				if(Flag==temp1+13) 
	mov R24,R28
	mov R25,R29
	adiw R24,16
	cp R30,R24
	cpc R31,R25
	breq X10
	rjmp L103
X10:
	.dbline 251
; 				 {Flag=temp1;
	.dbline 251
	mov R22,R28
	mov R23,R29
	subi R22,253  ; offset = 3
	sbci R23,255
	.dbline 252
; 				  (*Flag)|=0x80;
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	ori R24,128
	std z+0,R24
	.dbline 253
; 				  (*(Flag+13))&=0x7f;}
	adiw R30,13
	ldd R24,z+0
	andi R24,127
	std z+0,R24
	.dbline 253
	.dbline 254
; 				break;
	rjmp L103
L115:
	.dbline 256
; 		  case 0x20:                   //"上一位"键处理
; 		        if(Flag==temp1) 
	mov R24,R28
	mov R25,R29
	adiw R24,3
	cp R22,R24
	cpc R23,R25
	brne L116
	.dbline 257
; 				    {(*Flag)&=0x7f;
	.dbline 257
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	andi R24,127
	std z+0,R24
	.dbline 258
; 					 Flag=temp1+13;
	mov R22,R28
	mov R23,R29
	subi R22,240  ; offset = 16
	sbci R23,255
	.dbline 259
; 					 (*Flag)|=0x80;} 
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	ori R24,128
	std z+0,R24
	.dbline 259
	rjmp L117
L116:
	.dbline 260
; 				else Flag--;           
	subi R22,1
	sbci R23,0
L117:
	.dbline 261
; 				(*Flag)|=0x80;         //当前位加上小数点显示
	mov R30,R22
	mov R31,R23
	ldd R24,z+0
	ori R24,128
	std z+0,R24
	.dbline 262
; 				(*(Flag+1))&=0x7f;     //下一位去掉点小数点显示
	adiw R30,1
	ldd R24,z+0
	andi R24,127
	std z+0,R24
	.dbline 263
; 				break;
	rjmp L103
L119:
	.dbline 264
; 		  case 0x40:Enter_Flag=1;break;//"确定"键处理
	ldi R24,1
	sts _Enter_Flag,R24
	.dbline 264
	.dbline 266
; 	//	  case 0x80:Enter_Flag=1;break;  //测试用
; 		  default:break;}
L103:
	.dbline 268
L96:
	.dbline 233
	lds R2,_Enter_Flag
	tst R2
	brne X11
	rjmp L95
X11:
	.dbline 269
; 	    
; 	   }
; 	 Enter_Flag=0;                     //按键状态恢复
	clr R2
	sts _Enter_Flag,R2
	.dbline 270
;      temp2[0]=0x00;                    //秒,默认从00开始计时
	std y+20,R2
	.dbline 271
; 	 temp2[1]=(temp1[11]<<4)|temp1[12];//分
	ldd R2,y+15
	ldd R24,y+14
	andi R24,#0x0F
	swap R24
	or R24,R2
	std y+21,R24
	.dbline 272
; 	 temp2[2]=(temp1[9]<<4)|temp1[10]; //时
	ldd R2,y+13
	ldd R24,y+12
	andi R24,#0x0F
	swap R24
	or R24,R2
	std y+22,R24
	.dbline 273
; 	 temp2[3]=temp1[8];                //周
	ldd R2,y+11
	std y+23,R2
	.dbline 274
; 	 temp2[4]=(temp1[6]<<4)|temp1[7];  //日
	ldd R2,y+10
	ldd R24,y+9
	andi R24,#0x0F
	swap R24
	or R24,R2
	std y+24,R24
	.dbline 275
; 	 temp2[5]=(temp1[4]<<4)|temp1[5];  //月
	ldd R2,y+8
	ldd R24,y+7
	andi R24,#0x0F
	swap R24
	or R24,R2
	std y+25,R24
	.dbline 276
; 	 temp2[6]=(temp1[2]<<4)|temp1[3];  //年
	ldd R2,y+6
	ldd R24,y+5
	andi R24,#0x0F
	swap R24
	or R24,R2
	std y+26,R24
	.dbline 277
; 	 Write_Nbyte(SD2303,0x00,temp2,7); //初始化设定时间
	ldi R24,7
	std y+2,R24
	mov R24,R28
	mov R25,R29
	adiw R24,20
	std y+1,R25
	std y+0,R24
	clr R18
	ldi R16,100
	rcall _Write_Nbyte
	.dbline 278
;     }
L93:
	.dbline 279
;    if(Key==0xfd)                       //"闹铃设置"键按下
	mov R24,R10
	cpi R24,253
	breq X12
	rjmp L141
X12:
	.dbline 280
;     {temp1[9]|=0x80;
	.dbline 280
	ldd R24,y+12
	ori R24,128
	std y+12,R24
	.dbline 281
; 	 Flag=temp1+9;                     //定时小时高位设置提示
	mov R22,R28
	mov R23,R29
	subi R22,244  ; offset = 12
	sbci R23,255
	rjmp L146
L145:
	.dbline 283
; 	 while(!Enter_Flag)                //直到按下确定键方停止
;        {for(i=0;i<50;i++)
	.dbline 283
	clr R20
	rjmp L151
L148:
	.dbline 284
	mov R16,R28
	mov R17,R29
	subi R16,253  ; offset = 3
	sbci R17,255
	rcall _Display
L149:
	.dbline 283
	inc R20
L151:
	.dbline 283
	cpi R20,50
	brlo L148
	.dbline 285
; 	      Display(temp1);
; 		Key=~PINB;
	in R10,0x16
	com R10
	.dbline 286
; 		switch(Key)
	mov R12,R10
	clr R13
	mov R24,R12
	mov R25,R13
	cpi R24,16
	ldi R30,0
	cpc R25,R30
	brne X13
	rjmp L161
X13:
	ldi R24,16
	cp R24,R12
	cpc R25,R13
	brlt L173
L172:
	mov R24,R12
	mov R25,R13
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	breq L155
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	brge X14
	rjmp L153
X14:
L174:
	mov R24,R12
	mov R25,R13
	cpi R24,8
	ldi R30,0
	cpc R25,R30
	breq L158
	rjmp L153
L173:
	mov R24,R12
	mov R25,R13
	cpi R24,32
	ldi R30,0
	cpc R25,R30
	brne X15
	rjmp L166
X15:
	cpi R24,32
	ldi R30,0
	cpc R25,R30
	brge X16
	rjmp L153
X16:
L175:
	mov R24,R12
	mov R25,R13
	cpi R24,64

⌨️ 快捷键说明

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