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

📄 232toudp.lst

📁 网卡控制器ENC28J60的AVR单片机ATmega16程序源代码(c),实现232toUDP功能,有非常详细的注释.
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0635 B388      IN	R24,0x18
    0636 7E8F      ANDI	R24,0xEF
    0637 BB88      OUT	0x18,R24
(0017) }
    0638 9508      RET
_Reset_28J60:
  clear                --> R20
    0639 940E0768  CALL	push_gset1
(0018) //################################28J60复位#####################################
(0019) void Reset_28J60(void)
(0020) {uchar clear;
(0021)  Set_CS(0);          //使能SPI器件
    063B 2700      CLR	R16
    063C DFF4      RCALL	_Set_CS
(0022)  SPDR=0xFF;		     //复位指令
    063D EF8F      LDI	R24,0xFF
    063E B98F      OUT	0x0F,R24
(0023)  while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
    063F 9B77      SBIS	0x0E,7
    0640 CFFE      RJMP	0x063F
(0024)  clear=SPSR;
    0641 B14E      IN	R20,0x0E
(0025)  clear=SPDR;         //通过先读SPSR,紧接着访问SPDR来对SPIF清零
    0642 B14F      IN	R20,0x0F
(0026)  Set_CS(1);          //关SPI器件
    0643 E001      LDI	R16,1
    0644 DFEC      RCALL	_Set_CS
(0027) }
    0645 940E076B  CALL	pop_gset1
    0647 9508      RET
_Read_Control_Register:
  clear                --> R20
  address              --> R10
  EM                   --> R22
    0648 940E0783  CALL	push_gset3
    064A 2EA2      MOV	R10,R18
    064B 2F60      MOV	R22,R16
(0028) //#########################读28J60控制寄存器#################################
(0029) uchar Read_Control_Register(uchar EM,uchar address)
(0030) //EM=0表示读的是ETH,EM=1表示读的是MAC和MII控制寄存器
(0031) {uchar clear;
(0032)  Set_CS(0);          //使能SPI器件
    064C 2700      CLR	R16
    064D DFE3      RCALL	_Set_CS
(0033)  
(0034)  SPDR=address;		 //送地址,28J60中控制寄存器读操作前3位为0后5位为地址
    064E B8AF      OUT	0x0F,R10
(0035)  while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
    064F 9B77      SBIS	0x0E,7
    0650 CFFE      RJMP	0x064F
(0036)  clear=SPSR;
    0651 B14E      IN	R20,0x0E
(0037)  clear=SPDR;         //通过先读SPSR,紧接着访问SPDR来对SPIF清零
    0652 B14F      IN	R20,0x0F
(0038)  
(0039)  SPDR=0xc0;//随便送个数以起动时钟以接收从28J60控制寄存器里传来的数据,
    0653 EC80      LDI	R24,0xC0
    0654 B98F      OUT	0x0F,R24
(0040)            //这里因为28J60中没有用到0xc0指令固先用0xc0作为随便一个数
(0041)  while(!(SPSR&0x80));
    0655 9B77      SBIS	0x0E,7
    0656 CFFE      RJMP	0x0655
(0042)  clear=SPSR;
    0657 B14E      IN	R20,0x0E
(0043)  clear=SPDR;         //接收到控制寄存器里的数据
    0658 B14F      IN	R20,0x0F
(0044)  if(EM==1){
    0659 3061      CPI	R22,1
    065A F431      BNE	0x0661
(0045)  		   SPDR=0xc0;//随便送个数以起动时钟以接收从28J60控制寄存器里传来的数据
    065B EC80      LDI	R24,0xC0
    065C B98F      OUT	0x0F,R24
(0046)            while(!(SPSR&0x80));
    065D 9B77      SBIS	0x0E,7
    065E CFFE      RJMP	0x065D
(0047)  		   clear=SPSR;
    065F B14E      IN	R20,0x0E
(0048)  		   clear=SPDR;         //接收到控制寄存器里的数据
    0660 B14F      IN	R20,0x0F
(0049)  }//因为读MAC和MII寄存器时读出来的第一个字节是无效的,因此要读两次
(0050)  Set_CS(1);          //关SPI器件
    0661 E001      LDI	R16,1
    0662 DFCE      RCALL	_Set_CS
(0051)  return clear;
    0663 2F04      MOV	R16,R20
    0664 940E0762  CALL	pop_gset3
    0666 9508      RET
_Write_Control_Register:
  clear                --> R20
  date                 --> R22
  address              --> R20
    0667 940E077F  CALL	push_gset2
    0669 2F62      MOV	R22,R18
    066A 2F40      MOV	R20,R16
(0052) }
(0053) //###########################写28J60控制寄存器##################################
(0054) void Write_Control_Register(uchar address,uchar date)   
(0055) {uchar clear;
(0056)  address=address+0x40;//28J60中控制寄存器写操作前3位为010后5位为地址
    066B 5C40      SUBI	R20,0xC0
(0057)  Set_CS(0);           //使能SPI器件
    066C 2700      CLR	R16
    066D DFC3      RCALL	_Set_CS
(0058)  
(0059)  SPDR=address;		  //送地址,28J60中控制寄存器写操作前3位为010后5位为地址
    066E B94F      OUT	0x0F,R20
(0060)  while(!(SPSR&0x80)); //等待SPIF置位,等数据发送完毕
    066F 9B77      SBIS	0x0E,7
    0670 CFFE      RJMP	0x066F
(0061)  clear=SPSR;
    0671 B14E      IN	R20,0x0E
(0062)  clear=SPDR;          //通过先读SPSR,紧接着访问SPDR来对SPIF清零
    0672 B14F      IN	R20,0x0F
(0063)  
(0064)  SPDR=date;
    0673 B96F      OUT	0x0F,R22
(0065)  while(!(SPSR&0x80));
    0674 9B77      SBIS	0x0E,7
    0675 CFFE      RJMP	0x0674
(0066)  clear=SPSR;
    0676 B14E      IN	R20,0x0E
(0067)  clear=SPDR;         
    0677 B14F      IN	R20,0x0F
(0068)  
(0069)  Set_CS(1);          //关SPI器件
    0678 E001      LDI	R16,1
    0679 DFB7      RCALL	_Set_CS
(0070)  }
    067A 940E075F  CALL	pop_gset2
    067C 9508      RET
_Read_Buffer_Memory_order:
  clear                --> R20
    067D 940E0768  CALL	push_gset1
(0071) //#########################读缓冲存储器#################################
(0072) void Read_Buffer_Memory_order(void)//送读缓冲存储器命令,连续读时用到
(0073) {uchar clear;
(0074)  Set_CS(0);        //使能SPI器件
    067F 2700      CLR	R16
    0680 DFB0      RCALL	_Set_CS
(0075)  
(0076)  SPDR=0x3A;		 //送命令,28J60中读缓冲存储器操作前3位为001后5位为常量11010
    0681 E38A      LDI	R24,0x3A
    0682 B98F      OUT	0x0F,R24
(0077)  while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
    0683 9B77      SBIS	0x0E,7
    0684 CFFE      RJMP	0x0683
(0078)  clear=SPSR;
    0685 B14E      IN	R20,0x0E
(0079)  clear=SPDR;         //通过先读SPSR,紧接着访问SPDR来对SPIF清零
    0686 B14F      IN	R20,0x0F
(0080) }
    0687 940E076B  CALL	pop_gset1
    0689 9508      RET
(0081) uchar Read_Buffer_Memory_date(void)//收到读到的数据,连续读时用到此函数
(0082) {uchar clear;
(0083)  SPDR=0xc0;//随便送个数以起动时钟以接收从28J60控制寄存器里传来的数据
_Read_Buffer_Memory_date:
  clear                --> R16
    068A EC80      LDI	R24,0xC0
    068B B98F      OUT	0x0F,R24
(0084)  while(!(SPSR&0x80));
    068C 9B77      SBIS	0x0E,7
    068D CFFE      RJMP	0x068C
(0085)  clear=SPSR;
    068E B10E      IN	R16,0x0E
(0086)  clear=SPDR;         //接收到控制寄存器里的数据
    068F B10F      IN	R16,0x0F
(0087)  return clear;//返回读到的数据
    0690 9508      RET
(0088) }
(0089) void Read_Buffer_Memory_END(void)//读结束
(0090) {Set_CS(1);          //关SPI器件
_Read_Buffer_Memory_END:
    0691 E001      LDI	R16,1
(0091) }
    0692 CF9E      RJMP	_Set_CS
_Read_Buffer_Memory:
  clear                --> R20
    0693 940E0768  CALL	push_gset1
(0092) //#########################读缓冲存储器#################################
(0093) uchar Read_Buffer_Memory(void)//只读一次,地址是由ERDPT指向的存储器中的数据将从SO脚移出
(0094) {uchar clear;
(0095)  Set_CS(0);        //使能SPI器件
    0695 2700      CLR	R16
    0696 DF9A      RCALL	_Set_CS
(0096)  
(0097)  SPDR=0x3A;		 //送命令,28J60中读缓冲存储器操作前3位为001后5位为常量11010
    0697 E38A      LDI	R24,0x3A
    0698 B98F      OUT	0x0F,R24
(0098)  while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
    0699 9B77      SBIS	0x0E,7
    069A CFFE      RJMP	0x0699
(0099)  clear=SPSR;
    069B B14E      IN	R20,0x0E
(0100)  clear=SPDR;         //通过先读SPSR,紧接着访问SPDR来对SPIF清零
    069C B14F      IN	R20,0x0F
(0101)  
(0102)  SPDR=0xc0;//随便送个数以起动时钟以接收从28J60控制寄存器里传来的数据
    069D EC80      LDI	R24,0xC0
    069E B98F      OUT	0x0F,R24
(0103)  while(!(SPSR&0x80));
    069F 9B77      SBIS	0x0E,7
    06A0 CFFE      RJMP	0x069F
(0104)  clear=SPSR;
    06A1 B14E      IN	R20,0x0E
(0105)  clear=SPDR;         //接收到控制寄存器里的数据
    06A2 B14F      IN	R20,0x0F
(0106)  
(0107)  Set_CS(1);          //关SPI器件
    06A3 E001      LDI	R16,1
    06A4 DF8C      RCALL	_Set_CS
(0108)  return clear;
    06A5 2F04      MOV	R16,R20
    06A6 940E076B  CALL	pop_gset1
    06A8 9508      RET
_Write_Buffer_Memory_date:
  clear                --> R20
  date                 --> R16
    06A9 940E0768  CALL	push_gset1
(0109) }
(0110) //#########################写缓冲存储器#################################
(0111) void Write_Buffer_Memory_date(uchar date)//写入缓冲存储器数据
(0112) {uchar clear;
(0113)  SPDR=date;
    06AB B90F      OUT	0x0F,R16
(0114)  while(!(SPSR&0x80));
    06AC 9B77      SBIS	0x0E,7
    06AD CFFE      RJMP	0x06AC
(0115)  clear=SPSR;
    06AE B14E      IN	R20,0x0E
(0116)  clear=SPDR;        
    06AF B14F      IN	R20,0x0F
(0117) }
    06B0 940E076B  CALL	pop_gset1
    06B2 9508      RET
_Write_Buffer_Memory_once:
  clear                --> R20
  date                 --> R22
    06B3 940E077F  CALL	push_gset2
    06B5 2F60      MOV	R22,R16
(0118) void Write_Buffer_Memory_once(uchar date)//只写一次,地址是由EWRPT指向的存储器
(0119) {uchar clear;
(0120)  Set_CS(0);          //使能SPI器件
    06B6 2700      CLR	R16
    06B7 DF79      RCALL	_Set_CS
(0121)  
(0122)  SPDR=0x7A;		 //送命令,28J60中写缓冲存储器操作前3位为011后5位为常量11010
    06B8 E78A      LDI	R24,0x7A
    06B9 B98F      OUT	0x0F,R24
(0123)  while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
    06BA 9B77      SBIS	0x0E,7
    06BB CFFE      RJMP	0x06BA
(0124)  clear=SPSR;
    06BC B14E      IN	R20,0x0E
(0125)  clear=SPDR;         //通过先读SPSR,紧接着访问SPDR来对SPIF清零
    06BD B14F      IN	R20,0x0F
(0126)  
(0127)  SPDR=date;
    06BE B96F      OUT	0x0F,R22
(0128)  while(!(SPSR&0x80));
    06BF 9B77      SBIS	0x0E,7
    06C0 CFFE      RJMP	0x06BF
(0129)  clear=SPSR;
    06C1 B14E      IN	R20,0x0E
(0130)  clear=SPDR;         
    06C2 B14F      IN	R20,0x0F
(0131)  
(0132)  Set_CS(1);          //关SPI器件
    06C3 E001      LDI	R16,1
    06C4 DF6C      RCALL	_Set_CS
(0133)  }
    06C5 940E075F  CALL	pop_gset2
    06C7 9508      RET
_Bit_Field_Set:
  clear                --> R20
  date                 --> R22
  Address              --> R20
    06C8 940E077F  CALL	push_gset2
    06CA 2F62      MOV	R22,R18
    06CB 2F40      MOV	R20,R16
(0134)  //#################################位域置1命令#################################
(0135) void Bit_Field_Set(uchar Address,uchar date)//指定地址的ETH控制寄存器的内容与date进行位逻辑或操作
(0136) {uchar clear;
(0137)  Address=Address+0x80;
    06CC 5840      SUBI	R20,0x80
(0138)  Set_CS(0);          //使能SPI器件
    06CD 2700      CLR	R16
    06CE DF62      RCALL	_Set_CS
(0139)  
(0140)  SPDR=Address;		 //送命令,28J60中位域置1命令前3位为100后5位为地址
    06CF B94F      OUT	0x0F,R20
(0141)  while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
    06D0 9B77      SBIS	0x0E,7
    06D1 CFFE      RJMP	0x06D0
(0142)  clear=SPSR;
    06D2 B14E      IN	R20,0x0E
(0143)  clear=SPDR;         //通过先读SPSR,紧接着访问SPDR来对SPIF清零
    06D3 B14F      IN	R20,0x0F
(0144)  
(0145)  SPDR=date;          //送数据
    06D4 B96F      OUT	0x0F,R22
(0146)  while(!(SPSR&0x80));
    06D5 9B77      SBIS	0x0E,7
    06D6 CFFE      RJMP	0x06D5
(0147)  clear=SPSR;
    06D7 B14E      IN	R20,0x0E
(0148)  clear=SPDR;         //接收到控制寄存器里的数据
    06D8 B14F      IN	R20,0x0F
(0149)  
(0150)  Set_CS(1);          //关SPI器件
    06D9 E001      LDI	R16,1
    06DA DF56      RCALL	_Set_CS
(0151) }
    06DB 940E075F  CALL	pop_gset2
    06DD 9508      RET
_Bit_Field_Clear:
  clear                --> R20
  date                 --> R22
  Address              --> R20
    06DE 940E077F  CALL	push_gset2
    06E0 2F62      MOV	R22,R18
    06E1 2F40      MOV	R20,R16
(0152) //#################################位域置清0命令#################################
(0153) void Bit_Field_Clear(uchar Address,uchar date)//指定地址的ETH控制寄存器的内容与date进行位逻辑非与操作
(0154) //将所提供数据取反,并接着与指定寄存器的内容进行D0位的逻辑与运算
(0155) {uchar clear;
(0156)  Address=Address+0xa0;
    06E2 5640      SUBI	R20,0x60
(0157)  Set_CS(0);          //使能SPI器件
    06E3 2700      CLR	R16
    06E4 DF4C      RCALL	_Set_CS
(0158)  
(0159)  SPDR=Address;		 //送命令,28J60中位域置1命令前3位为101后5位为地址
    06E5 B94F      OUT	0x0F,R20
(0160)  while(!(SPSR&0x80));/

⌨️ 快捷键说明

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