📄 main.s
字号:
ldi R16,4
xcall _Write_Control_Register
.dbline 225
; //接下去对PHY进行初始化//
; Write_PHY_Register(0x00,0x01,0x00);//将PHCON1.PDPXMD置1,工作在全双工模式.
clr R2
std y+0,R2
ldi R18,1
clr R16
xcall _Write_PHY_Register
.dbline 226
; Write_PHY_Register(0x10,0x01,0x00);//将PHCON2.HDLDIS置1,禁止发送数据的自动环回。
clr R2
std y+0,R2
ldi R18,1
ldi R16,16
xcall _Write_PHY_Register
.dbline 227
; Write_PHY_Register(0x14,0x04,0x72);//PHLCON寄存器配置LEDA,LEDB;LEDA显示链接状态,LEDB显示发送和接收活动
ldi R24,114
std y+0,R24
ldi R18,4
ldi R16,20
xcall _Write_PHY_Register
.dbline 229
;
; Bit_Field_Set(0x1e,0x80);//ECON2寄存器中的AUTOINC位置1,写缓冲器命令时自动指向下一个地址
ldi R18,128
ldi R16,30
xcall _Bit_Field_Set
.dbline 230
; Bit_Field_Set(0x1B,0xc0);//将EIE.INTIE位和EIE.PKTIE置1允许接收产生中断。
ldi R18,192
ldi R16,27
xcall _Bit_Field_Set
.dbline 231
; Write_Control_Register(0x1f,0x04);//接收使能
ldi R18,4
ldi R16,31
xcall _Write_Control_Register
.dbline -2
.dbline 232
; }
L102:
adiw R28,1
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r state 20 c
.dbend
.dbfunc e INT1_17 _INT1_17 fV
; i -> R16
.even
_INT1_17::
st -y,R16
st -y,R24
in R16,0x3f
st -y,R16
.dbline -1
.dbline 235
; //##############################中断服务程序##################################//
; void INT1_17(void)//接外部按键
; {uchar i=0;
.dbline 235
clr R16
.dbline 236
; GICR &=0xbf;
in R24,0x3b
andi R24,191
out 0x3b,R24
.dbline 238
; //Transmit_Packets();//起动发送数据包
; GICR |=0x40;
in R24,0x3b
ori R24,64
out 0x3b,R24
.dbline -2
.dbline 239
; }
L112:
ld R16,y+
out 0x3f,R16
ld R24,y+
ld R16,y+
.dbline 0 ; func end
reti
.dbsym r i 16 c
.dbend
.dbfunc e INT0_16 _INT0_16 fV
; temp -> R20
.even
_INT0_16::
xcall push_lset
xcall push_gset1
.dbline -1
.dbline 241
; void INT0_16(void)
; {uchar temp=0x00;//
.dbline 241
clr R20
.dbline 242
; GICR &=0x7f;
in R24,0x3b
andi R24,127
out 0x3b,R24
.dbline 243
; temp=Read_Control_Register(ETH,0x1f);//读取ECON1的值,先保护起来
ldi R18,31
clr R16
xcall _Read_Control_Register
mov R20,R16
L114:
.dbline 245
;
; do Receive_Packets();
xcall _Receive_Packets
L115:
.dbline 246
; while(EPKTCNT!=0);
lds R2,_EPKTCNT
tst R2
brne L114
.dbline 247
; Write_Control_Register(0x1f,0x00);//关接收使能
clr R18
ldi R16,31
xcall _Write_Control_Register
.dbline 248
; enc28j60SetBank(0x00);//通过ECON1先选中当前控制寄存器组是Bank0
clr R16
xcall _enc28j60SetBank
.dbline 249
; Write_Control_Register(0x08,0x00);//ERXSTL
clr R18
ldi R16,8
xcall _Write_Control_Register
.dbline 250
; Write_Control_Register(0x09,0x08);//ERXSTH,ERXST指针指定接收数据包放在RAM中的开始位置
ldi R18,8
ldi R16,9
xcall _Write_Control_Register
.dbline 251
; Write_Control_Register(0x0C,0x00);//ERXRDPTL
clr R18
ldi R16,12
xcall _Write_Control_Register
.dbline 252
; Write_Control_Register(0x0D,0x08);//ERXRDPTH,与ERXST值要保持相同
ldi R18,8
ldi R16,13
xcall _Write_Control_Register
.dbline 253
; Write_Control_Register(0x00,0x00);//ERDPTL
clr R18
clr R16
xcall _Write_Control_Register
.dbline 254
; Write_Control_Register(0x01,0x08);//ERDPTH,读数据包指针起始位置
ldi R18,8
ldi R16,1
xcall _Write_Control_Register
.dbline 255
; Write_Control_Register(0x0A,0xff);//ERXNDL
ldi R18,255
ldi R16,10
xcall _Write_Control_Register
.dbline 256
; Write_Control_Register(0x0B,0x1f);//
ldi R18,31
ldi R16,11
xcall _Write_Control_Register
.dbline 258
;
; Write_Control_Register(0x1f,0x04);//接收使能
ldi R18,4
ldi R16,31
xcall _Write_Control_Register
.dbline 260
;
; Write_Control_Register(0x1f,temp);//恢复ECON1的值
mov R18,R20
ldi R16,31
xcall _Write_Control_Register
.dbline 261
; GICR |=0x80;
in R24,0x3b
ori R24,128
out 0x3b,R24
.dbline -2
.dbline 262
; }
L113:
xcall pop_gset1
xcall pop_lset
.dbline 0 ; func end
reti
.dbsym r temp 20 c
.dbend
.dbfunc e Usart_receive _Usart_receive fV
.even
_Usart_receive::
st -y,R2
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 266
;
; //####################################
; void Usart_receive(void)//定义接收中断服务程序
; {Rec232[usart_number]=UDR;
.dbline 266
ldi R24,<_Rec232
ldi R25,>_Rec232
lds R30,_usart_number
clr R31
add R30,R24
adc R31,R25
in R2,0xc
std z+0,R2
.dbline 267
; usart_number++;
lds R24,_usart_number
subi R24,255 ; addi 1
sts _usart_number,R24
.dbline 268
; TIMSK=0x01;//打开T1,T0中断屏蔽
ldi R24,1
out 0x39,R24
.dbline 269
; TCCR0=0x05;//设T0分频数为1024
ldi R24,5
out 0x33,R24
.dbline 270
; TCNT0=0xf0;//设T0时间常数,波特率数据流结束所对应的间隔
ldi R24,240
out 0x32,R24
.dbline -2
.dbline 271
; }
L117:
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e Timer0 _Timer0 fV
; i -> R20
.even
_Timer0::
xcall push_lset
xcall push_gset1
.dbline -1
.dbline 274
; //##############定时器中断0,串行数据流控制
; void Timer0(void)
; {uchar i=0;
.dbline 274
clr R20
.dbline 275
; TIMSK=0x00;//关T0中断屏蔽
clr R2
out 0x39,R2
.dbline 276
; TCNT0=0x00;//
out 0x32,R2
.dbline 277
; TCCR0=0x00;//T0停止计数
out 0x33,R2
.dbline 278
; usart_number=usart_number-1;
lds R24,_usart_number
subi R24,1
sts _usart_number,R24
.dbline 279
; DateLen=usart_number-42;//
subi R24,42
sts _DateLen,R24
.dbline 280
; if(Rec232[0]==0x04 && Rec232[1]==0x05 && Rec232[2]==0x06){
lds R24,_Rec232
cpi R24,4
brne L119
lds R24,_Rec232+1
cpi R24,5
brne L119
lds R24,_Rec232+2
cpi R24,6
brne L119
.dbline 280
.dbline 281
; putchar(0x4F);putchar(0x4B);putchar(0x21);
ldi R16,79
xcall _putchar
.dbline 281
ldi R16,75
xcall _putchar
.dbline 281
ldi R16,33
xcall _putchar
.dbline 282
; }//连接成功回答OK!
L119:
.dbline 283
; if(Rec232[0]==0x4c && Rec232[1]==0x48 && Rec232[2]==0x46){//是不是LHF,是则发送
lds R24,_Rec232
cpi R24,76
breq X0
xjmp L123
X0:
lds R24,_Rec232+1
cpi R24,72
breq X1
xjmp L123
X1:
lds R24,_Rec232+2
cpi R24,70
breq X2
xjmp L123
X2:
.dbline 283
.dbline 284
ldi R20,3
xjmp L130
L127:
.dbline 284
ldi R24,<_Rec232
ldi R25,>_Rec232
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_MACHead-3
ldi R25,>_MACHead-3
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R2
L128:
.dbline 284
inc R20
L130:
.dbline 284
; for(i=3;i<15;i++)MACHead[i-3]=Rec232[i];
cpi R20,15
brlo L127
.dbline 285
ldi R20,15
xjmp L135
L132:
.dbline 285
ldi R24,<_Rec232
ldi R25,>_Rec232
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_IpHead-15
ldi R25,>_IpHead-15
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R2
L133:
.dbline 285
inc R20
L135:
.dbline 285
; for(i=15;i<35;i++)IpHead[i-15]=Rec232[i];
cpi R20,35
brlo L132
.dbline 286
ldi R20,35
xjmp L140
L137:
.dbline 286
ldi R24,<_Rec232
ldi R25,>_Rec232
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_UDPpacket-23
ldi R25,>_UDPpacket-23
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R2
L138:
.dbline 286
inc R20
L140:
.dbline 286
; for(i=35;i<usart_number+1;i++)UDPpacket[i-23]=Rec232[i];
lds R24,_usart_number
subi R24,255 ; addi 1
cp R20,R24
brlo L137
.dbline 287
; Transmit_Packets();}//发送数据
xcall _Transmit_Packets
.dbline 287
L123:
.dbline 288
; if(Rec232[0]==0x4d && Rec232[1]==0x41 && Rec232[2]==0x43){//是不是MAC 配置28J60
lds R24,_Rec232
cpi R24,77
breq X3
xjmp L142
X3:
lds R24,_Rec232+1
cpi R24,65
breq X4
xjmp L142
X4:
lds R24,_Rec232+2
cpi R24,67
breq X5
xjmp L142
X5:
.dbline 288
.dbline 289
ldi R20,3
xjmp L149
L146:
.dbline 289
ldi R24,<_Rec232
ldi R25,>_Rec232
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_MACHead-3
ldi R25,>_MACHead-3
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R2
L147:
.dbline 289
inc R20
L149:
.dbline 289
; for(i=3;i<15;i++)MACHead[i-3]=Rec232[i];
cpi R20,15
brlo L146
.dbline 290
ldi R20,15
xjmp L154
L151:
.dbline 290
ldi R24,<_Rec232
ldi R25,>_Rec232
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_IpHead-15
ldi R25,>_IpHead-15
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R2
L152:
.dbline 290
inc R20
L154:
.dbline 290
; for(i=15;i<35;i++)IpHead[i-15]=Rec232[i];
cpi R20,35
brlo L151
.dbline 291
; ENC28J60_Initialize();
xcall _ENC28J60_Initialize
.dbline 292
; delay(50);
ldi R16,50
xcall _delay
.dbline 293
; putchar(0x4C);
ldi R16,76
xcall _putchar
.dbline 294
; putchar(0x48);
ldi R16,72
xcall _putchar
.dbline 295
; putchar(0x46);//发送"LHF"通知上位机,
ldi R16,70
xcall _putchar
.dbline 296
clr R20
xjmp L159
L156:
.dbline 296
mov R16,R20
xcall _putchar
L157:
.dbline 296
inc R20
L159:
.dbline 296
; for(i=0;i<12;i++)putchar(i);//配置成功则返回0,1,2,3,...11
cpi R20,12
brlo L156
.dbline 297
; }
L142:
.dbline 298
; usart_number=0;
clr R2
sts _usart_number,R2
.dbline -2
.dbline 299
; }
L118:
xcall pop_gset1
xcall pop_lset
.dbline 0 ; func end
reti
.dbsym r i 20 c
.dbend
.dbfunc e usart_init _usart_init fV
.even
_usart_init::
.dbline -1
.dbline 302
; //##############################USART初始化程序###########################//
; void usart_init(void)
; {
.dbline 303
; UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);//允许发送和接收
ldi R24,152
out 0xa,R24
.dbline 304
; UBRRL=(fosc/16/(bps+1))%256;
ldi R24,17
out 0x9,R24
.dbline 305
; UBRRH=(fosc/16/(bps+1))/256;
clr R2
out 0x20,R2
.dbline 306
; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
ldi R24,134
out 0x20,R24
.dbline -2
.dbline 307
; }
L160:
.dbline 0 ; func end
ret
.dbend
.dbfunc e AVR_Initialize _AVR_Initialize fV
.even
_AVR_Initialize::
.dbline -1
.dbline 310
; //##############################系统初始化程序################################//
; void AVR_Initialize(void) //初始化
; {
.dbline 311
; DDRA=0xff; //
ldi R24,255
out 0x1a,R24
.dbline 312
; PORTA=0xff;
out 0x1b,R24
.dbline 313
; DDRB=0xff; //
out 0x17,R24
.dbline 314
; PORTB=0xff;
out 0x18,R24
.dbline 315
; DDRC=0xc3; //
ldi R24,195
out 0x14,R24
.dbline 316
; PORTC=0x00; //
clr R2
out 0x15,R2
.dbline 317
; DDRD=0xf0; //
ldi R24,240
out 0x11,R24
.dbline 318
; PORTD=0x7f;
ldi R24,127
out 0x12,R24
.dbline 320
;
; SPCR=0b01010000;
ldi R24,80
out 0xd,R24
.dbline 324
; //关中断(SPIE=0),使能SPI(SPE=1),MSB首先发送(DORD=0),选择微机为主机模式(MSTR=1)
; //空闲时SCK为低电平(CPOL=0),在SCK的上升沿采样(CPHA=0)ENC28J60要求SPI工作在模式0
; //SPR1=0和SPR0=0,SCK=fosc/4
; SPSR |=0x01;//SPI的速度加倍
sbi 0xe,0
.dbline 326
;
; MCUCR=0x0a;//设置外部中断的中断触发方式为下降沿触发
ldi R24,10
out 0x35,R24
.dbline 327
; GICR=0xc0; //通用中断控制寄存器设置,打开中断INT0和INT1
ldi R24,192
out 0x3b,R24
.dbline 328
; SREG=0x80; //开全局中断
ldi R24,128
out 0x3f,R24
.dbline -2
.dbline 329
; }
L161:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 332
; //##################################主程序####################################//
; void main()
; {delay(5);
.dbline 332
ldi R16,5
xcall _delay
.dbline 333
; AVR_Initialize(); //I/O口及中断初始化
xcall _AVR_Initialize
.dbline 334
; usart_init();
.dbline -2
.dbline 336
; //ENC28J60_Initialize();
; }
L162:
.dbline 0 ; func end
xjmp _usart_init
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -