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

📄 main.lis

📁 网卡控制器ENC28J60的AVR单片机ATmega16程序源代码(c),实现232toUDP功能,有非常详细的注释.
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 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 + -