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

📄 twi.lst

📁 一个基于MEGA16的GUI
💻 LST
📖 第 1 页 / 共 2 页
字号:
 310 00ec E091 0000 		lds r30,strTWI+4
 311 00f0 F091 0000 		lds r31,(strTWI+4)+1
 312 00f4 8191      		ld r24,Z+
 313 00f6 F093 0000 		sts (strTWI+4)+1,r31
 314 00fa E093 0000 		sts strTWI+4,r30
 315 00fe 83B9      		out 35-0x20,r24
 133:twi.c         ****                 strTWI.DATALEN--;
 317               	.LM29:
 318 0100 8091 0000 		lds r24,strTWI+6
 319 0104 9091 0000 		lds r25,(strTWI+6)+1
 320 0108 0197      		sbiw r24,1
 321 010a 9093 0000 		sts (strTWI+6)+1,r25
 322 010e 8093 0000 		sts strTWI+6,r24
 134:twi.c         ****                 state=ST_WDATA-1;				//下一步将跳到WDATA分支
 324               	.LM30:
 325 0112 46E0      		ldi r20,lo8(6)
 135:twi.c         ****                 TWCR=TW_ACT;         			//触发下一步动作
 327               	.LM31:
 328 0114 85E8      		ldi r24,lo8(-123)
 329 0116 60C0      		rjmp .L45
 330               	.L17:
 136:twi.c         ****             }
 137:twi.c         ****         }
 138:twi.c         ****         else
 139:twi.c         ****         {//发送eeprom地址出错
 140:twi.c         ****             state=ST_FAIL;
 141:twi.c         ****         }
 142:twi.c         ****         break;
 143:twi.c         ****     case ST_RESTART:	//RESTART状态检查,只有读操作模式才能跳到这里
 144:twi.c         ****         if(status==TW_REP_START)
 332               	.LM32:
 333 0118 2031      		cpi r18,lo8(16)
 334 011a 09F0      		breq .+2
 335 011c 51C0      		rjmp .L37
 336               	.L48:
 145:twi.c         ****         {//发送restart信号成功
 146:twi.c         ****             TWDR=strTWI.SLA;					//发器件地址读SLAR
 338               	.LM33:
 339 011e 33B9      		out 35-0x20,r19
 340 0120 46C0      		rjmp .L43
 341               	.L20:
 147:twi.c         ****             TWCR=TW_ACT;         				//触发下一步动作,同时清start发送标志
 148:twi.c         ****         }
 149:twi.c         ****         else
 150:twi.c         ****         {//重发start信号出错
 151:twi.c         ****             state=ST_FAIL;
 152:twi.c         ****         }
 153:twi.c         ****         break;
 154:twi.c         ****     case ST_SLAR:	//SLAR状态检查,只有读操作模式才能跳到这里
 155:twi.c         ****         if(status==TW_MR_SLA_ACK)
 343               	.LM34:
 344 0122 2034      		cpi r18,lo8(64)
 345 0124 09F0      		breq .+2
 346 0126 4CC0      		rjmp .L37
 347 0128 0DC0      		rjmp .L47
 348               	.L25:
 156:twi.c         ****         {//发送器件地址成功
 157:twi.c         ****             if (strTWI.DATALEN--)
 158:twi.c         ****             {//多个数据
 159:twi.c         ****                 TWCR=(1<<TWEA)|TW_ACT;			//设定ACK,触发下一步动作
 160:twi.c         ****             }
 161:twi.c         ****             else
 162:twi.c         ****             {//只有一个数据
 163:twi.c         ****                 TWCR=TW_ACT;					//设定NAK,触发下一步动作
 164:twi.c         ****             }
 165:twi.c         ****         }
 166:twi.c         ****         else
 167:twi.c         ****         {//发送器件地址出错
 168:twi.c         ****             state=ST_FAIL;
 169:twi.c         ****         }
 170:twi.c         ****         break;
 171:twi.c         ****     case ST_RDATA:	//读取数据状态检查,只有读操作模式才能跳到这里
 172:twi.c         ****         state--;								//循环,直到读完指定长度数据
 350               	.LM35:
 351 012a 4150      		subi r20,lo8(-(-1))
 173:twi.c         ****         if(status==TW_MR_DATA_ACK)
 353               	.LM36:
 354 012c 2035      		cpi r18,lo8(80)
 355 012e C1F4      		brne .L26
 174:twi.c         ****         {//读取数据成功,但不是最后一个数据
 175:twi.c         ****             *strTWI.pBUF++=TWDR;
 357               	.LM37:
 358 0130 E091 0000 		lds r30,strTWI+4
 359 0134 F091 0000 		lds r31,(strTWI+4)+1
 360 0138 83B1      		in r24,35-0x20
 361 013a 8193      		st Z+,r24
 362 013c F093 0000 		sts (strTWI+4)+1,r31
 363 0140 E093 0000 		sts strTWI+4,r30
 364               	.L47:
 176:twi.c         ****             if (strTWI.DATALEN--)
 366               	.LM38:
 367 0144 8091 0000 		lds r24,strTWI+6
 368 0148 9091 0000 		lds r25,(strTWI+6)+1
 369 014c 0197      		sbiw r24,1
 370 014e 9093 0000 		sts (strTWI+6)+1,r25
 371 0152 8093 0000 		sts strTWI+6,r24
 372 0156 8F5F      		subi r24,lo8(-1)
 373 0158 9F4F      		sbci r25,hi8(-1)
 374 015a 49F1      		breq .L43
 177:twi.c         ****             {//还有多个数据
 178:twi.c         ****                 TWCR=(1<<TWEA)|TW_ACT;			//设定ACK,触发下一步动作
 376               	.LM39:
 377 015c 85EC      		ldi r24,lo8(-59)
 378 015e 28C0      		rjmp .L44
 379               	.L26:
 179:twi.c         ****             }
 180:twi.c         ****             else
 181:twi.c         ****             {//准备读最后一个数据
 182:twi.c         ****                 TWCR=TW_ACT;					//设定NAK,触发下一步动作
 183:twi.c         ****             }
 184:twi.c         ****         }
 185:twi.c         ****         else if(status==TW_MR_DATA_NACK)
 381               	.LM40:
 382 0160 2835      		cpi r18,lo8(88)
 383 0162 71F5      		brne .L37
 186:twi.c         ****         {//已经读完最后一个数据
 187:twi.c         ****             *strTWI.pBUF++=TWDR;
 385               	.LM41:
 386 0164 E091 0000 		lds r30,strTWI+4
 387 0168 F091 0000 		lds r31,(strTWI+4)+1
 388 016c 83B1      		in r24,35-0x20
 389 016e 8193      		st Z+,r24
 390 0170 F093 0000 		sts (strTWI+4)+1,r31
 391 0174 E093 0000 		sts strTWI+4,r30
 392 0178 1DC0      		rjmp .L34
 393               	.L32:
 188:twi.c         ****             TWCR=(1<<TWSTO)|TW_ACT;				//发送停止信号,不会再产生中断了
 189:twi.c         ****             strTWI.STATUS=TW_OK;
 190:twi.c         ****         }
 191:twi.c         ****         else
 192:twi.c         ****         {//读取数据出错
 193:twi.c         ****             state=ST_FAIL;
 194:twi.c         ****         }
 195:twi.c         ****         break;
 196:twi.c         ****     case ST_WDATA:	//写数据状态检查,只有写操作模式才能跳到这里
 197:twi.c         ****         state--;								//循环,直到写完指定长度数据
 395               	.LM42:
 396 017a 4150      		subi r20,lo8(-(-1))
 198:twi.c         ****         if(status==TW_MT_DATA_ACK)
 398               	.LM43:
 399 017c 2832      		cpi r18,lo8(40)
 400 017e 01F5      		brne .L37
 199:twi.c         ****         {//写数据成功
 200:twi.c         ****             if (strTWI.DATALEN)
 402               	.LM44:
 403 0180 2091 0000 		lds r18,strTWI+6
 404 0184 3091 0000 		lds r19,(strTWI+6)+1
 405 0188 2115      		cp r18,__zero_reg__
 406 018a 3105      		cpc r19,__zero_reg__
 407 018c 99F0      		breq .L34
 201:twi.c         ****             {//还要写
 202:twi.c         ****                 TWDR=*strTWI.pBUF++;
 409               	.LM45:
 410 018e E091 0000 		lds r30,strTWI+4
 411 0192 F091 0000 		lds r31,(strTWI+4)+1
 412 0196 8191      		ld r24,Z+
 413 0198 F093 0000 		sts (strTWI+4)+1,r31
 414 019c E093 0000 		sts strTWI+4,r30
 415 01a0 83B9      		out 35-0x20,r24
 203:twi.c         ****                 strTWI.DATALEN--;
 417               	.LM46:
 418 01a2 2150      		subi r18,lo8(-(-1))
 419 01a4 3040      		sbci r19,hi8(-(-1))
 420 01a6 3093 0000 		sts (strTWI+6)+1,r19
 421 01aa 2093 0000 		sts strTWI+6,r18
 422               	.L43:
 204:twi.c         ****                 TWCR=TW_ACT;         			//触发下一步动作
 424               	.LM47:
 425 01ae 85E8      		ldi r24,lo8(-123)
 426               	.L44:
 427 01b0 86BF      		out 86-0x20,r24
 428 01b2 08C0      		rjmp .L5
 429               	.L34:
 205:twi.c         ****             }
 206:twi.c         ****             else
 207:twi.c         ****             {//写够了
 208:twi.c         ****                 TWCR=(1<<TWSTO)|TW_ACT;			//发送停止信号,不会再产生中断了
 431               	.LM48:
 432 01b4 85E9      		ldi r24,lo8(-107)
 433 01b6 86BF      		out 86-0x20,r24
 209:twi.c         ****                 strTWI.STATUS=TW_OK;
 435               	.LM49:
 436 01b8 81E0      		ldi r24,lo8(1)
 437 01ba 8093 0000 		sts strTWI,r24
 438 01be 02C0      		rjmp .L5
 439               	.L37:
 210:twi.c         ****                 //启动写命令后需要10ms(最大)的编程时间才能真正的把数据记录下来
 211:twi.c         ****                 //编程期间器件不响应任何命令
 212:twi.c         ****             }
 213:twi.c         ****         }
 214:twi.c         ****         else
 215:twi.c         ****         {//写数据失败
 216:twi.c         ****             state=ST_FAIL;
 217:twi.c         ****         }
 218:twi.c         ****         break;
 219:twi.c         ****     default:
 220:twi.c         ****         //错误状态
 221:twi.c         ****         state=ST_FAIL;
 441               	.LM50:
 442 01c0 40E0      		ldi r20,lo8(0)
 443 01c2 02C0      		rjmp .L42
 444               	.L5:
 222:twi.c         ****         break;
 223:twi.c         ****     }
 224:twi.c         **** 
 225:twi.c         ****     if (state==ST_FAIL)
 446               	.LM51:
 447 01c4 4423      		tst r20
 448 01c6 79F4      		brne .L39
 449               	.L42:
 226:twi.c         ****     {//错误处理
 227:twi.c         ****         strTWI.FAILCNT++;
 451               	.LM52:
 452 01c8 8091 0000 		lds r24,strTWI+9
 453 01cc 8F5F      		subi r24,lo8(-(1))
 454 01ce 8093 0000 		sts strTWI+9,r24
 228:twi.c         ****         if (strTWI.FAILCNT<FAIL_MAX)
 456               	.LM53:
 457 01d2 8A30      		cpi r24,lo8(10)
 458 01d4 18F4      		brsh .L40
 229:twi.c         ****         {//重试次数未超出最大值,
 230:twi.c         ****             TWCR=(1<<TWSTA)|TW_ACT;				//发生错误,启动start信号
 460               	.LM54:
 461 01d6 85EA      		ldi r24,lo8(-91)
 462               	.L45:
 463 01d8 86BF      		out 86-0x20,r24
 464 01da 05C0      		rjmp .L39
 465               	.L40:
 231:twi.c         ****         }
 232:twi.c         ****         else
 233:twi.c         ****         {//否则停止
 234:twi.c         ****             TWCR=(1<<TWSTO)|TW_ACT;				//发送停止信号,不会再产生中断了
 467               	.LM55:
 468 01dc 85E9      		ldi r24,lo8(-107)
 469 01de 86BF      		out 86-0x20,r24
 235:twi.c         ****             strTWI.STATUS=TW_FAIL;
 471               	.LM56:
 472 01e0 82E0      		ldi r24,lo8(2)
 473 01e2 8093 0000 		sts strTWI,r24
 474               	.L39:
 236:twi.c         ****         }
 237:twi.c         ****     }
 238:twi.c         ****     state++;
 476               	.LM57:
 477 01e6 4F5F      		subi r20,lo8(-(1))
 239:twi.c         ****     strTWI.STATE=state;							//保存状态
 479               	.LM58:
 480 01e8 4093 0000 		sts strTWI+8,r20
 481               	.L3:
 482               	/* epilogue: frame size=0 */
 483 01ec FF91      		pop r31
 484 01ee EF91      		pop r30
 485 01f0 9F91      		pop r25
 486 01f2 8F91      		pop r24
 487 01f4 5F91      		pop r21
 488 01f6 4F91      		pop r20
 489 01f8 3F91      		pop r19
 490 01fa 2F91      		pop r18
 491 01fc 0F90      		pop __tmp_reg__
 492 01fe 0FBE      		out __SREG__,__tmp_reg__
 493 0200 0F90      		pop __tmp_reg__
 494 0202 1F90      		pop __zero_reg__
 495 0204 1895      		reti
 496               	/* epilogue end (size=13) */
 497               	/* function __vector_17 size 228 (202) */
 504               	.Lscope1:
 505               		.comm strTWI,10,1
 506               		.comm Alarm,1,1
 507               		.comm BUFFER,10,1
 511               		.text
 513               	Letext:
 514               	/* File "twi.c": code  262 = 0x0106 ( 236), prologues  13, epilogues  13 */
DEFINED SYMBOLS
                            *ABS*:00000000 twi.c
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:3      *ABS*:0000003f __SREG__
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:4      *ABS*:0000003e __SP_H__
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:5      *ABS*:0000003d __SP_L__
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:6      *ABS*:00000000 __tmp_reg__
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:7      *ABS*:00000001 __zero_reg__
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:132    .text:00000000 TWI_RW
                            *COM*:0000000a strTWI
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:194    .text:00000044 __vector_17
                            *COM*:00000001 Alarm
                            *COM*:0000000a BUFFER
C:\DOCUME~1\64564564\LOCALS~1\Temp/cck9aaaa.s:513    .text:00000206 Letext

UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss

⌨️ 快捷键说明

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