📄 main.lis
字号:
0004 ; 0x12,0x34,//标识
0004 ; 0x40,0x00,//分段偏移量
0004 ; 0x80,//生存时间
0004 ; 0x11,//上层协议0x11表示是UDP
0004 ; 0x00,0x00,//IP校验和
0004 ; 0xc0,0xa8,0x01,0x68,//源IP地址,在此修改源IP地址
0004 ; 0xc0,0xa8,0x01,0x64};//目标IP地址,在此修改目标IP地址
0004 ; uchar UDPpacket[255]={0x00,0x00,0x00,0x00,//源IP地址
0004 ; 0xc0,0x00,0x00,0x00,//目标IP地址
0004 ; 0x00,0x11,//未定义
0004 ; 0x00,0x00,//UDP报长度为26字节8+18=26//到此都是伪报头共12字节
0004 ;
0004 ; 0x04,0x00,//源端口号1024
0004 ; 0x04,0x00,//目标端口号1024
0004 ; 0x00,0x00,//UDP报长度
0004 ; 0x00,0x00,//UDP校验和//UDP报头共8字节
0004 ;
0004 ; };//数据部分
0004 ; uchar Rec_packet[255]={0x00};//接收到的帧,考虑到M16只有1KRAM,所以这里设定,最大帧不能超过255
0004 ; uchar Rec232[255]={0x00};//串口接收到的数据
0004 ; uchar usart_number=0;
0004 ; //#######################IP报头校验和计算#######################//
0004 ; void CreateCrc(uchar *p,uchar num,uchar CRCH,uchar CRCL)
0004 ; //必需先附IpHead值后再校验,CRCH表示数组存放校验和的位置高8位,CRCL表示数组存放校验和的位置低8位
0004 ; //num表示数组中元数的个数,如IP包头数组个数为20个
0004 ; {uchar i=0;
0004 .dbline 49
0004 CC24 clr R12
0006 .dbline 50
0006 ; uchar temp=0,L=0,H=0;
0006 4427 clr R20
0008 .dbline 50
0008 AA24 clr R10
000A .dbline 50
000A 6627 clr R22
000C .dbline 51
000C ; p[CRCH]=0x00;p[CRCL]=0x00;//先将存放校验和的位置那位清0
000C E885 ldd R30,y+8
000E FF27 clr R31
0010 E00F add R30,R16
0012 F11F adc R31,R17
0014 2224 clr R2
0016 2082 std z+0,R2
0018 .dbline 51
0018 EA85 ldd R30,y+10
001A FF27 clr R31
001C E00F add R30,R16
001E F11F adc R31,R17
0020 2082 std z+0,R2
0022 .dbline 52
0022 CC24 clr R12
0024 C394 inc R12
0026 11C0 xjmp L5
0028 L2:
0028 .dbline 52
0028 ; for(i=1;i<num+1;i=i+2){temp=temp+p[i];
0028 .dbline 52
0028 EC2D mov R30,R12
002A FF27 clr R31
002C E00F add R30,R16
002E F11F adc R31,R17
0030 2080 ldd R2,z+0
0032 420D add R20,R2
0034 .dbline 53
0034 EC2D mov R30,R12
0036 FF27 clr R31
0038 E00F add R30,R16
003A F11F adc R31,R17
003C 2080 ldd R2,z+0
003E 4215 cp R20,R2
0040 08F4 brsh L6
0042 .dbline 53
0042 A394 inc R10
0044 L6:
0044 .dbline 53
0044 L3:
0044 .dbline 52
0044 8C2D mov R24,R12
0046 8E5F subi R24,254 ; addi 2
0048 C82E mov R12,R24
004A L5:
004A .dbline 52
004A 822F mov R24,R18
004C 8F5F subi R24,255 ; addi 1
004E C816 cp R12,R24
0050 58F3 brlo L2
0052 .dbline 54
0052 CC24 clr R12
0054 11C0 xjmp L11
0056 L8:
0056 .dbline 54
0056 ; if(temp<p[i])L++;}//如果temp<p[i]表示前面相加结果大于0XFF,则进1
0056 ; for(i=0;i<num;i=i+2){L=L+p[i];
0056 .dbline 54
0056 EC2D mov R30,R12
0058 FF27 clr R31
005A E00F add R30,R16
005C F11F adc R31,R17
005E 2080 ldd R2,z+0
0060 A20C add R10,R2
0062 .dbline 55
0062 EC2D mov R30,R12
0064 FF27 clr R31
0066 E00F add R30,R16
0068 F11F adc R31,R17
006A 2080 ldd R2,z+0
006C A214 cp R10,R2
006E 08F4 brsh L12
0070 .dbline 55
0070 6395 inc R22
0072 L12:
0072 .dbline 55
0072 L9:
0072 .dbline 54
0072 8C2D mov R24,R12
0074 8E5F subi R24,254 ; addi 2
0076 C82E mov R12,R24
0078 L11:
0078 .dbline 54
0078 C216 cp R12,R18
007A 68F3 brlo L8
007C .dbline 56
007C ; if(L<p[i])H++;}//如果temp<p[i]表示前面相加结果大于0XFF,则进1
007C ; temp=temp+H;//把高出16位的结果与低16位相加
007C 460F add R20,R22
007E .dbline 57
007E ; if(temp<H){L++;//把高出16位的结果与低16位相加,如果有溢出,则再向高位进位
007E 4617 cp R20,R22
0080 18F4 brsh L14
0082 .dbline 57
0082 .dbline 57
0082 A394 inc R10
0084 .dbline 58
0084 09F4 brne L16
0086 .dbline 58
0086 4395 inc R20
0088 L16:
0088 .dbline 58
0088 ; if(L==0)temp++;}//如果高位再溢出,再加到低位
0088 L14:
0088 .dbline 59
0088 ; p[CRCH]=0xff-L;//结果取反
0088 2A2C mov R2,R10
008A 3324 clr R3
008C 8FEF ldi R24,255
008E 90E0 ldi R25,0
0090 8219 sub R24,R2
0092 9309 sbc R25,R3
0094 E885 ldd R30,y+8
0096 FF27 clr R31
0098 E00F add R30,R16
009A F11F adc R31,R17
009C 8083 std z+0,R24
009E .dbline 60
009E ; p[CRCL]=0xff-temp;//结果取反
009E 242E mov R2,R20
00A0 3324 clr R3
00A2 8FEF ldi R24,255
00A4 90E0 ldi R25,0
00A6 8219 sub R24,R2
00A8 9309 sbc R25,R3
00AA EA85 ldd R30,y+10
00AC FF27 clr R31
00AE E00F add R30,R16
00B0 F11F adc R31,R17
00B2 8083 std z+0,R24
00B4 .dbline -2
00B4 .dbline 61
00B4 ; }
00B4 L1:
00B4 0E940000 xcall pop_gset4
00B8 .dbline 0 ; func end
00B8 0895 ret
00BA .dbsym r H 22 c
00BA .dbsym r temp 20 c
00BA .dbsym r L 10 c
00BA .dbsym r i 12 c
00BA .dbsym l CRCL 10 c
00BA .dbsym l CRCH 8 c
00BA .dbsym r num 18 c
00BA .dbsym r p 16 pc
00BA .dbend
00BA .dbfunc e Transmit_Packets _Transmit_Packets fV
00BA ; i -> R20
.even
00BA _Transmit_Packets::
00BA 0E940000 xcall push_gset1
00BE 2397 sbiw R28,3
00C0 .dbline -1
00C0 .dbline 65
00C0 ;
00C0 ; //##########################发送UDP数据包##########################//
00C0 ; void Transmit_Packets(void)
00C0 ; {uchar i=0;
00C0 .dbline 65
00C0 4427 clr R20
00C2 .dbline 66
00C2 ; enc28j60SetBank(0x00);//通过ECON1先选中当前控制寄存器组是Bank0
00C2 0027 clr R16
00C4 0E940000 xcall _enc28j60SetBank
00C8 .dbline 68
00C8 ;
00C8 ; Write_Control_Register(0x02,0x00);//EWRPTL
00C8 2227 clr R18
00CA 02E0 ldi R16,2
00CC 0E940000 xcall _Write_Control_Register
00D0 .dbline 69
00D0 ; Write_Control_Register(0x03,0x00);//EWRPTH
00D0 2227 clr R18
00D2 03E0 ldi R16,3
00D4 0E940000 xcall _Write_Control_Register
00D8 .dbline 70
00D8 ; Write_Control_Register(0x04,0x00);//ETXSTL
00D8 2227 clr R18
00DA 04E0 ldi R16,4
00DC 0E940000 xcall _Write_Control_Register
00E0 .dbline 71
00E0 ; Write_Control_Register(0x05,0x00);//ETXSTH
00E0 2227 clr R18
00E2 05E0 ldi R16,5
00E4 0E940000 xcall _Write_Control_Register
00E8 .dbline 73
00E8 ;
00E8 ; Bit_Field_Set(0x1e,0x80);//ECON2寄存器中的AUTOINC位置1,
00E8 20E8 ldi R18,128
00EA 0EE1 ldi R16,30
00EC 0E940000 xcall _Bit_Field_Set
00F0 .dbline 75
00F0 0FC0 xjmp L22
00F2 L19:
00F2 .dbline 75
00F2 80E0 ldi R24,<_IpHead+12
00F4 90E0 ldi R25,>_IpHead+12
00F6 E42F mov R30,R20
00F8 FF27 clr R31
00FA E80F add R30,R24
00FC F91F adc R31,R25
00FE 2080 ldd R2,z+0
0100 80E0 ldi R24,<_UDPpacket
0102 90E0 ldi R25,>_UDPpacket
0104 E42F mov R30,R20
0106 FF27 clr R31
0108 E80F add R30,R24
010A F91F adc R31,R25
010C 2082 std z+0,R2
010E L20:
010E .dbline 75
010E 4395 inc R20
0110 L22:
0110 .dbline 75
0110 ;
0110 ; for(i=0;i<8;i++)UDPpacket[i]=IpHead[i+12];//给UDP伪报头部分附IP值
0110 4830 cpi R20,8
0112 78F3 brlo L19
0114 .dbline 76
0114 ; IpHead[3]=DateLen+28;//IP包长度
0114 80910800 lds R24,_DateLen
0118 845E subi R24,228 ; addi 28
011A 80931A00 sts _IpHead+3,R24
011E .dbline 77
011E ; UDPpacket[11]=DateLen+8;//UDP包长度,伪报头,不发送部分
011E 80910800 lds R24,_DateLen
0122 885F subi R24,248 ; addi 8
0124 80933600 sts _UDPpacket+11,R24
0128 .dbline 78
0128 ; UDPpacket[17]=DateLen+8;//UDP包长度,UDP报头
0128 80910800 lds R24,_DateLen
012C 885F subi R24,248 ; addi 8
012E 80933C00 sts _UDPpacket+17,R24
0132 .dbline 79
0132 ; CreateCrc(IpHead,20,10,11);//校验前要对数组中其它元素先附好值
0132 8BE0 ldi R24,11
0134 8A83 std y+2,R24
0136 8AE0 ldi R24,10
0138 8883 std y+0,R24
013A 24E1 ldi R18,20
013C 00E0 ldi R16,<_IpHead
013E 10E0 ldi R17,>_IpHead
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -