📄 04spi.lst
字号:
__start:
__text_start:
004B EFCF LDI R28,0xFF
004C E1D0 LDI R29,0x10
004D BFCD OUT 0x3D,R28
004E BFDE OUT 0x3E,R29
004F 51C0 SUBI R28,0x10
0050 40D0 SBCI R29,0
0051 EA0A LDI R16,0xAA
0052 8308 STD Y+0,R16
0053 2400 CLR R0
0054 E0EA LDI R30,0xA
0055 E0F1 LDI R31,1
0056 E011 LDI R17,1
0057 30EA CPI R30,0xA
0058 07F1 CPC R31,R17
0059 F011 BEQ 0x005C
005A 9201 ST R0,Z+
005B CFFB RJMP 0x0057
005C 8300 STD Z+0,R16
005D E8EC LDI R30,0x8C
005E E0F0 LDI R31,0
005F E0A0 LDI R26,0
0060 E0B1 LDI R27,1
0061 E010 LDI R17,0
0062 39E6 CPI R30,0x96
0063 07F1 CPC R31,R17
0064 F021 BEQ 0x0069
0065 95C8 LPM
0066 9631 ADIW R30,1
0067 920D ST R0,X+
0068 CFF9 RJMP 0x0062
0069 940E00A7 CALL _main
_exit:
006B CFFF RJMP _exit
_delay_ms:
a --> R20
b --> R22
i --> R16
006C 940E00C7 CALL push_gset2
FILE: E:\ICCAVR\project\AVRMEG~3\icc\004-SPI\main.c
(0001) /*
(0002) 实验四:
(0003) SPI接口实险,LED数据管显示。
(0004) 1、程序通过SPI接口输出数据到HC595芯片驱动LED数据管简单显示。
(0005) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0006) 3、进行此实验请插上JP1的所有8个短路块,JP6(SPI_EN)短路块。
(0007) 4、此实验主要教大家如何使用SPI接口,让大家学会如何将SPI口设置为主机输出接口。
(0008)
(0009) AVR mega128学习板
(0010) www.iccavr.com 阿发
(0011) 0:45 2007-10-10
(0012) */
(0013)
(0014) #include "iom128v.h"
(0015)
(0016) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};/*数码管显示码表*/
(0017)
(0018) /*延时函数*/
(0019) void delay_ms(unsigned char i) {
(0020)
(0021) unsigned char a, b;
(0022) for (a = 0; a < i; a++) {
006E 2744 CLR R20
006F C006 RJMP 0x0076
(0023) for (b = 1; b; b++);
0070 E061 LDI R22,1
0071 C001 RJMP 0x0073
0072 9563 INC R22
0073 2366 TST R22
0074 F7E9 BNE 0x0072
0075 9543 INC R20
0076 1740 CP R20,R16
0077 F3C0 BCS 0x0070
0078 940E00BE CALL pop_gset2
007A 9508 RET
(0024) }
(0025) }
(0026)
(0027) /*IO口初始化函数*/
(0028) void io_init(void) {
(0029)
(0030) DDRA = 0x00; /*方向输入*/
_io_init:
007B 2422 CLR R2
007C BA2A OUT 0x1A,R2
(0031) PORTA = 0xFF; /*打开上拉*/
007D EF8F LDI R24,0xFF
007E BB8B OUT 0x1B,R24
(0032) DDRB = 0xF0; /*设置高4位为输出,控制4位数码管*/
007F EF80 LDI R24,0xF0
0080 BB87 OUT 0x17,R24
(0033) PORTB = 0x0F; /*高4位输出低电平,点亮4位数码管*/
0081 E08F LDI R24,0xF
0082 BB88 OUT 0x18,R24
(0034) DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
0083 BA24 OUT 0x14,R2
(0035) PORTC = 0xFF;
0084 EF8F LDI R24,0xFF
0085 BB85 OUT 0x15,R24
(0036) DDRD = 0x00;
0086 BA21 OUT 0x11,R2
(0037) PORTD = 0xFF;
0087 BB82 OUT 0x12,R24
(0038) DDRE = 0x00;
0088 B822 OUT 0x02,R2
(0039) PORTE = 0xFF;
0089 B983 OUT 0x03,R24
(0040) DDRF = 0x00;
008A 92200061 STS 0x61,R2
(0041) PORTF = 0xFF;
008C 93800062 STS 0x62,R24
(0042) DDRG = 0x00;
008E 92200064 STS 0x64,R2
(0043) PORTG = 0xFF;
0090 93800065 STS 0x65,R24
0092 9508 RET
(0044) }
(0045)
(0046) /*SPI接口初始化*/
(0047) void SPI_MasterInit(void) {
(0048)
(0049) DDRB |= (1<<PB0) | (1<<PB1) | (1<<PB2); /* 设置PB0、SCK、MOSI为输出,其他为输入 */
_SPI_MasterInit:
0093 B387 IN R24,0x17
0094 6087 ORI R24,7
0095 BB87 OUT 0x17,R24
(0050) SPCR = (1<<SPE) | (1<<MSTR)
0096 E583 LDI R24,0x53
0097 B98D OUT 0x0D,R24
0098 9508 RET
(0051) | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,设置时钟速率为fck/128 */
(0052) }
(0053)
(0054) /*SPI数据发送*/
(0055) void SPI_MasterTransmit(unsigned char i) {
(0056)
(0057) SPDR = i; /* 启动数据传输 */
_SPI_MasterTransmit:
i --> R16
0099 B90F OUT 0x0F,R16
(0058) while (!(SPSR & (1<<SPIF))); /* 等待传输结束 */
009A 9B77 SBIS 0x0E,7
009B CFFE RJMP 0x009A
009C 9508 RET
_SPI_595_Out:
i --> R20
009D 940E00C9 CALL push_gset1
009F 2F40 MOV R20,R16
(0059) }
(0060)
(0061) /*595数据输出*/
(0062) void SPI_595_Out(unsigned char i) {
(0063) PORTB &= ~(1 << PB0); /*准备锁存*/
00A0 98C0 CBI 0x18,0
(0064) SPI_MasterTransmit(i);
00A1 2F04 MOV R16,R20
00A2 DFF6 RCALL _SPI_MasterTransmit
(0065) PORTB |= (1 << PB0); /*锁存数据*/
00A3 9AC0 SBI 0x18,0
00A4 940E00CC CALL pop_gset1
00A6 9508 RET
(0066) }
(0067)
(0068) void main(void) {
(0069)
(0070) unsigned char i = 0;
_main:
i --> R20
00A7 2744 CLR R20
(0071)
(0072) io_init();
00A8 DFD2 RCALL _io_init
(0073) SPI_MasterInit();
00A9 DFE9 RCALL _SPI_MasterInit
00AA C011 RJMP 0x00BC
(0074) while (1) {
(0075) i ++;
00AB 9543 INC R20
(0076) if (i > 9) {
00AC E089 LDI R24,0x9
00AD 1784 CP R24,R20
00AE F408 BCC 0x00B0
(0077) i = 0;
00AF 2744 CLR R20
(0078) }
(0079) delay_ms(250);
00B0 EF0A LDI R16,0xFA
00B1 DFBA RCALL _delay_ms
(0080) delay_ms(250);
00B2 EF0A LDI R16,0xFA
00B3 DFB8 RCALL _delay_ms
(0081) SPI_595_Out(disp[i]);
FILE: <library>
00B4 E080 LDI R24,0
00B5 E091 LDI R25,1
00B6 2FE4 MOV R30,R20
00B7 27FF CLR R31
00B8 0FE8 ADD R30,R24
00B9 1FF9 ADC R31,R25
00BA 8100 LDD R16,Z+0
00BB DFE1 RCALL _SPI_595_Out
00BC CFEE RJMP 0x00AB
00BD 9508 RET
pop_gset2:
00BE E0E2 LDI R30,2
00BF 940C00CD JMP pop
push_gset5:
00C1 92FA ST R15,-Y
00C2 92EA ST R14,-Y
push_gset4:
00C3 92DA ST R13,-Y
00C4 92CA ST R12,-Y
push_gset3:
00C5 92BA ST R11,-Y
00C6 92AA ST R10,-Y
push_gset2:
00C7 937A ST R23,-Y
00C8 936A ST R22,-Y
push_gset1:
00C9 935A ST R21,-Y
00CA 934A ST R20,-Y
00CB 9508 RET
pop_gset1:
00CC E0E1 LDI R30,1
pop:
00CD 9149 LD R20,Y+
00CE 9159 LD R21,Y+
00CF FDE0 SBRC R30,0
00D0 9508 RET
00D1 9169 LD R22,Y+
00D2 9179 LD R23,Y+
00D3 FDE1 SBRC R30,1
00D4 9508 RET
00D5 90A9 LD R10,Y+
00D6 90B9 LD R11,Y+
00D7 FDE2 SBRC R30,2
00D8 9508 RET
00D9 90C9 LD R12,Y+
00DA 90D9 LD R13,Y+
00DB FDE3 SBRC R30,3
00DC 9508 RET
00DD 90E9 LD R14,Y+
00DE 90F9 LD R15,Y+
00DF 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -