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

📄 main.s

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