📄 232toudp.lst
字号:
__start:
__text_start:
01C0 E5CF LDI R28,0x5F
01C1 E0D4 LDI R29,4
01C2 BFCD OUT 0x3D,R28
01C3 BFDE OUT 0x3E,R29
01C4 51C0 SUBI R28,0x10
01C5 40D0 SBCI R29,0
01C6 EA0A LDI R16,0xAA
01C7 8308 STD Y+0,R16
01C8 2400 CLR R0
01C9 E8EB LDI R30,0x8B
01CA E0F3 LDI R31,3
01CB E013 LDI R17,3
01CC 38EB CPI R30,0x8B
01CD 07F1 CPC R31,R17
01CE F011 BEQ 0x01D1
01CF 9201 ST R0,Z+
01D0 CFFB RJMP 0x01CC
01D1 8300 STD Z+0,R16
01D2 E5E4 LDI R30,0x54
01D3 E0F0 LDI R31,0
01D4 E6A0 LDI R26,0x60
01D5 E0B0 LDI R27,0
01D6 E013 LDI R17,3
01D7 37EF CPI R30,0x7F
01D8 07F1 CPC R31,R17
01D9 F021 BEQ 0x01DE
01DA 95C8 LPM
01DB 9631 ADIW R30,1
01DC 920D ST R0,X+
01DD CFF9 RJMP 0x01D7
01DE 940E0612 CALL _main
_exit:
01E0 CFFF RJMP _exit
_CreateCrc:
H --> R22
temp --> R20
L --> R10
i --> R12
CRCL --> Y+10
CRCH --> Y+8
num --> R18
p --> R16
01E1 940E0787 CALL push_gset4
FILE: H:\小玩意制作\232转UDP\程序\main.c
(0001) /*##############################################################################
(0002) 功能:232toUDP
(0003) 作者:LHF
(0004) 时间:2006-09
(0005) 版本:V1.0
(0006) ################################################################################
(0007) 资源分配: PORTC.2~5:JTAG
(0008) ##############################################################################*/
(0009) //##############################################################################
(0010) #include "ENC28j60.h"
(0011) #pragma interrupt_handler INT0_16:2 //定义INT0的中断服务程序
(0012) #pragma interrupt_handler INT1_17:3 //定义INT1的中断服务程序
(0013) #pragma interrupt_handler Usart_receive:12 //定义接收中断服务程序
(0014) #pragma interrupt_handler Timer0:10 //定义定时计数器0的中断服务程序
(0015) uchar EIR=0;//存放中断请求标志寄存器的值
(0016) uchar Receive_Status[6]={0x00};//存放接收状态向量
(0017) uchar EPKTCNT=0x00;//还没处理的数据包个数,当它为0时才能使PKTIF自动清0以响应下次接收中断
(0018) uchar DateLen=18;//有效数据长度,这里最大不超过203个字节
(0019) uchar MACHead[14]={0x00,0xe0,0x4c,0xc7,0x1b,0x4c,//目标MAC地址
(0020) 0x11,0x22,0x33,0x44,0x55,0x66,//源MAC地址
(0021) 0x08,0x00};//上层协议为IP协议
(0022) uchar IpHead[20]={0x45,0x00,
(0023) 0x00,0x00,//总长度
(0024) 0x12,0x34,//标识
(0025) 0x40,0x00,//分段偏移量
(0026) 0x80,//生存时间
(0027) 0x11,//上层协议0x11表示是UDP
(0028) 0x00,0x00,//IP校验和
(0029) 0xc0,0xa8,0x01,0x68,//源IP地址,在此修改源IP地址
(0030) 0xc0,0xa8,0x01,0x64};//目标IP地址,在此修改目标IP地址
(0031) uchar UDPpacket[255]={0x00,0x00,0x00,0x00,//源IP地址
(0032) 0xc0,0x00,0x00,0x00,//目标IP地址
(0033) 0x00,0x11,//未定义
(0034) 0x00,0x00,//UDP报长度为26字节8+18=26//到此都是伪报头共12字节
(0035)
(0036) 0x04,0x00,//源端口号1024
(0037) 0x04,0x00,//目标端口号1024
(0038) 0x00,0x00,//UDP报长度
(0039) 0x00,0x00,//UDP校验和//UDP报头共8字节
(0040)
(0041) };//数据部分
(0042) uchar Rec_packet[255]={0x00};//接收到的帧,考虑到M16只有1KRAM,所以这里设定,最大帧不能超过255
(0043) uchar Rec232[255]={0x00};//串口接收到的数据
(0044) uchar usart_number=0;
(0045) //#######################IP报头校验和计算#######################//
(0046) void CreateCrc(uchar *p,uchar num,uchar CRCH,uchar CRCL)
(0047) //必需先附IpHead值后再校验,CRCH表示数组存放校验和的位置高8位,CRCL表示数组存放校验和的位置低8位
(0048) //num表示数组中元数的个数,如IP包头数组个数为20个
(0049) {uchar i=0;
01E3 24CC CLR R12
(0050) uchar temp=0,L=0,H=0;
01E4 2744 CLR R20
01E5 24AA CLR R10
01E6 2766 CLR R22
(0051) p[CRCH]=0x00;p[CRCL]=0x00;//先将存放校验和的位置那位清0
01E7 85E8 LDD R30,Y+8
01E8 27FF CLR R31
01E9 0FE0 ADD R30,R16
01EA 1FF1 ADC R31,R17
01EB 2422 CLR R2
01EC 8220 STD Z+0,R2
01ED 85EA LDD R30,Y+10
01EE 27FF CLR R31
01EF 0FE0 ADD R30,R16
01F0 1FF1 ADC R31,R17
01F1 8220 STD Z+0,R2
(0052) for(i=1;i<num+1;i=i+2){temp=temp+p[i];
01F2 24CC CLR R12
01F3 94C3 INC R12
01F4 C011 RJMP 0x0206
01F5 2DEC MOV R30,R12
01F6 27FF CLR R31
01F7 0FE0 ADD R30,R16
01F8 1FF1 ADC R31,R17
01F9 8020 LDD R2,Z+0
01FA 0D42 ADD R20,R2
(0053) if(temp<p[i])L++;}//如果temp<p[i]表示前面相加结果大于0XFF,则进1
01FB 2DEC MOV R30,R12
01FC 27FF CLR R31
01FD 0FE0 ADD R30,R16
01FE 1FF1 ADC R31,R17
01FF 8020 LDD R2,Z+0
0200 1542 CP R20,R2
0201 F408 BCC 0x0203
0202 94A3 INC R10
0203 2D8C MOV R24,R12
0204 5F8E SUBI R24,0xFE
0205 2EC8 MOV R12,R24
0206 2F82 MOV R24,R18
0207 5F8F SUBI R24,0xFF
0208 16C8 CP R12,R24
0209 F358 BCS 0x01F5
(0054) for(i=0;i<num;i=i+2){L=L+p[i];
020A 24CC CLR R12
020B C011 RJMP 0x021D
020C 2DEC MOV R30,R12
020D 27FF CLR R31
020E 0FE0 ADD R30,R16
020F 1FF1 ADC R31,R17
0210 8020 LDD R2,Z+0
0211 0CA2 ADD R10,R2
(0055) if(L<p[i])H++;}//如果temp<p[i]表示前面相加结果大于0XFF,则进1
0212 2DEC MOV R30,R12
0213 27FF CLR R31
0214 0FE0 ADD R30,R16
0215 1FF1 ADC R31,R17
0216 8020 LDD R2,Z+0
0217 14A2 CP R10,R2
0218 F408 BCC 0x021A
0219 9563 INC R22
021A 2D8C MOV R24,R12
021B 5F8E SUBI R24,0xFE
021C 2EC8 MOV R12,R24
021D 16C2 CP R12,R18
021E F368 BCS 0x020C
(0056) temp=temp+H;//把高出16位的结果与低16位相加
021F 0F46 ADD R20,R22
(0057) if(temp<H){L++;//把高出16位的结果与低16位相加,如果有溢出,则再向高位进位
0220 1746 CP R20,R22
0221 F418 BCC 0x0225
0222 94A3 INC R10
(0058) if(L==0)temp++;}//如果高位再溢出,再加到低位
0223 F409 BNE 0x0225
0224 9543 INC R20
(0059) p[CRCH]=0xff-L;//结果取反
0225 2C2A MOV R2,R10
0226 2433 CLR R3
0227 EF8F LDI R24,0xFF
0228 E090 LDI R25,0
0229 1982 SUB R24,R2
022A 0993 SBC R25,R3
022B 85E8 LDD R30,Y+8
022C 27FF CLR R31
022D 0FE0 ADD R30,R16
022E 1FF1 ADC R31,R17
022F 8380 STD Z+0,R24
(0060) p[CRCL]=0xff-temp;//结果取反
0230 2E24 MOV R2,R20
0231 2433 CLR R3
0232 EF8F LDI R24,0xFF
0233 E090 LDI R25,0
0234 1982 SUB R24,R2
0235 0993 SBC R25,R3
0236 85EA LDD R30,Y+10
0237 27FF CLR R31
0238 0FE0 ADD R30,R16
0239 1FF1 ADC R31,R17
023A 8380 STD Z+0,R24
(0061) }
023B 940E0765 CALL pop_gset4
023D 9508 RET
_Transmit_Packets:
i --> R20
023E 940E0768 CALL push_gset1
0240 9723 SBIW R28,3
(0062)
(0063) //##########################发送UDP数据包##########################//
(0064) void Transmit_Packets(void)
(0065) {uchar i=0;
0241 2744 CLR R20
(0066) enc28j60SetBank(0x00);//通过ECON1先选中当前控制寄存器组是Bank0
0242 2700 CLR R16
0243 940E06F4 CALL _enc28j60SetBank
(0067)
(0068) Write_Control_Register(0x02,0x00);//EWRPTL
0245 2722 CLR R18
0246 E002 LDI R16,2
0247 940E0667 CALL _Write_Control_Register
(0069) Write_Control_Register(0x03,0x00);//EWRPTH
0249 2722 CLR R18
024A E003 LDI R16,3
024B 940E0667 CALL _Write_Control_Register
(0070) Write_Control_Register(0x04,0x00);//ETXSTL
024D 2722 CLR R18
024E E004 LDI R16,4
024F 940E0667 CALL _Write_Control_Register
(0071) Write_Control_Register(0x05,0x00);//ETXSTH
0251 2722 CLR R18
0252 E005 LDI R16,5
0253 940E0667 CALL _Write_Control_Register
(0072)
(0073) Bit_Field_Set(0x1e,0x80);//ECON2寄存器中的AUTOINC位置1,
0255 E820 LDI R18,0x80
0256 E10E LDI R16,0x1E
0257 940E06C8 CALL _Bit_Field_Set
(0074)
(0075) for(i=0;i<8;i++)UDPpacket[i]=IpHead[i+12];//给UDP伪报头部分附IP值
0259 C00F RJMP 0x0269
025A E883 LDI R24,0x83
025B E090 LDI R25,0
025C 2FE4 MOV R30,R20
025D 27FF CLR R31
025E 0FE8 ADD R30,R24
025F 1FF9 ADC R31,R25
0260 8020 LDD R2,Z+0
0261 E88B LDI R24,0x8B
0262 E090 LDI R25,0
0263 2FE4 MOV R30,R20
0264 27FF CLR R31
0265 0FE8 ADD R30,R24
0266 1FF9 ADC R31,R25
0267 8220 STD Z+0,R2
0268 9543 INC R20
0269 3048 CPI R20,0x8
026A F378 BCS 0x025A
(0076) IpHead[3]=DateLen+28;//IP包长度
026B 91800068 LDS R24,0x68
026D 5E84 SUBI R24,0xE4
026E 9380007A STS 0x7A,R24
(0077) UDPpacket[11]=DateLen+8;//UDP包长度,伪报头,不发送部分
0270 91800068 LDS R24,0x68
0272 5F88 SUBI R24,0xF8
0273 93800096 STS 0x96,R24
(0078) UDPpacket[17]=DateLen+8;//UDP包长度,UDP报头
0275 91800068 LDS R24,0x68
0277 5F88 SUBI R24,0xF8
0278 9380009C STS 0x9C,R24
(0079) CreateCrc(IpHead,20,10,11);//校验前要对数组中其它元素先附好值
027A E08B LDI R24,0xB
027B 838A STD Y+2,R24
027C E08A LDI R24,0xA
027D 8388 STD Y+0,R24
027E E124 LDI R18,0x14
027F E707 LDI R16,0x77
0280 E010 LDI R17,0
0281 DF5F RCALL _CreateCrc
(0080) CreateCrc(UDPpacket,DateLen+20,18,19);//UDP校验
0282 E183 LDI R24,0x13
0283 838A STD Y+2,R24
0284 E182 LDI R24,0x12
0285 8388 STD Y+0,R24
0286 91200068 LDS R18,0x68
0288 5E2C SUBI R18,0xEC
0289 E80B LDI R16,0x8B
028A E010 LDI R17,0
028B DF55 RCALL _CreateCrc
(0081) Set_CS(0);//使能SPI器件
028C 2700 CLR R16
028D 940E0631 CALL _Set_CS
(0082) Write_Buffer_Memory_date(0x7A);//送命令,28J60中写缓冲存储器操作前3位为011后5位为常量11010
028F E70A LDI R16,0x7A
0290 940E06A9 CALL _Write_Buffer_Memory_date
(0083) Write_Buffer_Memory_date(0x0e);//28J60要求在待发送的数据包前添加一个包控制字节
0292 E00E LDI R16,0xE
0293 940E06A9 CALL _Write_Buffer_Memory_date
(0084)
(0085) for(i=0;i<14;i++)Write_Buffer_Memory_date(MACHead[i]);//MAC首部14字节
0295 2744 CLR R20
0296 C00A RJMP 0x02A1
0297 E689 LDI R24,0x69
0298 E090 LDI R25,0
0299 2FE4 MOV R30,R20
029A 27FF CLR R31
029B 0FE8 ADD R30,R24
029C 1FF9 ADC R31,R25
029D 8100 LDD R16,Z+0
029E 940E06A9 CALL _Write_Buffer_Memory_date
02A0 9543 INC R20
02A1 304E CPI R20,0xE
02A2 F3A0 BCS 0x0297
(0086) for(i=0;i<20;i++)Write_Buffer_Memory_date(IpHead[i]);//IP首部20字节
02A3 2744 CLR R20
02A4 C00A RJMP 0x02AF
02A5 E787 LDI R24,0x77
02A6 E090 LDI R25,0
02A7 2FE4 MOV R30,R20
02A8 27FF CLR R31
02A9 0FE8 ADD R30,R24
02AA 1FF9 ADC R31,R25
02AB 8100 LDD R16,Z+0
02AC 940E06A9 CALL _Write_Buffer_Memory_date
02AE 9543 INC R20
02AF 3144 CPI R20,0x14
02B0 F3A0 BCS 0x02A5
(0087) for(i=12;i<DateLen+20;i++)Write_Buffer_Memory_date(UDPpacket[i]);//UDP层去掉伪报头
02B1 E04C LDI R20,0xC
02B2 C00A RJMP 0x02BD
02B3 E88B LDI R24,0x8B
02B4 E090 LDI R25,0
02B5 2FE4 MOV R30,R20
02B6 27FF CLR R31
02B7 0FE8 ADD R30,R24
02B8 1FF9 ADC R31,R25
02B9 8100 LDD R16,Z+0
02BA 940E06A9 CALL _Write_Buffer_Memory_date
02BC 9543 INC R20
02BD 91800068 LDS R24,0x68
02BF 5E8C SUBI R24,0xEC
02C0 1748 CP R20,R24
02C1 F388 BCS 0x02B3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -