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

📄 main.lis

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