📄 main.s
字号:
.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 + -