📄 spi.lst
字号:
__start:
__text_start:
0018 E5CF LDI R28,0x5F
0019 E0D2 LDI R29,2
001A BFCD OUT 0x3D,R28
001B BFDE OUT 0x3E,R29
001C 51C0 SUBI R28,0x10
001D 40D0 SBCI R29,0
001E EA0A LDI R16,0xAA
001F 8308 STD Y+0,R16
0020 2400 CLR R0
0021 E6EE LDI R30,0x6E
0022 E0F0 LDI R31,0
0023 E010 LDI R17,0
0024 36EE CPI R30,0x6E
0025 07F1 CPC R31,R17
0026 F011 BEQ 0x0029
0027 9201 ST R0,Z+
0028 CFFB RJMP 0x0024
0029 8300 STD Z+0,R16
002A E2E2 LDI R30,0x22
002B E0F0 LDI R31,0
002C E6A0 LDI R26,0x60
002D E0B0 LDI R27,0
002E E010 LDI R17,0
002F 33E0 CPI R30,0x30
0030 07F1 CPC R31,R17
0031 F021 BEQ 0x0036
0032 95C8 LPM
0033 9631 ADIW R30,1
0034 920D ST R0,X+
0035 CFF9 RJMP 0x002F
0036 D086 RCALL _main
_exit:
0037 CFFF RJMP _exit
_DelayMs:
j --> R20
i --> R16
0038 D0C2 RCALL push_gset1
FILE: J:\AVRpractice\BOOK\SPI\SPI.C
(0001) #include<io8535v.h>
(0002) #include<macros.h>
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005)
(0006) uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
(0007) uchar Data[4]={0,0,0,0};
(0008)
(0009) void DelayMs(uint i)
(0010) {uchar j;
(0011) for(;i!=0;i--)
0039 C007 RJMP 0x0041
(0012) {for(j=2000;j!=0;j--) {;}}
003A ED40 LDI R20,0xD0
003B C001 RJMP 0x003D
003C 954A DEC R20
003D 2344 TST R20
003E F7E9 BNE 0x003C
003F 5001 SUBI R16,1
0040 4010 SBCI R17,0
0041 3000 CPI R16,0
0042 0701 CPC R16,R17
0043 F7B1 BNE 0x003A
(0013) }
0044 D0B9 RCALL pop_gset1
0045 9508 RET
_Display:
sel --> R20
i --> R22
p --> R10
0046 D0CE RCALL push_gset3
0047 2EA0 MOV R10,R16
0048 2EB1 MOV R11,R17
(0014)
(0015) void Display(uchar *p)
(0016) {uchar i,sel=0x01;
0049 E041 LDI R20,1
(0017) for(i=0;i<4;i++)
004A 2766 CLR R22
004B C017 RJMP 0x0063
(0018) {PORTA=sel;
004C BB4B OUT 0x1B,R20
(0019) PORTC=0xff-Table[p[i]];
004D 2FE6 MOV R30,R22
004E 27FF CLR R31
004F 0DEA ADD R30,R10
0050 1DFB ADC R31,R11
0051 81E0 LDD R30,Z+0
0052 27FF CLR R31
0053 E680 LDI R24,0x60
0054 E090 LDI R25,0
0055 0FE8 ADD R30,R24
0056 1FF9 ADC R31,R25
0057 8020 LDD R2,Z+0
0058 2433 CLR R3
0059 EF8F LDI R24,0xFF
005A E090 LDI R25,0
005B 1982 SUB R24,R2
005C 0993 SBC R25,R3
005D BB85 OUT 0x15,R24
(0020) DelayMs(10);
005E E00A LDI R16,0xA
005F E010 LDI R17,0
0060 DFD7 RCALL _DelayMs
(0021) sel=sel<<1;
0061 0F44 LSL R20
0062 9563 INC R22
0063 3064 CPI R22,4
0064 F338 BCS 0x004C
(0022) }
(0023) }
0065 D093 RCALL pop_gset3
0066 9508 RET
(0024)
(0025) void DelayNOP(uchar i)
(0026) {for(;i!=0;i--)
_DelayNOP:
i --> R16
0067 C002 RJMP 0x006A
(0027) { NOP();}
0068 0000 NOP
0069 950A DEC R16
006A 2300 TST R16
006B F7E1 BNE 0x0068
(0028) }
006C 9508 RET
_Convert:
i --> R22
p --> R20
006D D0A4 RCALL push_gset2
006E 2F62 MOV R22,R18
006F 2F40 MOV R20,R16
0070 2F51 MOV R21,R17
(0029)
(0030) void Convert(uchar *p,uchar i)
(0031) {p[0]=0;
0071 2422 CLR R2
0072 2FE4 MOV R30,R20
0073 2FF5 MOV R31,R21
0074 8220 STD Z+0,R2
(0032) p[1]=i/100;
0075 E614 LDI R17,0x64
0076 2F06 MOV R16,R22
0077 D069 RCALL div8u
0078 2FE4 MOV R30,R20
0079 2FF5 MOV R31,R21
007A 8301 STD Z+1,R16
(0033) p[2]=(i-p[1]*100)/10;
007B 2FE4 MOV R30,R20
007C 2FF5 MOV R31,R21
007D 8111 LDD R17,Z+1
007E E604 LDI R16,0x64
007F D098 RCALL mpy8s
0080 2E20 MOV R2,R16
0081 2F06 MOV R16,R22
0082 1902 SUB R16,R2
0083 E01A LDI R17,0xA
0084 D05C RCALL div8u
0085 2FE4 MOV R30,R20
0086 2FF5 MOV R31,R21
0087 8302 STD Z+2,R16
(0034) p[3]=i-p[1]*100-p[2]*10;
0088 2FE4 MOV R30,R20
0089 2FF5 MOV R31,R21
008A 8111 LDD R17,Z+1
008B E604 LDI R16,0x64
008C D08B RCALL mpy8s
008D 2E26 MOV R2,R22
008E 1A20 SUB R2,R16
008F 2FE4 MOV R30,R20
0090 2FF5 MOV R31,R21
0091 8112 LDD R17,Z+2
0092 E00A LDI R16,0xA
0093 D084 RCALL mpy8s
0094 1A20 SUB R2,R16
0095 2FE4 MOV R30,R20
0096 2FF5 MOV R31,R21
0097 8223 STD Z+3,R2
(0035) }
0098 D05E RCALL pop_gset2
0099 9508 RET
_Write_Byte:
clear --> R20
Data --> R18
Address --> R16
009A D060 RCALL push_gset1
(0036)
(0037) void Write_Byte(uchar Address,uchar Data)
(0038) {uchar clear;
(0039) PORTB=PORTB|0x10; //使能SPI器件
009B 9AC4 SBI 0x18,4
(0040) SPDR=Address;
009C B90F OUT 0x0F,R16
(0041) while(!(SPSR&0x80)) {;}
009D 9B77 SBIS 0x0E,7
009E CFFE RJMP 0x009D
(0042) clear=SPSR;
009F B14E IN R20,0x0E
(0043) clear=SPDR;
00A0 B14F IN R20,0x0F
(0044) SPDR=Data;
00A1 B92F OUT 0x0F,R18
(0045) while(!(SPSR&0x80)) {;}
00A2 9B77 SBIS 0x0E,7
00A3 CFFE RJMP 0x00A2
(0046) clear=SPSR;
00A4 B14E IN R20,0x0E
(0047) clear=SPDR;
00A5 B14F IN R20,0x0F
(0048) PORTB=PORTB&0xef;
00A6 B388 IN R24,0x18
00A7 7E8F ANDI R24,0xEF
00A8 BB88 OUT 0x18,R24
(0049) }
00A9 D054 RCALL pop_gset1
00AA 9508 RET
_Read_Byte:
Data --> R20
clear --> R22
Address --> R16
00AB D066 RCALL push_gset2
(0050)
(0051) uchar Read_Byte(uchar Address)
(0052) {uchar clear;
(0053) uchar Data;
(0054) PORTB=PORTB|0x10;
00AC 9AC4 SBI 0x18,4
(0055) SPDR=Address;
00AD B90F OUT 0x0F,R16
(0056) while(!(SPSR&0x80)) {;}
00AE 9B77 SBIS 0x0E,7
00AF CFFE RJMP 0x00AE
(0057) clear=SPSR;
00B0 B16E IN R22,0x0E
(0058) clear=SPDR;
00B1 B16F IN R22,0x0F
(0059) SPDR=Address;//发空数据
00B2 B90F OUT 0x0F,R16
(0060) while(!(SPSR&0x80)) {;}
00B3 9B77 SBIS 0x0E,7
00B4 CFFE RJMP 0x00B3
(0061) clear=SPSR;
00B5 B16E IN R22,0x0E
(0062) Data=SPDR;
00B6 B14F IN R20,0x0F
(0063) PORTB=PORTB&0xef;
00B7 B388 IN R24,0x18
00B8 7E8F ANDI R24,0xEF
00B9 BB88 OUT 0x18,R24
(0064) return(Data);
00BA 2F04 MOV R16,R20
00BB D03B RCALL pop_gset2
00BC 9508 RET
(0065) }
(0066)
(0067) void main(void)
(0068) {uchar value;
(0069) DDRA=0xff;
_main:
value --> R20
00BD EF8F LDI R24,0xFF
00BE BB8A OUT 0x1A,R24
(0070) DDRC=0xff;
00BF BB84 OUT 0x14,R24
(0071) DDRB=0xbf;
00C0 EB8F LDI R24,0xBF
00C1 BB87 OUT 0x17,R24
(0072) PORTA=0xff;
00C2 EF8F LDI R24,0xFF
00C3 BB8B OUT 0x1B,R24
(0073) PORTC=0x00;
00C4 2422 CLR R2
00C5 BA25 OUT 0x15,R2
(0074) DelayMs(3000);
00C6 EB08 LDI R16,0xB8
00C7 E01B LDI R17,0xB
00C8 DF6F RCALL _DelayMs
(0075) PORTC=0xff;
00C9 EF8F LDI R24,0xFF
00CA BB85 OUT 0x15,R24
(0076) SPCR=0x5c;//0101 1100
00CB E58C LDI R24,0x5C
00CC B98D OUT 0x0D,R24
(0077) Write_Byte(0x80,0xf0);//8位,自由转换模式
00CD EF20 LDI R18,0xF0
00CE E800 LDI R16,0x80
00CF DFCA RCALL _Write_Byte
00D0 C00C RJMP 0x00DD
(0078) while(1)
(0079) {value=Read_Byte(0x01);
00D1 E001 LDI R16,1
00D2 DFD8 RCALL _Read_Byte
(0080) value=Read_Byte(0x02);
00D3 E002 LDI R16,2
00D4 DFD6 RCALL _Read_Byte
00D5 2F40 MOV R20,R16
(0081) Convert(Data,value);
00D6 2F24 MOV R18,R20
00D7 E60A LDI R16,0x6A
00D8 E010 LDI R17,0
00D9 DF93 RCALL _Convert
(0082) Display(Data);}
00DA E60A LDI R16,0x6A
00DB E010 LDI R17,0
00DC DF69 RCALL _Display
00DD CFF3 RJMP 0x00D1
(0083) }
FILE: <library>
00DE 9508 RET
mod8u:
00DF 9468 BSET 6
00E0 C001 RJMP xdiv8u
div8u:
00E1 94E8 BCLR 6
xdiv8u:
00E2 932A ST R18,-Y
00E3 92FA ST R15,-Y
00E4 92EA ST R14,-Y
00E5 24FF CLR R15
00E6 24EE CLR R14
00E7 E120 LDI R18,0x10
00E8 0F00 LSL R16
00E9 1CFF ROL R15
00EA 1CEE ROL R14
00EB 16E1 CP R14,R17
00EC F010 BCS 0x00EF
00ED 1AE1 SUB R14,R17
00EE 9503 INC R16
00EF 952A DEC R18
00F0 F7B9 BNE 0x00E8
00F1 F40E BRTC 0x00F3
00F2 2D0E MOV R16,R14
00F3 90E9 LD R14,Y+
00F4 90F9 LD R15,Y+
00F5 9129 LD R18,Y+
00F6 9508 RET
pop_gset2:
00F7 E0E2 LDI R30,2
00F8 C006 RJMP pop
pop_gset3:
00F9 E0E4 LDI R30,4
00FA C004 RJMP pop
push_gset1:
00FB 935A ST R21,-Y
00FC 934A ST R20,-Y
00FD 9508 RET
pop_gset1:
00FE E0E1 LDI R30,1
pop:
00FF 9149 LD R20,Y+
0100 9159 LD R21,Y+
0101 FDE0 SBRC R30,0
0102 9508 RET
0103 9169 LD R22,Y+
0104 9179 LD R23,Y+
0105 FDE1 SBRC R30,1
0106 9508 RET
0107 90A9 LD R10,Y+
0108 90B9 LD R11,Y+
0109 FDE2 SBRC R30,2
010A 9508 RET
010B 90C9 LD R12,Y+
010C 90D9 LD R13,Y+
010D FDE3 SBRC R30,3
010E 9508 RET
010F 90E9 LD R14,Y+
0110 90F9 LD R15,Y+
0111 9508 RET
push_gset2:
0112 937A ST R23,-Y
0113 936A ST R22,-Y
0114 CFE6 RJMP push_gset1
push_gset3:
0115 92BA ST R11,-Y
0116 92AA ST R10,-Y
0117 CFFA RJMP push_gset2
mpy8s:
0118 920A ST R0,-Y
0119 2400 CLR R0
011A 2300 TST R16
011B F029 BEQ 0x0121
011C 9506 LSR R16
011D F408 BCC 0x011F
011E 0E01 ADD R0,R17
011F 0F11 LSL R17
0120 CFF9 RJMP 0x011A
0121 2D00 MOV R16,R0
0122 9009 LD R0,Y+
0123 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -