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

📄 xmodem.lst

📁 AVR M16 Xmodem传输及发送彩信的实现
💻 LST
📖 第 1 页 / 共 4 页
字号:
     8D7 01F6      MOVW	R30,R12
     8D8 0FE8      ADD	R30,R24
     8D9 1FF9      ADC	R31,R25
     8DA E18A      LDI	R24,0x1A
     8DB 8380      STD	Z+0,R24
     8DC 01C6      MOVW	R24,R12
     8DD 9601      ADIW	R24,1
     8DE 016C      MOVW	R12,R24
     8DF 01C6      MOVW	R24,R12
     8E0 3880      CPI	R24,0x80
     8E1 E0E0      LDI	R30,0
     8E2 079E      CPC	R25,R30
     8E3 F388      BCS	0x08D5
(0370)          if(tx_packet(packet_number, xModem->Message, temp_char)==0)
     8E4 82A8      STD	Y+0,R10
     8E5 019B      MOVW	R18,R22
     8E6 5F2F      SUBI	R18,0xFF
     8E7 4F3F      SBCI	R19,0xFF
     8E8 2F04      MOV	R16,R20
     8E9 DF38      RCALL	_tx_packet
     8EA 2300      TST	R16
     8EB F009      BEQ	0x08ED
     8EC C097      RJMP	0x0984
(0371)             return 0;
     8ED 2700      CLR	R16
     8EE C09C      RJMP	0x098B
(0372) 	}
(0373)     else
(0374) 	{
(0375)         do
(0376) 		{
(0377)             for(i=0;i<128;i++)
     8EF 24CC      CLR	R12
     8F0 24DD      CLR	R13
     8F1 C01E      RJMP	0x0910
(0378)                xModem->Message[i]=(User_Data[j++]);
     8F2 01FE      MOVW	R30,R28
     8F3 57EC      SUBI	R30,0x7C
     8F4 4FFF      SBCI	R31,0xFF
     8F5 80E0      LDD	R14,Z+0
     8F6 80F1      LDD	R15,Z+1
     8F7 01C7      MOVW	R24,R14
     8F8 9601      ADIW	R24,1
     8F9 01FE      MOVW	R30,R28
     8FA 57EC      SUBI	R30,0x7C
     8FB 4FFF      SBCI	R31,0xFF
     8FC 8391      STD	Z+1,R25
     8FD 8380      STD	Z+0,R24
     8FE 01F7      MOVW	R30,R14
     8FF 01DE      MOVW	R26,R28
     900 57A0      SUBI	R26,0x70
     901 4FBF      SBCI	R27,0xFF
     902 900D      LD	R0,X+
     903 901C      LD	R1,255(X)
     904 0DE0      ADD	R30,R0
     905 1DF1      ADC	R31,R1
     906 9024      LPM	R2,255(Z)
     907 01CB      MOVW	R24,R22
     908 9601      ADIW	R24,1
     909 01F6      MOVW	R30,R12
     90A 0FE8      ADD	R30,R24
     90B 1FF9      ADC	R31,R25
     90C 8220      STD	Z+0,R2
     90D 01C6      MOVW	R24,R12
     90E 9601      ADIW	R24,1
     90F 016C      MOVW	R12,R24
     910 01C6      MOVW	R24,R12
     911 3880      CPI	R24,0x80
     912 E0E0      LDI	R30,0
     913 079E      CPC	R25,R30
     914 F2E8      BCS	0x08F2
(0379)             if(tx_packet(packet_number, xModem->Message, temp_char)==0)
     915 82A8      STD	Y+0,R10
     916 019B      MOVW	R18,R22
     917 5F2F      SUBI	R18,0xFF
     918 4F3F      SBCI	R19,0xFF
     919 2F04      MOV	R16,R20
     91A DF07      RCALL	_tx_packet
     91B 2EE0      MOV	R14,R16
     91C 2300      TST	R16
     91D F411      BNE	0x0920
(0380)                return 0;
     91E 2700      CLR	R16
     91F C06B      RJMP	0x098B
(0381)             packet_number++;
     920 9543      INC	R20
(0382)             LEN=LEN-128;
     921 01FE      MOVW	R30,R28
     922 56EE      SUBI	R30,0x6E
     923 4FFF      SBCI	R31,0xFF
     924 8180      LDD	R24,Z+0
     925 8191      LDD	R25,Z+1
     926 5880      SUBI	R24,0x80
     927 4090      SBCI	R25,0
     928 01FE      MOVW	R30,R28
     929 56EE      SUBI	R30,0x6E
     92A 4FFF      SBCI	R31,0xFF
     92B 8391      STD	Z+1,R25
     92C 8380      STD	Z+0,R24
(0383) 			Delay(10);
     92D E00A      LDI	R16,0xA
     92E E010      LDI	R17,0
     92F D0DB      RCALL	_Delay
(0384)                          
(0385) 		}while(LEN>=128);
     930 01FE      MOVW	R30,R28
     931 56EE      SUBI	R30,0x6E
     932 4FFF      SBCI	R31,0xFF
     933 8180      LDD	R24,Z+0
     934 8191      LDD	R25,Z+1
     935 3880      CPI	R24,0x80
     936 E0E0      LDI	R30,0
     937 079E      CPC	R25,R30
     938 F008      BCS	0x093A
     939 CFB5      RJMP	0x08EF
(0386) 	    if (LEN)
     93A 010C      MOVW	R0,R24
     93B 3080      CPI	R24,0
     93C 0789      CPC	R24,R25
     93D F409      BNE	0x093F
     93E C045      RJMP	0x0984
(0387) 	    {
(0388)             for(i=0;i<LEN;i++)
     93F 24CC      CLR	R12
     940 24DD      CLR	R13
     941 C01E      RJMP	0x0960
(0389)                 xModem->Message[i]=(User_Data[j++]);
     942 01FE      MOVW	R30,R28
     943 57EC      SUBI	R30,0x7C
     944 4FFF      SBCI	R31,0xFF
     945 80E0      LDD	R14,Z+0
     946 80F1      LDD	R15,Z+1
     947 01C7      MOVW	R24,R14
     948 9601      ADIW	R24,1
     949 01FE      MOVW	R30,R28
     94A 57EC      SUBI	R30,0x7C
     94B 4FFF      SBCI	R31,0xFF
     94C 8391      STD	Z+1,R25
     94D 8380      STD	Z+0,R24
     94E 01F7      MOVW	R30,R14
     94F 01DE      MOVW	R26,R28
     950 57A0      SUBI	R26,0x70
     951 4FBF      SBCI	R27,0xFF
     952 900D      LD	R0,X+
     953 901C      LD	R1,255(X)
     954 0DE0      ADD	R30,R0
     955 1DF1      ADC	R31,R1
     956 9024      LPM	R2,255(Z)
     957 01CB      MOVW	R24,R22
     958 9601      ADIW	R24,1
     959 01F6      MOVW	R30,R12
     95A 0FE8      ADD	R30,R24
     95B 1FF9      ADC	R31,R25
     95C 8220      STD	Z+0,R2
     95D 01C6      MOVW	R24,R12
     95E 9601      ADIW	R24,1
     95F 016C      MOVW	R12,R24
     960 01FE      MOVW	R30,R28
     961 56EE      SUBI	R30,0x6E
     962 4FFF      SBCI	R31,0xFF
     963 8000      LDD	R0,Z+0
     964 8011      LDD	R1,Z+1
     965 14C0      CP	R12,R0
     966 04D1      CPC	R13,R1
     967 F2D0      BCS	0x0942
(0390) 	        for(i=LEN;i<128;i++)
     968 0160      MOVW	R12,R0
     969 C00A      RJMP	0x0974
(0391)                 xModem->Message[i]=CTRL_Z;
     96A 01CB      MOVW	R24,R22
     96B 9601      ADIW	R24,1
     96C 01F6      MOVW	R30,R12
     96D 0FE8      ADD	R30,R24
     96E 1FF9      ADC	R31,R25
     96F E18A      LDI	R24,0x1A
     970 8380      STD	Z+0,R24
     971 01C6      MOVW	R24,R12
     972 9601      ADIW	R24,1
     973 016C      MOVW	R12,R24
     974 01C6      MOVW	R24,R12
     975 3880      CPI	R24,0x80
     976 E0E0      LDI	R30,0
     977 079E      CPC	R25,R30
     978 F388      BCS	0x096A
(0392)             if( tx_packet(packet_number, xModem->Message, temp_char)==0)
     979 82A8      STD	Y+0,R10
     97A 019B      MOVW	R18,R22
     97B 5F2F      SUBI	R18,0xFF
     97C 4F3F      SBCI	R19,0xFF
     97D 2F04      MOV	R16,R20
     97E DEA3      RCALL	_tx_packet
     97F 2EA0      MOV	R10,R16
     980 2300      TST	R16
     981 F411      BNE	0x0984
(0393)                 return 0;
     982 2700      CLR	R16
     983 C007      RJMP	0x098B
(0394) 		}
(0395) 	}
(0396) 
(0397) 	if (!tx_EOT()) //发送方正常结束要发EOT信号,
     984 D00D      RCALL	_tx_EOT
     985 2EA0      MOV	R10,R16
     986 2300      TST	R16
     987 F411      BNE	0x098A
(0398)        return 0;      // end tx data failed
     988 2700      CLR	R16
     989 C001      RJMP	0x098B
(0399) return 1;   //正常结束
     98A E001      LDI	R16,1
     98B 96EF      ADIW	R28,0x3F
     98C 96EF      ADIW	R28,0x3F
     98D 9628      ADIW	R28,0x8
     98E 940E 0B2F CALL	pop_xgsetF0FC
     990 9624      ADIW	R28,4
     991 9508      RET
_tx_EOT:
  temp                 --> R22
  attempt              --> R20
     992 934A      ST	R20,-Y
     993 936A      ST	R22,-Y
(0400) }
(0401) uchar tx_EOT(void)
(0402) {
(0403)     uchar attempt;
(0404) 	unsigned char temp;
(0405) 
(0406)     for(attempt = 1; attempt <= MAX_TX_TRY; attempt++)
     994 E041      LDI	R20,1
     995 C00C      RJMP	0x09A2
(0407)     {
(0408)         send_a_byte(EOT);
     996 E004      LDI	R16,4
     997 DE6C      RCALL	_send_a_byte
(0409) 		// send file end
(0410) 		Delay(1);
     998 E001      LDI	R16,1
     999 E010      LDI	R17,0
     99A D070      RCALL	_Delay
(0411) 		temp=temp_char0;
     99B 9160 0094 LDS	R22,temp_char0
(0412)         if(temp == ACK)
     99D 3066      CPI	R22,6
     99E F411      BNE	0x09A1
(0413)            return 1;       // file end acknowledged  接收方返因ACK信号
     99F E001      LDI	R16,1
     9A0 C005      RJMP	0x09A6
     9A1 9543      INC	R20
     9A2 E083      LDI	R24,3
     9A3 1784      CP	R24,R20
     9A4 F788      BCC	0x0996
(0414)     }
(0415)     return 0;               // file tx failed
     9A5 2700      CLR	R16
     9A6 9169      LD	R22,Y+
     9A7 9149      LD	R20,Y+
     9A8 9508      RET
(0416) }
(0417) 
(0418) uint update_CRC(uchar inData, uint checksum)
(0419) {
(0420)     return  ((checksum << 8) ^ crc16_table[ (checksum >> 8) ^ inData ]);
_update_CRC:
  checksum             --> R18
  inData               --> R16
     9A9 2E20      MOV	R2,R16
     9AA 2433      CLR	R3
     9AB 01F9      MOVW	R30,R18
     9AC 2FEF      MOV	R30,R31
     9AD 27FF      CLR	R31
     9AE 25E2      EOR	R30,R2
     9AF 25F3      EOR	R31,R3
     9B0 0FEE      LSL	R30
     9B1 1FFF      ROL	R31
     9B2 E988      LDI	R24,0x98
     9B3 E09A      LDI	R25,0xA
     9B4 0FE8      ADD	R30,R24
     9B5 1FF9      ADC	R31,R25
     9B6 9025      LPM	R2,Z+
     9B7 9034      LPM	R3,10(Z)
     9B8 0189      MOVW	R16,R18
     9B9 2F10      MOV	R17,R16
     9BA 2700      CLR	R16
     9BB 2502      EOR	R16,R2
     9BC 2513      EOR	R17,R3
     9BD 9508      RET
(0421) }
(0422) 
(0423) /*
(0424) *************************************
(0425) *延时子程序,延时约10×i机器周期     *
(0426) *************************************/
(0427) 
(0428) void intDelay(uint i)
(0429) {
(0430) 	while(i--);
_intDelay:
  i                    --> R16
     9BE 0118      MOVW	R2,R16
     9BF 5001      SUBI	R16,1
     9C0 4010      SBCI	R17,0
     9C1 2022      TST	R2
     9C2 F7D9      BNE	0x09BE
     9C3 2033      TST	R3
     9C4 F7C9      BNE	0x09BE
     9C5 9508      RET
_memcmp_self:
  i                    --> R10
  lenth                --> Y,+1
  string2              --> R18
  string1              --> R16
     9C6 92AA      ST	R10,-Y
(0431) }
(0432) 
(0433) 
(0434) char memcmp_self(char const *string1, char const *string2 ,unsigned int lenth)
(0435) {
(0436)     uchar i;
(0437)     for(i = 0; i<lenth; i++)
     9C7 24AA      CLR	R10
     9C8 C00D      RJMP	0x09D6
(0438)     {
(0439)          if(*string1 != *string2)
     9C9 01F9      MOVW	R30,R18
     9CA 9024      LPM	R2,13(Z)
     9CB 01F8      MOVW	R30,R16
     9CC 9034      LPM	R3,13(Z)
     9CD 1432      CP	R3,R2
     9CE F011      BEQ	0x09D1
(0440)              return 0;
     9CF 2700      CLR	R16
     9D0 C00D      RJMP	0x09DE
(0441)          string1++;
     9D1 5F0F      SUBI	R16,0xFF
     9D2 4F1F      SBCI	R17,0xFF
(0442)          string2++;
     9D3 5F2F      SUBI	R18,0xFF
     9D4 4F3F      SBCI	R19,0xFF
     9D5 94A3      INC	R10
     9D6 2C2A      MOV	R2,R10
     9D7 2433      CLR	R3
     9D8 8009      LDD	R0,Y+1
     9D9 801A      LDD	R1,Y+2
     9DA 1420      CP	R2,R0
     9DB 0431      CPC	R3,R1
     9DC F360      BCS	0x09C9
(0443)     }
(0444)     return 1;
     9DD E001      LDI	R16,1
     9DE 90A9      LD	R10,Y+
     9DF 9508      RET
(0445) }
(0446) //char do_serial_data(uchar lenth)
(0447) void do_serial_data(void)
(0448) {
(0449)  uchar i;
(0450)  	 if(receive_data[0]=='+') 
_do_serial_data:
  i                    --> R16
     9E0 9180 017E LDS	R24,receive_data
     9E2 328B      CPI	R24,0x2B
     9E3 F531      BNE	0x0A0A
(0451)      {     receive_CLIP = 1;
     9E4 E081      LDI	R24,1
     9E5 9380 0211 STS	receive_CLIP,R24
(0452) 	 	if('1' == receive_data[8] && ((receive_data[18] >= '0') && (receive_data[18] <= '9')))
     9E7 9180 0186 LDS	R24,0x0186
     9E9 3381      CPI	R24,0x31
     9EA F4F9      BNE	0x0A0A
     9EB 9180 0190 LDS	R24,0x0190
     9ED 3380      CPI	R24,0x30
     9EE F0D8      BCS	0x0A0A
     9EF E389      LDI	R24,0x39
     9F0 9020 0190 LDS	R2,0x0190
     9F2 1582      CP	R24,R2
     9F3 F0B0      BCS	0x0A0A
(0453) 		{
(0454) 		 	 for(i=8;i<19;i++)
     9F4 E008      LDI	R16,0x8
     9F5 C00F      RJMP	0x0A05
(0455) 			 dial_number[i-8]=receive_data[i];
     9F6 E78E      LDI	R24,0x7E
     9F7 E091      LDI	R25,1
     9F8 2FE0      MOV	R30,R16
     9F9 27FF      CLR	R31
     9FA 0FE8      ADD	R30,R24
     9FB 1FF9      ADC	R31,R25
     9FC 8020      LDD	R2,Z+0
     9FD E688      LDI	R24,0x68
     9FE E090      LDI	R25,0
     9FF 2FE0      MOV	R30,R16
     A00 27FF      CLR	R31
     A01 0FE8      ADD	R30,R24
     A02 1FF9      ADC	R31,R25
     A03 8220      STD	Z+0,R2
     A04 9503      INC	R16
     A05 3103      CPI	R16,0x13
     A06 F378      BCS	0x09F6
(0456) 			 flag_mobile = 1;
     A07 E081      LDI	R24,1
     A08 9380 0210 STS	flag_mobile,R24
(0457) 		}
(0458) 		
(0459) 	}
     A0A 9508      RET
_Delay:
  i                    --> R20
  Delay_MS             --> R16
     A0B 934A      ST	R20,-Y
(0460) 	/*switch (lenth)
(0461) 	{
(0462) 		case 0:
(0463) 				break;
(0464) 		case 1:
(0465) 				break;
(0466) 		case 2:
(0467) 				
(0468) 				break;
(0469) 		case 3:
(0470) 			 if(memcmp_self(receive_data, DATA_OK,2)==0 )                //检测是否收到 OK
(0471) 					receive_OK = 1;
(0472) 				break;
(0473) 		case 4:
(0474) 			 if(memcmp_self(receive_data, DATA_RING,4)==0 )                //检测是否收到 OK
(0475) 					receive_RING = 1;
(0476) 				break;
(0477) 		case 5:
(0478)                 if(memcmp_self(receive_data, DATA_ERROR, 5)==0)             //检测是否收到 ERROR
(0479)                     receive_ERROR = 1;
(0480) 				break;
(0481) 		case 6:
(0482) 				break;
(0483) 		case 7:
(0484) 				break;

⌨️ 快捷键说明

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