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

📄 enc28j60.lis

📁 网卡控制器ENC28J60的AVR单片机ATmega16程序源代码(c),实现232toUDP功能,有非常详细的注释.
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module ENC28j60.c
                        .area data(ram, con, rel)
 0000           _PHY_H::
 0000                   .blkb 1
                        .area idata
 0000 00                .byte 0
                        .area data(ram, con, rel)
 0001                   .dbfile H:\小玩意制作\232转UDP\程序\ENC28j60.c
 0001                   .dbsym e PHY_H _PHY_H c
 0001           _PHY_L::
 0001                   .blkb 1
                        .area idata
 0001 00                .byte 0
                        .area data(ram, con, rel)
 0002                   .dbfile H:\小玩意制作\232转UDP\程序\ENC28j60.c
 0002                   .dbsym e PHY_L _PHY_L c
                        .area text(rom, con, rel)
 0000                   .dbfile H:\小玩意制作\232转UDP\程序\ENC28j60.c
 0000                   .dbfunc e delay _delay fV
 0000           ;              i -> R20,R21
 0000           ;              k -> R16
                        .even
 0000           _delay::
 0000 0E940000          xcall push_gset1
 0004                   .dbline -1
 0004                   .dbline 6
 0004           ; #include "ENC28j60.h" 
 0004           ; uchar PHY_H=0;
 0004           ; uchar PHY_L=0;
 0004           ; //################################延时程序################################//
 0004           ; void delay(uchar k)//
 0004           ; {uint i=0;
 0004                   .dbline 6
 0004 4427              clr R20
 0006 5527              clr R21
 0008 09C0              xjmp L3
 000A           L2:
 000A                   .dbline 7
 000A                   .dbline 7
 000A 4427              clr R20
 000C 5527              clr R21
 000E 02C0              xjmp L8
 0010           L5:
 0010                   .dbline 7
 0010           L6:
 0010                   .dbline 7
 0010 4F5F              subi R20,255  ; offset = 1
 0012 5F4F              sbci R21,255
 0014           L8:
 0014                   .dbline 7
 0014 4034              cpi R20,64
 0016 EFE1              ldi R30,31
 0018 5E07              cpc R21,R30
 001A D0F3              brlo L5
 001C                   .dbline 7
 001C           L3:
 001C                   .dbline 7
 001C           ;  while(k--){for(i=0;i<8000;i++);}
 001C 202E              mov R2,R16
 001E 3324              clr R3
 0020 0150              subi R16,1
 0022 2220              tst R2
 0024 91F7              brne L2
 0026                   .dbline -2
 0026                   .dbline 8
 0026           ;  }
 0026           L1:
 0026 0E940000          xcall pop_gset1
 002A                   .dbline 0 ; func end
 002A 0895              ret
 002C                   .dbsym r i 20 i
 002C                   .dbsym r k 16 c
 002C                   .dbend
 002C                   .dbfunc e putchar _putchar fV
 002C           ;              c -> R16
                        .even
 002C           _putchar::
 002C                   .dbline -1
 002C                   .dbline 11
 002C           L10:
 002C                   .dbline 11
 002C           L11:
 002C                   .dbline 11
 002C           ; //##########################串行通信##########################//
 002C           ; void putchar(uchar c)
 002C           ; {while(!(UCSRA&(1<<UDRE)));//判断上次发送有没有完成
 002C 5D9B              sbis 0xb,5
 002E FECF              rjmp L10
 0030                   .dbline 12
 0030           ;  UDR=c;}
 0030 0CB9              out 0xc,R16
 0032                   .dbline -2
 0032                   .dbline 12
 0032           L9:
 0032                   .dbline 0 ; func end
 0032 0895              ret
 0034                   .dbsym r c 16 c
 0034                   .dbend
 0034                   .dbfunc e Set_CS _Set_CS fV
 0034           ;          level -> R16
                        .even
 0034           _Set_CS::
 0034                   .dbline -1
 0034                   .dbline 15
 0034           ; //##############################选通SPI器件###############################//
 0034           ; void Set_CS(uchar level)          //
 0034           ; {if(level)    PORTB |=0x10;        //
 0034                   .dbline 15
 0034 0023              tst R16
 0036 11F0              breq L14
 0038                   .dbline 15
 0038 C49A              sbi 0x18,4
 003A 03C0              xjmp L15
 003C           L14:
 003C                   .dbline 16
 003C 88B3              in R24,0x18
 003E 8F7E              andi R24,239
 0040 88BB              out 0x18,R24
 0042           L15:
 0042                   .dbline -2
 0042                   .dbline 17
 0042           ;  else         PORTB &=0xef;        //
 0042           ; }
 0042           L13:
 0042                   .dbline 0 ; func end
 0042 0895              ret
 0044                   .dbsym r level 16 c
 0044                   .dbend
 0044                   .dbfunc e Reset_28J60 _Reset_28J60 fV
 0044           ;          clear -> R20
                        .even
 0044           _Reset_28J60::
 0044 0E940000          xcall push_gset1
 0048                   .dbline -1
 0048                   .dbline 20
 0048           ; //################################28J60复位#####################################
 0048           ; void Reset_28J60(void)
 0048           ; {uchar clear;
 0048                   .dbline 21
 0048           ;  Set_CS(0);          //使能SPI器件
 0048 0027              clr R16
 004A F4DF              xcall _Set_CS
 004C                   .dbline 22
 004C           ;  SPDR=0xFF;                //复位指令
 004C 8FEF              ldi R24,255
 004E 8FB9              out 0xf,R24
 0050           L17:
 0050                   .dbline 23
 0050           L18:
 0050                   .dbline 23
 0050           ;  while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
 0050 779B              sbis 0xe,7
 0052 FECF              rjmp L17
 0054                   .dbline 24
 0054           ;  clear=SPSR;
 0054 4EB1              in R20,0xe
 0056                   .dbline 25
 0056           ;  clear=SPDR;         //通过先读SPSR,紧接着访问SPDR来对SPIF清零
 0056 4FB1              in R20,0xf
 0058                   .dbline 26
 0058           ;  Set_CS(1);          //关SPI器件
 0058 01E0              ldi R16,1
 005A ECDF              xcall _Set_CS
 005C                   .dbline -2
 005C                   .dbline 27
 005C           ; }
 005C           L16:
 005C 0E940000          xcall pop_gset1
 0060                   .dbline 0 ; func end
 0060 0895              ret
 0062                   .dbsym r clear 20 c
 0062                   .dbend
 0062                   .dbfunc e Read_Control_Register _Read_Control_Register fc
 0062           ;          clear -> R20
 0062           ;        address -> R10
 0062           ;             EM -> R22
                        .even
 0062           _Read_Control_Register::
 0062 0E940000          xcall push_gset3
 0066 A22E              mov R10,R18
 0068 602F              mov R22,R16
 006A                   .dbline -1
 006A                   .dbline 31
 006A           ; //#########################读28J60控制寄存器#################################
 006A           ; uchar Read_Control_Register(uchar EM,uchar address)
 006A           ; //EM=0表示读的是ETH,EM=1表示读的是MAC和MII控制寄存器
 006A           ; {uchar clear;
 006A                   .dbline 32
 006A           ;  Set_CS(0);          //使能SPI器件
 006A 0027              clr R16
 006C E3DF              xcall _Set_CS
 006E                   .dbline 34
 006E           ;  
 006E           ;  SPDR=address;                 //送地址,28J60中控制寄存器读操作前3位为0后5位为地址
 006E AFB8              out 0xf,R10
 0070           L21:
 0070                   .dbline 35
 0070           L22:
 0070                   .dbline 35
 0070           ;  while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
 0070 779B              sbis 0xe,7
 0072 FECF              rjmp L21
 0074                   .dbline 36
 0074           ;  clear=SPSR;
 0074 4EB1              in R20,0xe
 0076                   .dbline 37
 0076           ;  clear=SPDR;         //通过先读SPSR,紧接着访问SPDR来对SPIF清零
 0076 4FB1              in R20,0xf
 0078                   .dbline 39
 0078           ;  
 0078           ;  SPDR=0xc0;//随便送个数以起动时钟以接收从28J60控制寄存器里传来的数据,
 0078 80EC              ldi R24,192
 007A 8FB9              out 0xf,R24
 007C           L24:
 007C                   .dbline 41
 007C           L25:
 007C                   .dbline 41
 007C           ;            //这里因为28J60中没有用到0xc0指令固先用0xc0作为随便一个数
 007C           ;  while(!(SPSR&0x80));
 007C 779B              sbis 0xe,7
 007E FECF              rjmp L24
 0080                   .dbline 42
 0080           ;  clear=SPSR;
 0080 4EB1              in R20,0xe
 0082                   .dbline 43
 0082           ;  clear=SPDR;         //接收到控制寄存器里的数据
 0082 4FB1              in R20,0xf
 0084                   .dbline 44
 0084           ;  if(EM==1){
 0084 6130              cpi R22,1
 0086 31F4              brne L27
 0088                   .dbline 44
 0088                   .dbline 45
 0088           ;                  SPDR=0xc0;//随便送个数以起动时钟以接收从28J60控制寄存器里传来的数据
 0088 80EC              ldi R24,192
 008A 8FB9              out 0xf,R24
 008C           L29:
 008C                   .dbline 46
 008C           L30:
 008C                   .dbline 46
 008C           ;            while(!(SPSR&0x80));
 008C 779B              sbis 0xe,7
 008E FECF              rjmp L29
 0090                   .dbline 47
 0090           ;                  clear=SPSR;
 0090 4EB1              in R20,0xe
 0092                   .dbline 48
 0092           ;                  clear=SPDR;         //接收到控制寄存器里的数据
 0092 4FB1              in R20,0xf
 0094                   .dbline 49
 0094           ;  }//因为读MAC和MII寄存器时读出来的第一个字节是无效的,因此要读两次
 0094           L27:
 0094                   .dbline 50
 0094           ;  Set_CS(1);          //关SPI器件
 0094 01E0              ldi R16,1
 0096 CEDF              xcall _Set_CS
 0098                   .dbline 51
 0098           ;  return clear;
 0098 042F              mov R16,R20
 009A                   .dbline -2
 009A           L20:
 009A 0E940000          xcall pop_gset3
 009E                   .dbline 0 ; func end
 009E 0895              ret
 00A0                   .dbsym r clear 20 c
 00A0                   .dbsym r address 10 c
 00A0                   .dbsym r EM 22 c
 00A0                   .dbend
 00A0                   .dbfunc e Write_Control_Register _Write_Control_Register fV
 00A0           ;          clear -> R20
 00A0           ;           date -> R22
 00A0           ;        address -> R20
                        .even
 00A0           _Write_Control_Register::
 00A0 0E940000          xcall push_gset2
 00A4 622F              mov R22,R18
 00A6 402F              mov R20,R16
 00A8                   .dbline -1
 00A8                   .dbline 55
 00A8           ; }
 00A8           ; //###########################写28J60控制寄存器##################################
 00A8           ; void Write_Control_Register(uchar address,uchar date)   
 00A8           ; {uchar clear;
 00A8                   .dbline 56
 00A8           ;  address=address+0x40;//28J60中控制寄存器写操作前3位为010后5位为地址
 00A8 405C              subi R20,192    ; addi 64
 00AA                   .dbline 57
 00AA           ;  Set_CS(0);           //使能SPI器件
 00AA 0027              clr R16
 00AC C3DF              xcall _Set_CS
 00AE                   .dbline 59
 00AE           ;  
 00AE           ;  SPDR=address;                  //送地址,28J60中控制寄存器写操作前3位为010后5位为地址
 00AE 4FB9              out 0xf,R20
 00B0           L33:
 00B0                   .dbline 60
 00B0           L34:
 00B0                   .dbline 60
 00B0           ;  while(!(SPSR&0x80)); //等待SPIF置位,等数据发送完毕
 00B0 779B              sbis 0xe,7
 00B2 FECF              rjmp L33
 00B4                   .dbline 61
 00B4           ;  clear=SPSR;
 00B4 4EB1              in R20,0xe
 00B6                   .dbline 62
 00B6           ;  clear=SPDR;          //通过先读SPSR,紧接着访问SPDR来对SPIF清零
 00B6 4FB1              in R20,0xf
 00B8                   .dbline 64
 00B8           ;  
 00B8           ;  SPDR=date;
 00B8 6FB9              out 0xf,R22
 00BA           L36:
 00BA                   .dbline 65
 00BA           L37:
 00BA                   .dbline 65
 00BA           ;  while(!(SPSR&0x80));
 00BA 779B              sbis 0xe,7
 00BC FECF              rjmp L36
 00BE                   .dbline 66
 00BE           ;  clear=SPSR;
 00BE 4EB1              in R20,0xe

⌨️ 快捷键说明

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