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

📄 main.s

📁 网卡控制器ENC28J60的AVR单片机ATmega16程序源代码(c),实现232toUDP功能,有非常详细的注释.
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module main.c
	.area vector(rom, abs)
	.org 4
	jmp _INT0_16
	.org 8
	jmp _INT1_17
	.org 44
	jmp _Usart_receive
	.org 36
	jmp _Timer0
	.area data(ram, con, rel)
_EIR::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.dbsym e EIR _EIR c
_Receive_Status::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 5
	.area idata
	.byte 0,0,0,0,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.dbsym e Receive_Status _Receive_Status A[6:6]c
_EPKTCNT::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.dbsym e EPKTCNT _EPKTCNT c
_DateLen::
	.blkb 1
	.area idata
	.byte 18
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.dbsym e DateLen _DateLen c
_MACHead::
	.blkb 2
	.area idata
	.byte 0,224
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 'L,199
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 27,'L
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 17,34
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 51,'D
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 'U,'f
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 8,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.dbsym e MACHead _MACHead A[14:14]c
_IpHead::
	.blkb 2
	.area idata
	.byte 'E,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 18,52
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 64,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 128,17
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 192,168
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 1,'h
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 192,168
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 1,'d
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.dbsym e IpHead _IpHead A[20:20]c
_UDPpacket::
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 192,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 0,17
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 4,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 4,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 235
	.area idata
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0
	.word 0,0,0,0,0
	.word 0,0,0,0,0
	.word 0,0,0,0,0
	.word 0,0,0,0,0
	.byte 0,0,0,0,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.dbsym e UDPpacket _UDPpacket A[255:255]c
_Rec_packet::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 254
	.area idata
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0
	.byte 0,0,0,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.dbsym e Rec_packet _Rec_packet A[255:255]c
_Rec232::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.blkb 254
	.area idata
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0
	.byte 0,0,0,0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.dbsym e Rec232 _Rec232 A[255:255]c
_usart_number::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.dbsym e usart_number _usart_number c
	.area text(rom, con, rel)
	.dbfile H:\小玩意制作\232转UDP\程序\main.c
	.dbfunc e CreateCrc _CreateCrc fV
;              H -> R22
;           temp -> R20
;              L -> R10
;              i -> R12
;           CRCL -> y+10
;           CRCH -> y+8
;            num -> R18
;              p -> R16,R17
	.even
_CreateCrc::
	xcall push_gset4
	.dbline -1
	.dbline 49
; /*##############################################################################
; 功能:232toUDP
; 作者:LHF
; 时间:2006-09
; 版本:V1.0
; ################################################################################
; 资源分配:	PORTC.2~5:JTAG
; ##############################################################################*/
; //##############################################################################
; #include "ENC28j60.h"	
; #pragma interrupt_handler INT0_16:2 //定义INT0的中断服务程序
; #pragma interrupt_handler INT1_17:3 //定义INT1的中断服务程序
; #pragma interrupt_handler Usart_receive:12 //定义接收中断服务程序
; #pragma interrupt_handler Timer0:10 //定义定时计数器0的中断服务程序
; uchar EIR=0;//存放中断请求标志寄存器的值
; uchar Receive_Status[6]={0x00};//存放接收状态向量
; uchar EPKTCNT=0x00;//还没处理的数据包个数,当它为0时才能使PKTIF自动清0以响应下次接收中断
; uchar DateLen=18;//有效数据长度,这里最大不超过203个字节
; uchar MACHead[14]={0x00,0xe0,0x4c,0xc7,0x1b,0x4c,//目标MAC地址
;                    0x11,0x22,0x33,0x44,0x55,0x66,//源MAC地址
;                    0x08,0x00};//上层协议为IP协议
; uchar IpHead[20]={0x45,0x00,
; 	  			  0x00,0x00,//总长度
; 				  0x12,0x34,//标识
; 				  0x40,0x00,//分段偏移量
; 				  0x80,//生存时间
; 				  0x11,//上层协议0x11表示是UDP
; 	  			  0x00,0x00,//IP校验和
; 	  			  0xc0,0xa8,0x01,0x68,//源IP地址,在此修改源IP地址
; 				  0xc0,0xa8,0x01,0x64};//目标IP地址,在此修改目标IP地址
; uchar UDPpacket[255]={0x00,0x00,0x00,0x00,//源IP地址
;                    0xc0,0x00,0x00,0x00,//目标IP地址
; 				   0x00,0x11,//未定义
; 				   0x00,0x00,//UDP报长度为26字节8+18=26//到此都是伪报头共12字节
; 				   
; 				   0x04,0x00,//源端口号1024
; 	               0x04,0x00,//目标端口号1024
; 				   0x00,0x00,//UDP报长度
; 				   0x00,0x00,//UDP校验和//UDP报头共8字节
; 				   
;  				   };//数据部分
; uchar Rec_packet[255]={0x00};//接收到的帧,考虑到M16只有1KRAM,所以这里设定,最大帧不能超过255
; uchar Rec232[255]={0x00};//串口接收到的数据
; uchar usart_number=0;	
; //#######################IP报头校验和计算#######################//
; void CreateCrc(uchar *p,uchar num,uchar CRCH,uchar CRCL)
; //必需先附IpHead值后再校验,CRCH表示数组存放校验和的位置高8位,CRCL表示数组存放校验和的位置低8位
; //num表示数组中元数的个数,如IP包头数组个数为20个
; {uchar i=0;
	.dbline 49
	clr R12
	.dbline 50
;  uchar temp=0,L=0,H=0;
	clr R20
	.dbline 50
	clr R10
	.dbline 50
	clr R22
	.dbline 51
;  p[CRCH]=0x00;p[CRCL]=0x00;//先将存放校验和的位置那位清0
	ldd R30,y+8
	clr R31
	add R30,R16
	adc R31,R17
	clr R2
	std z+0,R2
	.dbline 51
	ldd R30,y+10
	clr R31
	add R30,R16
	adc R31,R17
	std z+0,R2
	.dbline 52
	clr R12
	inc R12
	xjmp L5
L2:
	.dbline 52
;  for(i=1;i<num+1;i=i+2){temp=temp+p[i];
	.dbline 52
	mov R30,R12
	clr R31
	add R30,R16
	adc R31,R17
	ldd R2,z+0
	add R20,R2
	.dbline 53
	mov R30,R12
	clr R31
	add R30,R16
	adc R31,R17
	ldd R2,z+0
	cp R20,R2
	brsh L6
	.dbline 53
	inc R10
L6:
	.dbline 53
L3:
	.dbline 52
	mov R24,R12
	subi R24,254    ; addi 2
	mov R12,R24
L5:
	.dbline 52
	mov R24,R18
	subi R24,255    ; addi 1
	cp R12,R24
	brlo L2
	.dbline 54
	clr R12
	xjmp L11
L8:
	.dbline 54
; 		             if(temp<p[i])L++;}//如果temp<p[i]表示前面相加结果大于0XFF,则进1
;  for(i=0;i<num;i=i+2){L=L+p[i];
	.dbline 54
	mov R30,R12
	clr R31
	add R30,R16
	adc R31,R17
	ldd R2,z+0
	add R10,R2
	.dbline 55
	mov R30,R12
	clr R31
	add R30,R16
	adc R31,R17
	ldd R2,z+0
	cp R10,R2
	brsh L12
	.dbline 55
	inc R22
L12:
	.dbline 55
L9:
	.dbline 54
	mov R24,R12
	subi R24,254    ; addi 2
	mov R12,R24
L11:
	.dbline 54
	cp R12,R18
	brlo L8
	.dbline 56
; 		             if(L<p[i])H++;}//如果temp<p[i]表示前面相加结果大于0XFF,则进1   
;  temp=temp+H;//把高出16位的结果与低16位相加
	add R20,R22
	.dbline 57
;  if(temp<H){L++;//把高出16位的结果与低16位相加,如果有溢出,则再向高位进位
	cp R20,R22
	brsh L14
	.dbline 57
	.dbline 57
	inc R10
	.dbline 58
	brne L16
	.dbline 58
	inc R20
L16:
	.dbline 58
;             if(L==0)temp++;}//如果高位再溢出,再加到低位
L14:
	.dbline 59
;  p[CRCH]=0xff-L;//结果取反
	mov R2,R10
	clr R3
	ldi R24,255
	ldi R25,0
	sub R24,R2
	sbc R25,R3
	ldd R30,y+8
	clr R31
	add R30,R16
	adc R31,R17
	std z+0,R24
	.dbline 60
;  p[CRCL]=0xff-temp;//结果取反
	mov R2,R20
	clr R3
	ldi R24,255
	ldi R25,0
	sub R24,R2
	sbc R25,R3
	ldd R30,y+10
	clr R31
	add R30,R16
	adc R31,R17
	std z+0,R24
	.dbline -2
	.dbline 61
; }
L1:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r H 22 c
	.dbsym r temp 20 c
	.dbsym r L 10 c
	.dbsym r i 12 c
	.dbsym l CRCL 10 c
	.dbsym l CRCH 8 c
	.dbsym r num 18 c
	.dbsym r p 16 pc
	.dbend
	.dbfunc e Transmit_Packets _Transmit_Packets fV
;              i -> R20
	.even
_Transmit_Packets::
	xcall push_gset1
	sbiw R28,3
	.dbline -1
	.dbline 65
; 
; //##########################发送UDP数据包##########################//
; void Transmit_Packets(void)
; {uchar i=0;
	.dbline 65
	clr R20
	.dbline 66
;  enc28j60SetBank(0x00);//通过ECON1先选中当前控制寄存器组是Bank0
	clr R16
	xcall _enc28j60SetBank
	.dbline 68
;  
;  Write_Control_Register(0x02,0x00);//EWRPTL
	clr R18
	ldi R16,2
	xcall _Write_Control_Register
	.dbline 69
;  Write_Control_Register(0x03,0x00);//EWRPTH
	clr R18
	ldi R16,3
	xcall _Write_Control_Register
	.dbline 70
;  Write_Control_Register(0x04,0x00);//ETXSTL
	clr R18
	ldi R16,4
	xcall _Write_Control_Register
	.dbline 71
;  Write_Control_Register(0x05,0x00);//ETXSTH
	clr R18
	ldi R16,5
	xcall _Write_Control_Register
	.dbline 73
;   
;  Bit_Field_Set(0x1e,0x80);//ECON2寄存器中的AUTOINC位置1,
	ldi R18,128
	ldi R16,30
	xcall _Bit_Field_Set
	.dbline 75
	xjmp L22
L19:
	.dbline 75
	ldi R24,<_IpHead+12
	ldi R25,>_IpHead+12
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_UDPpacket
	ldi R25,>_UDPpacket
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
L20:
	.dbline 75
	inc R20
L22:
	.dbline 75
; 
;  for(i=0;i<8;i++)UDPpacket[i]=IpHead[i+12];//给UDP伪报头部分附IP值
	cpi R20,8
	brlo L19
	.dbline 76
;  IpHead[3]=DateLen+28;//IP包长度
	lds R24,_DateLen
	subi R24,228    ; addi 28
	sts _IpHead+3,R24
	.dbline 77
;  UDPpacket[11]=DateLen+8;//UDP包长度,伪报头,不发送部分
	lds R24,_DateLen
	subi R24,248    ; addi 8
	sts _UDPpacket+11,R24
	.dbline 78
;  UDPpacket[17]=DateLen+8;//UDP包长度,UDP报头
	lds R24,_DateLen
	subi R24,248    ; addi 8
	sts _UDPpacket+17,R24
	.dbline 79
;  CreateCrc(IpHead,20,10,11);//校验前要对数组中其它元素先附好值
	ldi R24,11
	std y+2,R24
	ldi R24,10
	std y+0,R24
	ldi R18,20
	ldi R16,<_IpHead
	ldi R17,>_IpHead
	xcall _CreateCrc
	.dbline 80
;  CreateCrc(UDPpacket,DateLen+20,18,19);//UDP校验
	ldi R24,19
	std y+2,R24
	ldi R24,18
	std y+0,R24
	lds R18,_DateLen
	subi R18,236    ; addi 20
	ldi R16,<_UDPpacket
	ldi R17,>_UDPpacket
	xcall _CreateCrc
	.dbline 81
; Set_CS(0);//使能SPI器件
	clr R16
	xcall _Set_CS
	.dbline 82
;  Write_Buffer_Memory_date(0x7A);//送命令,28J60中写缓冲存储器操作前3位为011后5位为常量11010
	ldi R16,122
	xcall _Write_Buffer_Memory_date
	.dbline 83
;  Write_Buffer_Memory_date(0x0e);//28J60要求在待发送的数据包前添加一个包控制字节
	ldi R16,14
	xcall _Write_Buffer_Memory_date
	.dbline 85
	clr R20
	xjmp L30
L27:
	.dbline 85
	ldi R24,<_MACHead
	ldi R25,>_MACHead
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _Write_Buffer_Memory_date
L28:
	.dbline 85
	inc R20
L30:
	.dbline 85
;  
;  for(i=0;i<14;i++)Write_Buffer_Memory_date(MACHead[i]);//MAC首部14字节  
	cpi R20,14
	brlo L27
	.dbline 86
	clr R20
	xjmp L34
L31:
	.dbline 86
	ldi R24,<_IpHead
	ldi R25,>_IpHead
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _Write_Buffer_Memory_date
L32:
	.dbline 86
	inc R20
L34:
	.dbline 86
;  for(i=0;i<20;i++)Write_Buffer_Memory_date(IpHead[i]);//IP首部20字节
	cpi R20,20
	brlo L31
	.dbline 87
	ldi R20,12
	xjmp L38
L35:
	.dbline 87
	ldi R24,<_UDPpacket
	ldi R25,>_UDPpacket
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _Write_Buffer_Memory_date
L36:
	.dbline 87
	inc R20
L38:
	.dbline 87
;  for(i=12;i<DateLen+20;i++)Write_Buffer_Memory_date(UDPpacket[i]);//UDP层去掉伪报头 
	lds R24,_DateLen
	subi R24,236    ; addi 20
	cp R20,R24
	brlo L35
	.dbline 89
;    
; Set_CS(1);//写缓冲寄存器结束
	ldi R16,1
	xcall _Set_CS
	.dbline 91
;  
;  Write_Control_Register(0x06,DateLen+42);//ETXNDL,6+6+2+20+8+DateLen
	lds R18,_DateLen
	subi R18,214    ; addi 42
	ldi R16,6
	xcall _Write_Control_Register
	.dbline 92
;  Write_Control_Register(0x07,0x00);//ETXNDH,即从0x0000开始写入数据
	clr R18
	ldi R16,7
	xcall _Write_Control_Register
	.dbline 94

⌨️ 快捷键说明

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