📄 enc28j60.lis
字号:
.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 + -