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

📄 stk500i.lst

📁 avr单片机atmage16驱动小灯的一些例程 并且包括一些收发数据的程序利用usb口
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0443 E070      LDI	R23,0
    0444 01FE      MOVW	R30,R28
    0445 8022      LDD	R2,Z+2
    0446 8033      LDD	R3,Z+3
    0447 8044      LDD	R4,Z+4
    0448 8055      LDD	R5,Z+5
    0449 0E24      ADD	R2,R20
    044A 1E35      ADC	R3,R21
    044B 1E46      ADC	R4,R22
    044C 1E57      ADC	R5,R23
    044D 01FE      MOVW	R30,R28
    044E 8222      STD	Z+2,R2
    044F 8233      STD	Z+3,R3
    0450 8244      STD	Z+4,R4
    0451 8255      STD	Z+5,R5
(0497) 				}
(0498) 				
(0499) 				//increment (word) address only when we have an uneven (byte) address
(0500) 				if(i&1) address++;
    0452 FEC0      SBRS	R12,0
    0453 C018      RJMP	0x046C
    0454 E041      LDI	R20,1
    0455 E050      LDI	R21,0
    0456 E060      LDI	R22,0
    0457 E070      LDI	R23,0
    0458 9040006E  LDS	R4,address+2
    045A 9050006F  LDS	R5,address+3
    045C 9020006C  LDS	R2,address
    045E 9030006D  LDS	R3,address+1
    0460 0E24      ADD	R2,R20
    0461 1E35      ADC	R3,R21
    0462 1E46      ADC	R4,R22
    0463 1E57      ADC	R5,R23
    0464 9230006D  STS	address+1,R3
    0466 9220006C  STS	address,R2
    0468 9250006F  STS	address+3,R5
    046A 9240006E  STS	address+2,R4
    046C 01C6      MOVW	R24,R12
    046D 9601      ADIW	R24,1
    046E 016C      MOVW	R12,R24
    046F 14CA      CP	R12,R10
    0470 04DB      CPC	R13,R11
    0471 F408      BCC	0x0473
    0472 CF7B      RJMP	0x03EE
(0501) 			}
(0502) 			
(0503) 			//If this page is complete the bit 7 of mode will be set and we programm the page
(0504) 			if(mode&0x80)
    0473 FEE7      SBRS	R14,7
    0474 C077      RJMP	0x04EC
(0505) 			{
(0506) 				spi_transfer_8(msg_buffer[6]);								
    0475 9100007A  LDS	R16,0x7A
    0477 D495      RCALL	_spi_transfer_8
(0507) 				spi_transfer_16(start_address&0xFFFF);
    0478 EF4F      LDI	R20,0xFF
    0479 EF5F      LDI	R21,0xFF
    047A E060      LDI	R22,0
    047B E070      LDI	R23,0
    047C 01FE      MOVW	R30,R28
    047D 8026      LDD	R2,Z+6
    047E 8037      LDD	R3,Z+7
    047F 8440      LDD	R4,Z+8
    0480 8451      LDD	R5,Z+9
    0481 2224      AND	R2,R20
    0482 2235      AND	R3,R21
    0483 2246      AND	R4,R22
    0484 2257      AND	R5,R23
    0485 0181      MOVW	R16,R2
    0486 D48B      RCALL	_spi_transfer_16
(0508) 				spi_transfer_8(0);
    0487 2700      CLR	R16
    0488 D484      RCALL	_spi_transfer_8
(0509) 				
(0510) 				//If we have no valid polling address switch to simple wait mode
(0511) 				if(polling_address==0)
    0489 E040      LDI	R20,0
    048A E050      LDI	R21,0
    048B E060      LDI	R22,0
    048C E070      LDI	R23,0
    048D 01FE      MOVW	R30,R28
    048E 8022      LDD	R2,Z+2
    048F 8033      LDD	R3,Z+3
    0490 8044      LDD	R4,Z+4
    0491 8055      LDD	R5,Z+5
    0492 1624      CP	R2,R20
    0493 0635      CPC	R3,R21
    0494 0646      CPC	R4,R22
    0495 0657      CPC	R5,R23
    0496 F421      BNE	0x049B
(0512) 				{
(0513) 					mode = (mode&(~0x70)) | 0x10;
    0497 2D8E      MOV	R24,R14
    0498 788F      ANDI	R24,0x8F
    0499 6180      ORI	R24,0x10
    049A 2EE8      MOV	R14,R24
(0514) 				}
(0515) 				
(0516) 				//Different polling methods
(0517) 				//Hard waiting
(0518) 				if((mode&0x70) == 0x10)
    049B 2D8E      MOV	R24,R14
    049C 7780      ANDI	R24,0x70
    049D 3180      CPI	R24,0x10
    049E F429      BNE	0x04A4
(0519) 				{
(0520) 					wait_ms(msg_buffer[4]);
    049F 91000078  LDS	R16,0x78
    04A1 2711      CLR	R17
    04A2 DBB9      RCALL	_wait_ms
(0521) 				}
    04A3 C048      RJMP	0x04EC
(0522) 				//Data polling
(0523) 				else if((mode&0x70) == 0x20)
    04A4 2D8E      MOV	R24,R14
    04A5 7780      ANDI	R24,0x70
    04A6 3280      CPI	R24,0x20
    04A7 F009      BEQ	0x04A9
    04A8 C033      RJMP	0x04DC
(0524) 				{
(0525) 					do{
(0526) 						//If we have an uneven byte read the
(0527) 						//high byte			
(0528) 						if(polling_address%2)
    04A9 E041      LDI	R20,1
    04AA E050      LDI	R21,0
    04AB E060      LDI	R22,0
    04AC E070      LDI	R23,0
    04AD 01FE      MOVW	R30,R28
    04AE 8022      LDD	R2,Z+2
    04AF 8033      LDD	R3,Z+3
    04B0 8044      LDD	R4,Z+4
    04B1 8055      LDD	R5,Z+5
    04B2 2224      AND	R2,R20
    04B3 2235      AND	R3,R21
    04B4 2246      AND	R4,R22
    04B5 2257      AND	R5,R23
    04B6 E040      LDI	R20,0
    04B7 E050      LDI	R21,0
    04B8 E060      LDI	R22,0
    04B9 E070      LDI	R23,0
    04BA 1624      CP	R2,R20
    04BB 0635      CPC	R3,R21
    04BC 0646      CPC	R4,R22
    04BD 0657      CPC	R5,R23
    04BE F029      BEQ	0x04C4
(0529) 						{
(0530) 							spi_transfer_8(msg_buffer[7]|(1<<3));
    04BF 9100007B  LDS	R16,0x7B
    04C1 6008      ORI	R16,0x8
    04C2 D44A      RCALL	_spi_transfer_8
(0531) 						}
    04C3 C003      RJMP	0x04C7
(0532) 						else
(0533) 						{
(0534) 							spi_transfer_8(msg_buffer[7]);
    04C4 9100007B  LDS	R16,0x7B
    04C6 D446      RCALL	_spi_transfer_8
(0535) 						}
(0536) 						spi_transfer_16(polling_address/2);
    04C7 01FE      MOVW	R30,R28
    04C8 8022      LDD	R2,Z+2
    04C9 8033      LDD	R3,Z+3
    04CA 8044      LDD	R4,Z+4
    04CB 8055      LDD	R5,Z+5
    04CC 9456      LSR	R5
    04CD 9447      ROR	R4
    04CE 9437      ROR	R3
    04CF 9427      ROR	R2
    04D0 0181      MOVW	R16,R2
    04D1 D440      RCALL	_spi_transfer_16
(0537) 						tmp=spi_transfer_8(0x00);
    04D2 2700      CLR	R16
    04D3 D439      RCALL	_spi_transfer_8
    04D4 870D      STD	Y+13,R16
(0538) 					}while(tmp==msg_buffer[8]);
    04D5 9020007C  LDS	R2,0x7C
    04D7 840D      LDD	R0,Y+13
    04D8 1402      CP	R0,R2
    04D9 F409      BNE	0x04DB
    04DA CFCE      RJMP	0x04A9
(0539) 				}
    04DB C010      RJMP	0x04EC
(0540) 				//RDY/BSY polling
(0541) 				else if((mode&0x70) == 0x40)
    04DC 2D8E      MOV	R24,R14
    04DD 7780      ANDI	R24,0x70
    04DE 3480      CPI	R24,0x40
    04DF F441      BNE	0x04E8
(0542) 				{
(0543) 					while(spi_transfer_32(0xF0000000)&1);
    04E0 E000      LDI	R16,0
    04E1 E010      LDI	R17,0
    04E2 E020      LDI	R18,0
    04E3 EF30      LDI	R19,0xF0
    04E4 D439      RCALL	_spi_transfer_32
    04E5 FD00      SBRC	R16,0
    04E6 CFF9      RJMP	0x04E0
(0544) 				}
    04E7 C004      RJMP	0x04EC
(0545) 				//If something was not correct with the given mode do
(0546) 				//hard waiting. Should never reach this point
(0547) 				else
(0548) 				{
(0549) 					wait_ms(msg_buffer[4]);					
    04E8 91000078  LDS	R16,0x78
    04EA 2711      CLR	R17
    04EB DB70      RCALL	_wait_ms
(0550) 				}
(0551) 			}
(0552) 		}
(0553) 		
(0554) 		num_bytes = 2;
    04EC E082      LDI	R24,2
    04ED E090      LDI	R25,0
    04EE 879B      STD	Y+11,R25
    04EF 878A      STD	Y+10,R24
(0555) 		msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
    04F0 E183      LDI	R24,0x13
    04F1 93800074  STS	msg_buffer,R24
(0556) 		msg_buffer[1] = STATUS_CMD_OK;
    04F3 2422      CLR	R2
    04F4 92200075  STS	msg_buffer+1,R2
(0557) 	}
    04F6 C373      RJMP	0x086A
(0558) 	//////////////////////////////////////
(0559) 	//CMD_READ_FLASH_ISP
(0560) 	//////////////////////////////////////
(0561) 	else if(cmd==CMD_READ_FLASH_ISP)
    04F7 858C      LDD	R24,Y+12
    04F8 3184      CPI	R24,0x14
    04F9 F009      BEQ	0x04FB
    04FA C066      RJMP	0x0561
(0562) 	{
(0563) 		block_size = ((unsigned int)msg_buffer[1])<<8;
    04FB 90A00075  LDS	R10,msg_buffer+1
    04FD 24BB      CLR	R11
    04FE 2CBA      MOV	R11,R10
    04FF 24AA      CLR	R10
(0564) 		block_size |= msg_buffer[2];
    0500 90200076  LDS	R2,msg_buffer+2
    0502 2433      CLR	R3
    0503 28A2      OR	R10,R2
    0504 28B3      OR	R11,R3
(0565) 		tmp = msg_buffer[3];
    0505 90200077  LDS	R2,msg_buffer+3
    0507 862D      STD	Y+13,R2
(0566) 		
(0567) 		for(i=0;i<block_size;i++)
    0508 24CC      CLR	R12
    0509 24DD      CLR	R13
    050A C040      RJMP	0x054B
(0568) 		{
(0569) 			//Select Low or High-Byte
(0570) 			if(i&1)
    050B FEC0      SBRS	R12,0
    050C C004      RJMP	0x0511
(0571) 			{
(0572) 				spi_transfer_8(tmp|(1<<3));
    050D 850D      LDD	R16,Y+13
    050E 6008      ORI	R16,0x8
    050F D3FD      RCALL	_spi_transfer_8
(0573) 			}
    0510 C002      RJMP	0x0513
(0574) 			else
(0575) 			{
(0576) 				spi_transfer_8(tmp);
    0511 850D      LDD	R16,Y+13
    0512 D3FA      RCALL	_spi_transfer_8
(0577) 			}
(0578) 			
(0579) 			spi_transfer_16(address&0xFFFF);
    0513 EF4F      LDI	R20,0xFF
    0514 EF5F      LDI	R21,0xFF
    0515 E060      LDI	R22,0
    0516 E070      LDI	R23,0
    0517 9040006E  LDS	R4,address+2
    0519 9050006F  LDS	R5,address+3
    051B 9020006C  LDS	R2,address
    051D 9030006D  LDS	R3,address+1
    051F 2224      AND	R2,R20
    0520 2235      AND	R3,R21
    0521 2246      AND	R4,R22
    0522 2257      AND	R5,R23
    0523 0181      MOVW	R16,R2
    0524 D3ED      RCALL	_spi_transfer_16
(0580) 			msg_buffer[i+2] = spi_transfer_8(0);
    0525 2700      CLR	R16
    0526 D3E6      RCALL	_spi_transfer_8
    0527 E784      LDI	R24,0x74
    0528 E090      LDI	R25,0
    0529 01F6      MOVW	R30,R12
    052A 9632      ADIW	R30,2
    052B 0FE8      ADD	R30,R24
    052C 1FF9      ADC	R31,R25
    052D 8300      STD	Z+0,R16
(0581) 			
(0582) 			//increment (word) address only when we have an uneven (byte) address
(0583) 			if(i&1) address++;
    052E FEC0      SBRS	R12,0
    052F C018      RJMP	0x0548
    0530 E041      LDI	R20,1
    0531 E050      LDI	R21,0
    0532 E060      LDI	R22,0
    0533 E070      LDI	R23,0
    0534 9040006E  LDS	R4,address+2
    0536 9050006F  LDS	R5,address+3
    0538 9020006C  LDS	R2,address
    053A 9030006D  LDS	R3,address+1
    053C 0E24      ADD	R2,R20
    053D 1E35      ADC	R3,R21
    053E 1E46      ADC	R4,R22
    053F 1E57      ADC	R5,R23
    0540 9230006D  STS	address+1,R3
    0542 9220006C  STS	address,R2
    0544 9250006F  STS	address+3,R5
    0546 9240006E  STS	address+2,R4
    0548 01C6      MOVW	R24,R12
    0549 9601      ADIW	R24,1
    054A 016C      MOVW	R12,R24
    054B 14CA      CP	R12,R10
    054C 04DB      CPC	R13,R11
    054D F408      BCC	0x054F
    054E CFBC      RJMP	0x050B
(0584) 		}
(0585) 		
(0586) 		num_bytes = block_size+3;
    054F 01C5      MOVW	R24,R10
    0550 9603      ADIW	R24,3
    0551 879B      STD	Y+11,R25
    0552 878A      STD	Y+10,R24
(0587) 		msg_buffer[0] = CMD_READ_FLASH_ISP;
    0553 E184      LDI	R24,0x14
    0554 93800074  STS	msg_buffer,R24
(0588) 		msg_buffer[1] = STATUS_CMD_OK;
    0556 2422      CLR	R2
    0557 92200075  STS	msg_buffer+1,R2
(0589) 		msg_buffer[block_size+2] = STATUS_CMD_OK;
    0559 E784      LDI	R24,0x74
    055A E090      LDI	R25,0
    055B 01F5      MOVW	R30,R10
    055C 9632      ADIW	R30,2
    055D 0FE8      ADD	R30,R24
    055E 1FF9      ADC	R31,R25
    055F 8220      STD	Z+0,R2
(0590) 	}
    0560 C309      RJMP	0x086A
(0591) 	//////////////////////////////////////
(0592) 	//CMD_PROGRAM_EEPROM_ISP
(0593) 	//////////////////////////////////////
(0594) 	else if(cmd==CMD_PROGRAM_EEPROM_ISP)
    0561 858C      LDD	R24,Y+12
    0562 3185      CPI	R24,0x15
    0563 F009      BEQ	0x0565
    0564 C174      RJMP	0x06D9
(0595) 	{
(0596) 		block_size = ((unsigned int)msg_buffer[1])<<8;
    0565 90A00075  LDS	R10,msg_buffer+1
    0567 24BB      CLR	R11
    0568 2CBA      MOV	R11,R10
    0569 24AA      CLR	R10
(0597) 		block_size |= msg_buffer[2];
    056A 90200076  LDS	R2,msg_buffer+2
    056C 2433      CLR	R3
    056D 28A2      OR	R10,R2
    056E 28B3      OR	R11,R3
(0598) 		mode = msg_buffer[3];
    056F 90E00077  LDS	R14,msg_buffer+3
(0599) 		
(0600) 		//Byte Mode
(0601) 		if((mode&1) == 0)
    0571 FCE0      SBRC	R14,0
    0572 C09B      RJMP	0x060E
(0602) 		{		
(0603) 			for(i=0;i<block_size;i++)
    0573 24CC      CLR	R12
    0574 24DD      CLR	R13
    0575 C093      RJMP	0x0609
(0604) 			{	
(0605) 				spi_transfer_8(msg_buffer[5]);								
    0576 91000079  LDS	R16,0x79
    0578 D394      RCALL	_spi_transfer_8
(0606) 				spi_transfer_16(address&0xFFFF);
    0579 EF4F      LDI	R20,0xFF
    057A EF5F      LDI	R21,0xFF
    057B E060      LDI	R22,0
    057C E070      LDI	R23,0
    057D 9040006E  LDS	R4,address+2
    057F 9050006F  LDS	R5,address+3
    0581 9020006C  LDS	R2,address
    0583 9030006D  LDS	R3,address+1
    0585 2224      AND	R2,R20
    0586 2235      AND	R3,R21
    0587 2246      AND	R4,R22
    0588 2257      AND	R5,R23
    0589 0181      MOVW	R16,R2
    058A D387      RCALL	_spi_transfer_16
(0607) 				spi_transfer_8(msg_buffer[i+10]);
    058B E784      LDI	R24,0x74
    058C E090      LDI	R25,0
    058D 01F6      MOVW	R30,R12
    058E 963A      ADIW	R30,0xA
    058F 0FE8      ADD	R30,R24
    0590 1FF9      ADC	R31,R25
    0591 8100      LDD	R16,Z+0
    0592 D37A      RCALL	_spi_transfer_8
(0608) 				
(0609) 				//Check if we can do polling
(0610) 				if((msg_buffer[i+10]!=msg_buffer[8])&&(msg_buffer[i+10]!=msg_buffer[9]))
    0593 E784      LDI	R24,0x74
    0594 E090      LDI	R25,0
    0595 01F6      MOVW	R30,R12
    0596 963A      ADIW	R30,0xA
    0597 0FE8      ADD	R30,R24
    0598 1FF9      ADC	R31,R25
    0599 8020      LDD	R2,Z+0
    059A 2433      CLR	R3
    059B 9040007C  LDS	R4,0x7C
    059D 1424      CP	R2,R4
    059E F0D1      BEQ	0x05B9
    059F 9040007D  LDS	R4,0x7D
    05A1 1424      CP	R2,R4
    05A2 F0B1     

⌨️ 快捷键说明

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