📄 spi.lst
字号:
__text_start:
__start:
002F E5CF LDI R28,0x5F
0030 E0D4 LDI R29,4
0031 BFCD OUT 0x3D,R28
0032 BFDE OUT 0x3E,R29
0033 51C0 SUBI R28,0x10
0034 40D0 SBCI R29,0
0035 EA0A LDI R16,0xAA
0036 8308 STD Y+0,R16
0037 2400 CLR R0
0038 E6EA LDI R30,0x6A
0039 E0F0 LDI R31,0
003A E010 LDI R17,0
003B 36EA CPI R30,0x6A
003C 07F1 CPC R31,R17
003D F011 BEQ 0x0040
003E 9201 ST R0,Z+
003F CFFB RJMP 0x003B
0040 8300 STD Z+0,R16
0041 E5E4 LDI R30,0x54
0042 E0F0 LDI R31,0
0043 E6A0 LDI R26,0x60
0044 E0B0 LDI R27,0
0045 E010 LDI R17,0
0046 35EE CPI R30,0x5E
0047 07F1 CPC R31,R17
0048 F021 BEQ 0x004D
0049 95C8 LPM
004A 9631 ADIW R30,1
004B 920D ST R0,X+
004C CFF9 RJMP 0x0046
004D 940E007C CALL _main
_exit:
004F CFFF RJMP _exit
_delay_ms:
i --> R20
time --> R16
0050 940E00A0 CALL push_gset1
FILE: D:\AVR\我的程序\同步串口SPI实验\cfg.h
(0001) /*******************************
(0002) *程序名称:功能函数集
(0003) *设 计:萧联珠
(0004) *日 期:2007-11-20
(0005) ********************************/
(0006) #include <iom16v.h>
(0007)
(0008) /*延时子程序*/
(0009) void delay_ms(int time)
(0010) {
(0011) int i;
(0012) for(;time>0;time--)
0052 C00A RJMP 0x005D
(0013) for(i=0;i<1000;i++);
0053 2744 CLR R20
0054 2755 CLR R21
0055 5F4F SUBI R20,0xFF
0056 4F5F SBCI R21,0xFF
0057 3E48 CPI R20,0xE8
0058 E0E3 LDI R30,3
0059 075E CPC R21,R30
005A F3D4 BLT 0x0055
005B 5001 SUBI R16,1
005C 4010 SBCI R17,0
005D 2422 CLR R2
005E 2433 CLR R3
005F 1620 CP R2,R16
0060 0631 CPC R3,R17
0061 F38C BLT 0x0053
0062 940E00A3 CALL pop_gset1
0064 9508 RET
(0014) }
(0015)
(0016) /*端口初始化*/
(0017) void port_init()
(0018) {
(0019) DDRD|=(1<<DDD5); //配置PD5口为输出
_port_init:
0065 9A8D SBI 0x11,5
(0020) PORTD|=(1<<PD5); //PD5口的初始值为"1"
0066 9A95 SBI 0x12,5
0067 9508 RET
(0021) }
(0022)
(0023) /*SPI接口初始化*/
(0024) void SPI_MasterInit(void) {
(0025)
(0026) DDRB |= (1<<PB5) | (1<<PB7); /* 设置MOSI 和SCK 为输出,其他为输入 */
_SPI_MasterInit:
0068 B387 IN R24,0x17
0069 6A80 ORI R24,0xA0
006A BB87 OUT 0x17,R24
(0027) SPCR = (1<<SPE) | (1<<MSTR)
006B E583 LDI R24,0x53
006C B98D OUT 0x0D,R24
006D 9508 RET
(0028) | (1<<SPR1) | (1<<SPR0); /* 使能SPI主机模式,设置时钟速率为fck/128 */
(0029) }
(0030)
(0031) /*SPI数据发送*/
(0032) void SPI_MasterTransmit(unsigned char i)
(0033) {
(0034)
(0035) SPDR = i; /* 启动数据传输 */
_SPI_MasterTransmit:
i --> R16
006E B90F OUT 0x0F,R16
(0036) while (!(SPSR & (1<<SPIF))); /* 等待传输结束 */
006F 9B77 SBIS 0x0E,7
0070 CFFE RJMP 0x006F
0071 9508 RET
_SPI_595_Out:
i --> R20
0072 940E00A0 CALL push_gset1
0074 2F40 MOV R20,R16
(0037) }
(0038)
(0039) /*595数据输出*/
(0040) void SPI_595_Out(unsigned char i)
(0041) {
(0042) PORTB &= ~(1 << 4); /*准备锁存*/
0075 98C4 CBI 0x18,4
(0043) SPI_MasterTransmit(i);
0076 2F04 MOV R16,R20
0077 DFF6 RCALL _SPI_MasterTransmit
(0044) PORTB |= (1 << 4); /*锁存数据*/
0078 9AC4 SBI 0x18,4
0079 940E00A3 CALL pop_gset1
007B 9508 RET
FILE: D:\AVR\我的程序\同步串口SPI实验\main.c
(0001) /***********************************
(0002) *实验目的:熟悉SPI操作及数码管显示
(0003) *设 计:萧联珠
(0004) *日 期:2007-11-20
(0005) ************************************/
(0006) #include <iom16v.h>
(0007) #include "cfg.h"
(0008)
(0009) unsigned char disp[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
(0010)
(0011)
(0012) void main(void)
(0013) {
(0014)
(0015) unsigned char i = 0;
_main:
i --> R20
flag_num --> R20
007C 2744 CLR R20
(0016) unsigned int flag_num;
(0017)
(0018) DDRB = 0xFF; /*PB口设置为输出*/
007D EF8F LDI R24,0xFF
007E BB87 OUT 0x17,R24
(0019) PORTB = 0xF0; /*选通数码管*/
007F EF80 LDI R24,0xF0
0080 BB88 OUT 0x18,R24
(0020)
(0021) SPI_MasterInit();
0081 DFE6 RCALL _SPI_MasterInit
0082 C013 RJMP 0x0096
(0022)
(0023) while (1)
(0024) {
(0025) for(flag_num=0;flag_num<10;flag_num++)
0083 2744 CLR R20
0084 2755 CLR R21
0085 C00C RJMP 0x0092
(0026) {
(0027) SPI_595_Out(disp[flag_num]);
0086 E680 LDI R24,0x60
0087 E090 LDI R25,0
0088 01FA MOVW R30,R20
0089 0FE8 ADD R30,R24
008A 1FF9 ADC R31,R25
008B 8100 LDD R16,Z+0
008C DFE5 RCALL _SPI_595_Out
(0028) delay_ms(200);
FILE: <library>
008D EC08 LDI R16,0xC8
008E E010 LDI R17,0
008F DFC0 RCALL _delay_ms
0090 5F4F SUBI R20,0xFF
0091 4F5F SBCI R21,0xFF
0092 304A CPI R20,0xA
0093 E0E0 LDI R30,0
0094 075E CPC R21,R30
0095 F380 BCS 0x0086
0096 CFEC RJMP 0x0083
0097 9508 RET
push_gset5:
0098 92FA ST R15,-Y
0099 92EA ST R14,-Y
push_gset4:
009A 92DA ST R13,-Y
009B 92CA ST R12,-Y
push_gset3:
009C 92BA ST R11,-Y
009D 92AA ST R10,-Y
push_gset2:
009E 937A ST R23,-Y
009F 936A ST R22,-Y
push_gset1:
00A0 935A ST R21,-Y
00A1 934A ST R20,-Y
00A2 9508 RET
pop_gset1:
00A3 E0E1 LDI R30,1
pop:
00A4 9149 LD R20,Y+
00A5 9159 LD R21,Y+
00A6 FDE0 SBRC R30,0
00A7 9508 RET
00A8 9169 LD R22,Y+
00A9 9179 LD R23,Y+
00AA FDE1 SBRC R30,1
00AB 9508 RET
00AC 90A9 LD R10,Y+
00AD 90B9 LD R11,Y+
00AE FDE2 SBRC R30,2
00AF 9508 RET
00B0 90C9 LD R12,Y+
00B1 90D9 LD R13,Y+
00B2 FDE3 SBRC R30,3
00B3 9508 RET
00B4 90E9 LD R14,Y+
00B5 90F9 LD R15,Y+
00B6 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -