📄 main.lis
字号:
0140 5FDF xcall _CreateCrc
0142 .dbline 80
0142 ; CreateCrc(UDPpacket,DateLen+20,18,19);//UDP校验
0142 83E1 ldi R24,19
0144 8A83 std y+2,R24
0146 82E1 ldi R24,18
0148 8883 std y+0,R24
014A 20910800 lds R18,_DateLen
014E 2C5E subi R18,236 ; addi 20
0150 00E0 ldi R16,<_UDPpacket
0152 10E0 ldi R17,>_UDPpacket
0154 55DF xcall _CreateCrc
0156 .dbline 81
0156 ; Set_CS(0);//使能SPI器件
0156 0027 clr R16
0158 0E940000 xcall _Set_CS
015C .dbline 82
015C ; Write_Buffer_Memory_date(0x7A);//送命令,28J60中写缓冲存储器操作前3位为011后5位为常量11010
015C 0AE7 ldi R16,122
015E 0E940000 xcall _Write_Buffer_Memory_date
0162 .dbline 83
0162 ; Write_Buffer_Memory_date(0x0e);//28J60要求在待发送的数据包前添加一个包控制字节
0162 0EE0 ldi R16,14
0164 0E940000 xcall _Write_Buffer_Memory_date
0168 .dbline 85
0168 4427 clr R20
016A 0AC0 xjmp L30
016C L27:
016C .dbline 85
016C 80E0 ldi R24,<_MACHead
016E 90E0 ldi R25,>_MACHead
0170 E42F mov R30,R20
0172 FF27 clr R31
0174 E80F add R30,R24
0176 F91F adc R31,R25
0178 0081 ldd R16,z+0
017A 0E940000 xcall _Write_Buffer_Memory_date
017E L28:
017E .dbline 85
017E 4395 inc R20
0180 L30:
0180 .dbline 85
0180 ;
0180 ; for(i=0;i<14;i++)Write_Buffer_Memory_date(MACHead[i]);//MAC首部14字节
0180 4E30 cpi R20,14
0182 A0F3 brlo L27
0184 .dbline 86
0184 4427 clr R20
0186 0AC0 xjmp L34
0188 L31:
0188 .dbline 86
0188 80E0 ldi R24,<_IpHead
018A 90E0 ldi R25,>_IpHead
018C E42F mov R30,R20
018E FF27 clr R31
0190 E80F add R30,R24
0192 F91F adc R31,R25
0194 0081 ldd R16,z+0
0196 0E940000 xcall _Write_Buffer_Memory_date
019A L32:
019A .dbline 86
019A 4395 inc R20
019C L34:
019C .dbline 86
019C ; for(i=0;i<20;i++)Write_Buffer_Memory_date(IpHead[i]);//IP首部20字节
019C 4431 cpi R20,20
019E A0F3 brlo L31
01A0 .dbline 87
01A0 4CE0 ldi R20,12
01A2 0AC0 xjmp L38
01A4 L35:
01A4 .dbline 87
01A4 80E0 ldi R24,<_UDPpacket
01A6 90E0 ldi R25,>_UDPpacket
01A8 E42F mov R30,R20
01AA FF27 clr R31
01AC E80F add R30,R24
01AE F91F adc R31,R25
01B0 0081 ldd R16,z+0
01B2 0E940000 xcall _Write_Buffer_Memory_date
01B6 L36:
01B6 .dbline 87
01B6 4395 inc R20
01B8 L38:
01B8 .dbline 87
01B8 ; for(i=12;i<DateLen+20;i++)Write_Buffer_Memory_date(UDPpacket[i]);//UDP层去掉伪报头
01B8 80910800 lds R24,_DateLen
01BC 8C5E subi R24,236 ; addi 20
01BE 4817 cp R20,R24
01C0 88F3 brlo L35
01C2 .dbline 89
01C2 ;
01C2 ; Set_CS(1);//写缓冲寄存器结束
01C2 01E0 ldi R16,1
01C4 0E940000 xcall _Set_CS
01C8 .dbline 91
01C8 ;
01C8 ; Write_Control_Register(0x06,DateLen+42);//ETXNDL,6+6+2+20+8+DateLen
01C8 20910800 lds R18,_DateLen
01CC 265D subi R18,214 ; addi 42
01CE 06E0 ldi R16,6
01D0 0E940000 xcall _Write_Control_Register
01D4 .dbline 92
01D4 ; Write_Control_Register(0x07,0x00);//ETXNDH,即从0x0000开始写入数据
01D4 2227 clr R18
01D6 07E0 ldi R16,7
01D8 0E940000 xcall _Write_Control_Register
01DC .dbline 94
01DC ;
01DC ; Bit_Field_Clear(0x1c,0x08);//将EIR.TXIF位清零
01DC 28E0 ldi R18,8
01DE 0CE1 ldi R16,28
01E0 0E940000 xcall _Bit_Field_Clear
01E4 .dbline 96
01E4 ; //Bit_Field_Set(0x1b,0x88);//将EIE.TXIE位和EIE.INTIE位置1允许在发送完成后产生中断。
01E4 ; Bit_Field_Set(0x1f,0x08);//将ECON1.TXRTS 位置1开始发送
01E4 28E0 ldi R18,8
01E6 0FE1 ldi R16,31
01E8 0E940000 xcall _Bit_Field_Set
01EC .dbline -2
01EC .dbline 97
01EC ; }
01EC L18:
01EC 2396 adiw R28,3
01EE 0E940000 xcall pop_gset1
01F2 .dbline 0 ; func end
01F2 0895 ret
01F4 .dbsym r i 20 c
01F4 .dbend
01F4 .dbfunc e ARP_request_or_answer _ARP_request_or_answer fc
01F4 ; ARPflag -> R16
.even
01F4 _ARP_request_or_answer::
01F4 .dbline -1
01F4 .dbline 100
01F4 ; //########从当前接收到的数据包中判断是不是本地ARP请求帧,是则返回1,否返回0#########//
01F4 ; uchar ARP_request_or_answer(void)
01F4 ; {uchar ARPflag=0;//
01F4 .dbline 100
01F4 0027 clr R16
01F6 .dbline 101
01F6 ; if(Rec_packet[12]==0x08 && Rec_packet[13]==0x06)//如果符合则表示当前数据包是ARP帧
01F6 80913601 lds R24,_Rec_packet+12
01FA 8830 cpi R24,8
01FC 39F5 brne L40
01FE 80913701 lds R24,_Rec_packet+13
0202 8630 cpi R24,6
0204 19F5 brne L40
0206 .dbline 102
0206 ; if(Rec_packet[20]==0x00 && Rec_packet[21]==0x01)//如果符合则表示当前数据包是ARP请求帧
0206 20903E01 lds R2,_Rec_packet+20
020A 2220 tst R2
020C F9F4 brne L44
020E 80913F01 lds R24,_Rec_packet+21
0212 8130 cpi R24,1
0214 D9F4 brne L44
0216 .dbline 103
0216 ; if(Rec_packet[38]==IpHead[12] && Rec_packet[39]==IpHead[13] && Rec_packet[40]==IpHead[14]&& Rec_packet[41]==IpHead[15])ARPflag=0x01;
0216 20902300 lds R2,_IpHead+12
021A 30905001 lds R3,_Rec_packet+38
021E 3214 cp R3,R2
0220 A1F4 brne L48
0222 20902400 lds R2,_IpHead+13
0226 30905101 lds R3,_Rec_packet+39
022A 3214 cp R3,R2
022C 71F4 brne L48
022E 20902500 lds R2,_IpHead+14
0232 30905201 lds R3,_Rec_packet+40
0236 3214 cp R3,R2
0238 41F4 brne L48
023A 20902600 lds R2,_IpHead+15
023E 30905301 lds R3,_Rec_packet+41
0242 3214 cp R3,R2
0244 11F4 brne L48
0246 .dbline 103
0246 01E0 ldi R16,1
0248 01C0 xjmp L49
024A L48:
024A .dbline 105
024A ; //请求方希望获得MAC地址的IP地址是不是和本地IP地址一致,如果一致,则说明是要本地回答
024A ; else ARPflag=0x00;
024A 0027 clr R16
024C L49:
024C L44:
024C L40:
024C .dbline 106
024C ; return ARPflag;
024C .dbline -2
024C L39:
024C .dbline 0 ; func end
024C 0895 ret
024E .dbsym r ARPflag 16 c
024E .dbend
024E .dbfunc e Transmit_ARP_Packets _Transmit_ARP_Packets fV
024E ; i -> R20
.even
024E _Transmit_ARP_Packets::
024E 0E940000 xcall push_gset1
0252 .dbline -1
0252 .dbline 110
0252 ; }
0252 ; //##########################发送ARP数据包##########################//
0252 ; void Transmit_ARP_Packets(void)
0252 ; {uchar i=0;
0252 .dbline 110
0252 4427 clr R20
0254 .dbline 111
0254 ; enc28j60SetBank(0x00);//通过ECON1先选中当前控制寄存器组是Bank0
0254 0027 clr R16
0256 0E940000 xcall _enc28j60SetBank
025A .dbline 112
025A ; Write_Control_Register(0x02,0x00);//EWRPTL
025A 2227 clr R18
025C 02E0 ldi R16,2
025E 0E940000 xcall _Write_Control_Register
0262 .dbline 113
0262 ; Write_Control_Register(0x03,0x00);//EWRPTH
0262 2227 clr R18
0264 03E0 ldi R16,3
0266 0E940000 xcall _Write_Control_Register
026A .dbline 114
026A ; Write_Control_Register(0x04,0x00);//ETXSTL
026A 2227 clr R18
026C 04E0 ldi R16,4
026E 0E940000 xcall _Write_Control_Register
0272 .dbline 115
0272 ; Write_Control_Register(0x05,0x00);//ETXSTH
0272 2227 clr R18
0274 05E0 ldi R16,5
0276 0E940000 xcall _Write_Control_Register
027A .dbline 116
027A ; Bit_Field_Set(0x1e,0x80);//ECON2寄存器中的AUTOINC位置1,
027A 20E8 ldi R18,128
027C 0EE1 ldi R16,30
027E 0E940000 xcall _Bit_Field_Set
0282 .dbline 117
0282 ; Set_CS(0);//使能SPI器件
0282 0027 clr R16
0284 0E940000 xcall _Set_CS
0288 .dbline 118
0288 ; Write_Buffer_Memory_date(0x7A);//送命令,28J60中写缓冲存储器操作前3位为011后5位为常量11010
0288 0AE7 ldi R16,122
028A 0E940000 xcall _Write_Buffer_Memory_date
028E .dbline 119
028E ; Write_Buffer_Memory_date(0x0e);//28J60要求在待发送的数据包前添加一个包控制字节
028E 0EE0 ldi R16,14
0290 0E940000 xcall _Write_Buffer_Memory_date
0294 .dbline 121
0294 46E0 ldi R20,6
0296 0AC0 xjmp L62
0298 L59:
0298 .dbline 121
0298 80E0 ldi R24,<_Rec_packet
029A 90E0 ldi R25,>_Rec_packet
029C E42F mov R30,R20
029E FF27 clr R31
02A0 E80F add R30,R24
02A2 F91F adc R31,R25
02A4 0081 ldd R16,z+0
02A6 0E940000 xcall _Write_Buffer_Memory_date
02AA L60:
02AA .dbline 121
02AA 4395 inc R20
02AC L62:
02AC .dbline 121
02AC ;
02AC ; for(i=6;i<12;i++)Write_Buffer_Memory_date(Rec_packet[i]);//目标MAC地址6字节
02AC 4C30 cpi R20,12
02AE A0F3 brlo L59
02B0 .dbline 122
02B0 46E0 ldi R20,6
02B2 0AC0 xjmp L66
02B4 L63:
02B4 .dbline 122
02B4 80E0 ldi R24,<_MACHead
02B6 90E0 ldi R25,>_MACHead
02B8 E42F mov R30,R20
02BA FF27 clr R31
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -