📄 spi.lis
字号:
.module spi.c
.area text(rom, con, rel)
0000 .dbfile E:\avr_first\spi.c
0000 .dbfunc e spisend _spisend fV
0000 ; i -> R20
0000 ; data -> R16
.even
0000 _spisend::
0000 00D0 rcall push_gset1
0002 .dbline -1
0002 .dbline 26
0002 ; #include <iom48v.h>
0002 ; #include <macros.h>
0002 ;
0002 ; #define uint unsigned int
0002 ; #define ulong unsigned long
0002 ; #define uchar unsigned char
0002 ;
0002 ; #define clk PD0//AD_clk
0002 ; #define data_IO PD1//AD数据输入输出口
0002 ; #define cs PD2//AD片选
0002 ;
0002 ; #define IO_DDR DDD1//数据读入读出口
0002 ;
0002 ; #define IO_PIN PIND
0002 ;
0002 ; //#define clk_s PD3
0002 ; //#define ss_s PD4
0002 ; //#define data_s PD5
0002 ; //#define data_sPIN PIND5
0002 ; //#define data_sDDR DDD5
0002 ;
0002 ;
0002 ;
0002 ;
0002 ; void spisend(uchar data)//写入
0002 ; {
0002 .dbline 29
0002 ; uchar i;
0002 ; //IO_DDR=1;
0002 ; DDRD |= 0x02;
0002 519A sbi 0xa,1
0004 .dbline 31
0004 ; //clk=0;
0004 ; PORTD &= 0xfe;
0004 8BB1 in R24,0xb
0006 8E7F andi R24,254
0008 8BB9 out 0xb,R24
000A .dbline 32
000A ; for(i=8;i>0;i--)
000A 48E0 ldi R20,8
000C 10C0 rjmp L5
000E L2:
000E .dbline 33
000E ; {
000E .dbline 34
000E ; if ((data&0x01)==1)
000E 802F mov R24,R16
0010 8170 andi R24,1
0012 8130 cpi R24,1
0014 11F4 brne L6
0016 .dbline 35
0016 ; {
0016 .dbline 37
0016 ; //data_IO=1;
0016 ; PORTD |= 0x02;
0016 599A sbi 0xb,1
0018 .dbline 38
0018 ; }
0018 03C0 rjmp L7
001A L6:
001A .dbline 41
001A ; else
001A ; //data_IO=0;
001A ; PORTD &= 0xFD;
001A 8BB1 in R24,0xb
001C 8D7F andi R24,253
001E 8BB9 out 0xb,R24
0020 L7:
0020 .dbline 42
0020 0000 nop
0022 .dbline 44
0022 589A sbi 0xb,0
0024 .dbline 47
0024 8BB1 in R24,0xb
0026 8E7F andi R24,254
0028 8BB9 out 0xb,R24
002A .dbline 48
002A 0695 lsr R16
002C .dbline 49
002C L3:
002C .dbline 32
002C 4A95 dec R20
002E L5:
002E .dbline 32
002E 2224 clr R2
0030 2416 cp R2,R20
0032 68F3 brlo L2
0034 .dbline -2
0034 L1:
0034 00D0 rcall pop_gset1
0036 .dbline 0 ; func end
0036 0895 ret
0038 .dbsym r i 20 c
0038 .dbsym r data 16 c
0038 .dbend
0038 .dbfunc e spiread _spiread fc
0038 ; data -> R20
0038 ; temp -> R22
0038 ; i -> R10
.even
0038 _spiread::
0038 00D0 rcall push_gset3
003A .dbline -1
003A .dbline 53
003A ; _NOP();
003A ; //clk=1;
003A ; PORTD |= 0x01;
003A ; //_NOP();
003A ; //clk=0;
003A ; PORTD &= 0xfe;
003A ; data>>=1;//右移一位
003A ; }
003A ; }
003A ;
003A ; uchar spiread(void) //读取
003A ; {
003A .dbline 55
003A ; uchar i;
003A ; uchar data=0x00;
003A 4427 clr R20
003C .dbline 58
003C ; uchar temp;
003C ; //IO_DDR=0; //IO口作为输入,DDR要写0
003C ; DDRD &= 0xfd;
003C 8AB1 in R24,0xa
003E 8D7F andi R24,253
0040 8AB9 out 0xa,R24
0042 .dbline 61
0042 ; //ss_r=0;
0042 ; //clk=0;
0042 ; PORTD &= 0xfe;
0042 8BB1 in R24,0xb
0044 8E7F andi R24,254
0046 8BB9 out 0xb,R24
0048 .dbline 62
0048 ; for(i=0;i<8;i++)
0048 AA24 clr R10
004A 0CC0 rjmp L12
004C L9:
004C .dbline 63
004C ; {
004C .dbline 65
004C ; //clk=1;
004C ; PORTD |= 0x01;
004C 589A sbi 0xb,0
004E .dbline 67
004E ; //clk=0;
004E ; PORTD &= 0xfe;
004E 8BB1 in R24,0xb
0050 8E7F andi R24,254
0052 8BB9 out 0xb,R24
0054 .dbline 68
0054 ; temp=IO_PIN;
0054 69B1 in R22,0x9
0056 .dbline 69
0056 ; if (temp&0x02) //下降沿采集数据,调换则会出错
0056 61FF sbrs R22,1
0058 04C0 rjmp L13
005A .dbline 70
005A ; data|=(0x01<<i);
005A 01E0 ldi R16,1
005C 1A2D mov R17,R10
005E 00D0 rcall lsl8
0060 402B or R20,R16
0062 L13:
0062 .dbline 71
0062 L10:
0062 .dbline 62
0062 A394 inc R10
0064 L12:
0064 .dbline 62
0064 8A2D mov R24,R10
0066 8830 cpi R24,8
0068 88F3 brlo L9
006A .dbline 73
006A ; }
006A ; //IO_DDR=1;
006A ; DDRD |= 0x02;
006A 519A sbi 0xa,1
006C .dbline 76
006C ; //ss_r=1; //读完数据后,SS拉高,同时时钟拉高一次,上升沿重新置数
006C ; // clk=1;
006C ; PORTD |= 0x01;
006C 589A sbi 0xb,0
006E .dbline 77
006E ; return(data);
006E 042F mov R16,R20
0070 .dbline -2
0070 L8:
0070 00D0 rcall pop_gset3
0072 .dbline 0 ; func end
0072 0895 ret
0074 .dbsym r data 20 c
0074 .dbsym r temp 22 c
0074 .dbsym r i 10 c
0074 .dbend
.area lit(rom, con, rel)
0000 L16:
0000 0000 .byte 0,0
0002 0000 .byte 0,0
0004 L17:
0004 0000 .byte 0,0
.area text(rom, con, rel)
0074 .dbfile E:\avr_first\spi.c
0074 .dbfunc e main _main fV
0074 ; data -> y+2
0074 ; instrution -> y+0
0074 ; j -> R20,R21
0074 ; i -> R22,R23
0074 ; spidata -> y+6
.even
0074 _main::
0074 2697 sbiw R28,6
0076 .dbline -1
0076 .dbline 81
0076 ; }
0076 ;
0076 ; void main(ulong spidata)
0076 ; {
0076 .dbline 83
0076 ; uint i,j;
0076 ; uchar data[4]={0,0,0,0};
0076 80E0 ldi R24,<L16
0078 90E0 ldi R25,>L16
007A FE01 movw R30,R28
007C 3296 adiw R30,2
007E 04E0 ldi R16,4
0080 10E0 ldi R17,0
0082 FA93 st -y,R31
0084 EA93 st -y,R30
0086 9A93 st -y,R25
0088 8A93 st -y,R24
008A 00D0 rcall asgncblk
008C .dbline 84
008C ; uchar instrution[2]={0,0};
008C 80E0 ldi R24,<L17
008E 90E0 ldi R25,>L17
0090 FE01 movw R30,R28
0092 02E0 ldi R16,2
0094 10E0 ldi R17,0
0096 FA93 st -y,R31
0098 EA93 st -y,R30
009A 9A93 st -y,R25
009C 8A93 st -y,R24
009E 00D0 rcall asgncblk
00A0 .dbline 97
00A0 ; /*PORTA="0x00"; //灯指示
00A0 ; DDRA="0XFF";
00A0 ;
00A0 ; PORTB="0x00";//0101 0000
00A0 ; DDRB="0x07";//0000 0111接口作为模拟SPI口输出接口要写1
00A0 ;
00A0 ; PORTC="0x00";
00A0 ; DDRC="0x80";
00A0 ;
00A0 ; DDRD="0xff";//0000 0001
00A0 ; PORTD="0x00";*///0100 1000
00A0 ; //cs = 0;
00A0 ; PORTD &= 0xfc;
00A0 8BB1 in R24,0xb
00A2 8C7F andi R24,252
00A4 8BB9 out 0xb,R24
00A6 .dbline 98
00A6 ; for(i=0;i<2;i++)
00A6 6627 clr R22
00A8 7727 clr R23
00AA 08C0 rjmp L21
00AC L18:
00AC .dbline 99
00AC .dbline 100
00AC CE01 movw R24,R28
00AE FB01 movw R30,R22
00B0 E80F add R30,R24
00B2 F91F adc R31,R25
00B4 0081 ldd R16,z+0
00B6 A4DF rcall _spisend
00B8 .dbline 101
00B8 L19:
00B8 .dbline 98
00B8 6F5F subi R22,255 ; offset = 1
00BA 7F4F sbci R23,255
00BC L21:
00BC .dbline 98
00BC 6230 cpi R22,2
00BE E0E0 ldi R30,0
00C0 7E07 cpc R23,R30
00C2 A0F3 brlo L18
00C4 .dbline 102
00C4 ; {
00C4 ; spisend(instrution[i]);
00C4 ; }
00C4 ; if(instrution[0]&0x8000)
00C4 2880 ldd R2,y+0
00C6 3324 clr R3
00C8 37FE sbrs R3,7
00CA 11C0 rjmp L22
00CC .dbline 103
00CC ; {
00CC .dbline 104
00CC ; for(j=0;j<4;j++)
00CC 4427 clr R20
00CE 5527 clr R21
00D0 09C0 rjmp L27
00D2 L24:
00D2 .dbline 105
00D2 .dbline 106
00D2 B2DF rcall _spiread
00D4 CE01 movw R24,R28
00D6 0296 adiw R24,2
00D8 FA01 movw R30,R20
00DA E80F add R30,R24
00DC F91F adc R31,R25
00DE 0083 std z+0,R16
00E0 .dbline 107
00E0 L25:
00E0 .dbline 104
00E0 4F5F subi R20,255 ; offset = 1
00E2 5F4F sbci R21,255
00E4 L27:
00E4 .dbline 104
00E4 4430 cpi R20,4
00E6 E0E0 ldi R30,0
00E8 5E07 cpc R21,R30
00EA 98F3 brlo L24
00EC .dbline 108
00EC ; {
00EC ; data[j]=spiread();
00EC ; }
00EC ; }
00EC 10C0 rjmp L23
00EE L22:
00EE .dbline 109
00EE ; else {
00EE .dbline 110
00EE ; for(j=0;j<4;j++)
00EE 4427 clr R20
00F0 5527 clr R21
00F2 09C0 rjmp L31
00F4 L28:
00F4 .dbline 111
00F4 .dbline 112
00F4 CE01 movw R24,R28
00F6 0296 adiw R24,2
00F8 FB01 movw R30,R22
00FA E80F add R30,R24
00FC F91F adc R31,R25
00FE 0081 ldd R16,z+0
0100 7FDF rcall _spisend
0102 .dbline 113
0102 L29:
0102 .dbline 110
0102 4F5F subi R20,255 ; offset = 1
0104 5F4F sbci R21,255
0106 L31:
0106 .dbline 110
0106 4430 cpi R20,4
0108 E0E0 ldi R30,0
010A 5E07 cpc R21,R30
010C 98F3 brlo L28
010E .dbline 114
010E ; {
010E ; spisend(data[i]);
010E ; }
010E ; }
010E L23:
010E .dbline 116
010E ; // cs = 1;
010E ; PORTD |= 0x40;
010E 5E9A sbi 0xb,6
0110 .dbline -2
0110 L15:
0110 2696 adiw R28,6
0112 .dbline 0 ; func end
0112 0895 ret
0114 .dbsym l data 2 A[4:4]c
0114 .dbsym l instrution 0 A[2:2]c
0114 .dbsym r j 20 i
0114 .dbsym r i 22 i
0114 .dbsym l spidata 6 l
0114 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -