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

📄 main.lis

📁 网卡控制器ENC28J60的AVR单片机ATmega16程序源代码(c),实现232toUDP功能,有非常详细的注释.
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 02BC E80F              add R30,R24
 02BE F91F              adc R31,R25
 02C0 0081              ldd R16,z+0
 02C2 0E940000          xcall _Write_Buffer_Memory_date
 02C6           L64:
 02C6                   .dbline 122
 02C6 4395              inc R20
 02C8           L66:
 02C8                   .dbline 122
 02C8           ; for(i=6;i<12;i++)Write_Buffer_Memory_date(MACHead[i]);    //源MAC地址6字节
 02C8 4C30              cpi R20,12
 02CA A0F3              brlo L63
 02CC                   .dbline 123
 02CC 4CE0              ldi R20,12
 02CE 0AC0              xjmp L70
 02D0           L67:
 02D0                   .dbline 123
 02D0 80E0              ldi R24,<_Rec_packet
 02D2 90E0              ldi R25,>_Rec_packet
 02D4 E42F              mov R30,R20
 02D6 FF27              clr R31
 02D8 E80F              add R30,R24
 02DA F91F              adc R31,R25
 02DC 0081              ldd R16,z+0
 02DE 0E940000          xcall _Write_Buffer_Memory_date
 02E2           L68:
 02E2                   .dbline 123
 02E2 4395              inc R20
 02E4           L70:
 02E4                   .dbline 123
 02E4           ; for(i=12;i<20;i++)Write_Buffer_Memory_date(Rec_packet[i]);//0x08,0x06,0x00,0x01,0x08,0x00,0x06,0x04
 02E4 4431              cpi R20,20
 02E6 A0F3              brlo L67
 02E8                   .dbline 124
 02E8           ; Write_Buffer_Memory_date(0x00);
 02E8 0027              clr R16
 02EA 0E940000          xcall _Write_Buffer_Memory_date
 02EE                   .dbline 125
 02EE           ; Write_Buffer_Memory_date(0x02);//0x0002表示是应答帧
 02EE 02E0              ldi R16,2
 02F0 0E940000          xcall _Write_Buffer_Memory_date
 02F4                   .dbline 126
 02F4 46E0              ldi R20,6
 02F6 0AC0              xjmp L74
 02F8           L71:
 02F8                   .dbline 126
 02F8 80E0              ldi R24,<_MACHead
 02FA 90E0              ldi R25,>_MACHead
 02FC E42F              mov R30,R20
 02FE FF27              clr R31
 0300 E80F              add R30,R24
 0302 F91F              adc R31,R25
 0304 0081              ldd R16,z+0
 0306 0E940000          xcall _Write_Buffer_Memory_date
 030A           L72:
 030A                   .dbline 126
 030A 4395              inc R20
 030C           L74:
 030C                   .dbline 126
 030C           ; for(i=6;i<12;i++)Write_Buffer_Memory_date(MACHead[i]);    //源MAC地址6字节
 030C 4C30              cpi R20,12
 030E A0F3              brlo L71
 0310                   .dbline 127
 0310 46E2              ldi R20,38
 0312 0AC0              xjmp L78
 0314           L75:
 0314                   .dbline 127
 0314 80E0              ldi R24,<_Rec_packet
 0316 90E0              ldi R25,>_Rec_packet
 0318 E42F              mov R30,R20
 031A FF27              clr R31
 031C E80F              add R30,R24
 031E F91F              adc R31,R25
 0320 0081              ldd R16,z+0
 0322 0E940000          xcall _Write_Buffer_Memory_date
 0326           L76:
 0326                   .dbline 127
 0326 4395              inc R20
 0328           L78:
 0328                   .dbline 127
 0328           ; for(i=38;i<42;i++)Write_Buffer_Memory_date(Rec_packet[i]);//源IP地址
 0328 4A32              cpi R20,42
 032A A0F3              brlo L75
 032C                   .dbline 128
 032C 46E1              ldi R20,22
 032E 0AC0              xjmp L82
 0330           L79:
 0330                   .dbline 128
 0330 80E0              ldi R24,<_Rec_packet
 0332 90E0              ldi R25,>_Rec_packet
 0334 E42F              mov R30,R20
 0336 FF27              clr R31
 0338 E80F              add R30,R24
 033A F91F              adc R31,R25
 033C 0081              ldd R16,z+0
 033E 0E940000          xcall _Write_Buffer_Memory_date
 0342           L80:
 0342                   .dbline 128
 0342 4395              inc R20
 0344           L82:
 0344                   .dbline 128
 0344           ; for(i=22;i<32;i++)Write_Buffer_Memory_date(Rec_packet[i]);//目标MAC地址6字节,目标IP地址
 0344 4032              cpi R20,32
 0346 A0F3              brlo L79
 0348                   .dbline 129
 0348           ; Set_CS(1);//写缓冲寄存器结束
 0348 01E0              ldi R16,1
 034A 0E940000          xcall _Set_CS
 034E                   .dbline 130
 034E           ;  Write_Control_Register(0x06,42);//ETXNDL,6+6+2+20+8
 034E 2AE2              ldi R18,42
 0350 06E0              ldi R16,6
 0352 0E940000          xcall _Write_Control_Register
 0356                   .dbline 131
 0356           ;  Write_Control_Register(0x07,0x00);//ETXNDH,即从0x0000开始写入数据
 0356 2227              clr R18
 0358 07E0              ldi R16,7
 035A 0E940000          xcall _Write_Control_Register
 035E                   .dbline 133
 035E           ;  
 035E           ;  Bit_Field_Clear(0x1c,0x08);//将EIR.TXIF位清零
 035E 28E0              ldi R18,8
 0360 0CE1              ldi R16,28
 0362 0E940000          xcall _Bit_Field_Clear
 0366                   .dbline 134
 0366           ;  Bit_Field_Set(0x1f,0x08);//将ECON1.TXRTS 位置1开始发送
 0366 28E0              ldi R18,8
 0368 0FE1              ldi R16,31
 036A 0E940000          xcall _Bit_Field_Set
 036E                   .dbline -2
 036E                   .dbline 135
 036E           ; }
 036E           L58:
 036E 0E940000          xcall pop_gset1
 0372                   .dbline 0 ; func end
 0372 0895              ret
 0374                   .dbsym r i 20 c
 0374                   .dbend
 0374                   .dbfunc e Receive_Packets _Receive_Packets fV
 0374           ; Receive_Byte_Number -> R20,R21
 0374           ;              i -> R22
                        .even
 0374           _Receive_Packets::
 0374 0E940000          xcall push_gset2
 0378                   .dbline -1
 0378                   .dbline 138
 0378           ; //##########################接收数据包处理##########################//
 0378           ; void Receive_Packets(void)//
 0378           ; {uchar i=0;
 0378                   .dbline 138
 0378 6627              clr R22
 037A                   .dbline 139
 037A           ;  uint Receive_Byte_Number=0;
 037A 4427              clr R20
 037C 5527              clr R21
 037E                   .dbline 140
 037E           ;  enc28j60SetBank(0x00);//通过ECON1先选中当前控制寄存器组是Bank0
 037E 0027              clr R16
 0380 0E940000          xcall _enc28j60SetBank
 0384                   .dbline 141
 0384           ;  Receive_Status[0]=Read_Buffer_Memory();//存放下一个数据包的起始位置低8位
 0384 0E940000          xcall _Read_Buffer_Memory
 0388 00930100          sts _Receive_Status,R16
 038C                   .dbline 142
 038C           ;  Receive_Status[1]=Read_Buffer_Memory();//存放下一个数据包的起始位置高8位
 038C 0E940000          xcall _Read_Buffer_Memory
 0390 00930200          sts _Receive_Status+1,R16
 0394                   .dbline 143
 0394           ;  Receive_Status[2]=Read_Buffer_Memory();//存放当前接收到的数据包的字节数低8位
 0394 0E940000          xcall _Read_Buffer_Memory
 0398 00930300          sts _Receive_Status+2,R16
 039C                   .dbline 144
 039C           ;  Receive_Status[3]=Read_Buffer_Memory();//存放当前接收到的数据包的字节数高8位
 039C 0E940000          xcall _Read_Buffer_Memory
 03A0 00930400          sts _Receive_Status+3,R16
 03A4                   .dbline 145
 03A4           ;  Receive_Status[4]=Read_Buffer_Memory();//其它,参看数据手册
 03A4 0E940000          xcall _Read_Buffer_Memory
 03A8 00930500          sts _Receive_Status+4,R16
 03AC                   .dbline 146
 03AC           ;  Receive_Status[5]=Read_Buffer_Memory();//其它,参看数据手册
 03AC 0E940000          xcall _Read_Buffer_Memory
 03B0 00930600          sts _Receive_Status+5,R16
 03B4                   .dbline 148
 03B4           ;   
 03B4           ;  Receive_Byte_Number +=Receive_Status[3];
 03B4 20900400          lds R2,_Receive_Status+3
 03B8 3324              clr R3
 03BA 420D              add R20,R2
 03BC 531D              adc R21,R3
 03BE                   .dbline 149
 03BE           ;  Receive_Byte_Number =Receive_Byte_Number<<8;
 03BE 542F              mov R21,R20
 03C0 4427              clr R20
 03C2                   .dbline 150
 03C2           ;  Receive_Byte_Number +=Receive_Status[2];
 03C2 20900300          lds R2,_Receive_Status+2
 03C6 3324              clr R3
 03C8 420D              add R20,R2
 03CA 531D              adc R21,R3
 03CC                   .dbline 152
 03CC 0AC0              xjmp L94
 03CE           L91:
 03CE                   .dbline 152
 03CE 0E940000          xcall _Read_Buffer_Memory
 03D2 80E0              ldi R24,<_Rec_packet
 03D4 90E0              ldi R25,>_Rec_packet
 03D6 E62F              mov R30,R22
 03D8 FF27              clr R31
 03DA E80F              add R30,R24
 03DC F91F              adc R31,R25
 03DE 0083              std z+0,R16
 03E0           L92:
 03E0                   .dbline 152
 03E0 6395              inc R22
 03E2           L94:
 03E2                   .dbline 152
 03E2           ;  //得到接收到的数据包长度包括目标地址,源地址,类型/长度,数据,填充,CRC字段
 03E2           ;  for(i=0;i<Receive_Byte_Number;i++)Rec_packet[i]=Read_Buffer_Memory();//将接收到的当前数据包存放在Rec_packet[255]中等待处理
 03E2 262E              mov R2,R22
 03E4 3324              clr R3
 03E6 2416              cp R2,R20
 03E8 3506              cpc R3,R21
 03EA 88F3              brlo L91
 03EC                   .dbline 153
 03EC           ;  i=ARP_request_or_answer();
 03EC 03DF              xcall _ARP_request_or_answer
 03EE 602F              mov R22,R16
 03F0                   .dbline 154
 03F0           ;  if(i==0x01)Transmit_ARP_Packets();//如果是本地ARP请求帧,则响应请求,发送ARP应答帧
 03F0 0130              cpi R16,1
 03F2 09F4              brne L95
 03F4                   .dbline 154
 03F4 2CDF              xcall _Transmit_ARP_Packets
 03F6           L95:
 03F6                   .dbline 156
 03F6           ; 
 03F6           ;  putchar(0x4C);
 03F6 0CE4              ldi R16,76
 03F8 0E940000          xcall _putchar
 03FC                   .dbline 157
 03FC           ;  putchar(0x48);
 03FC 08E4              ldi R16,72
 03FE 0E940000          xcall _putchar
 0402                   .dbline 158
 0402           ;  putchar(0x46);//发送"LHF"通知上位机,紧接着要发送刚接收到的数据帧给上位机
 0402 06E4              ldi R16,70
 0404 0E940000          xcall _putchar
 0408                   .dbline 159
 0408 6627              clr R22
 040A 0AC0              xjmp L100
 040C           L97:
 040C                   .dbline 159
 040C 80E0              ldi R24,<_Rec_packet
 040E 90E0              ldi R25,>_Rec_packet
 0410 E62F              mov R30,R22
 0412 FF27              clr R31
 0414 E80F              add R30,R24
 0416 F91F              adc R31,R25
 0418 0081              ldd R16,z+0
 041A 0E940000          xcall _putchar
 041E           L98:
 041E                   .dbline 159
 041E 6395              inc R22
 0420           L100:
 0420                   .dbline 159
 0420           ;  for(i=0;i<Receive_Byte_Number;i++)putchar(Rec_packet[i]);
 0420 262E              mov R2,R22
 0422 3324              clr R3
 0424 2416              cp R2,R20
 0426 3506              cpc R3,R21
 0428 88F3              brlo L97
 042A                   .dbline 162
 042A           ;   //将接收到的数据发送到上位机软件,包括目标地址,源地址,类型/长度,数据,填充,CRC字段。
 042A           ; 
 042A           ;  Bit_Field_Set(0x1e,0x40);//数据处理完后,然后清零待处理中断标志位PKTIF
 042A 20E4              ldi R18,64
 042C 0EE1              ldi R16,30

⌨️ 快捷键说明

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