📄 afa-004i.lst
字号:
__start:
__text_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 940E0073 CALL _main
_exit:
004F CFFF RJMP _exit
_delay_ms:
a --> R20
b --> R22
i --> R16
0050 940E009E CALL push_gset2
FILE: E:\ICCAVR\project\AVRMEG~2\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)
(0008) AVR mega16学习板
(0009) www.iccavr.com
(0010) 2006-01-10
(0011) */
(0012)
(0013) #include "iom16v.h"
(0014)
(0015) unsigned char disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
(0016)
(0017) /*延时函数*/
(0018) void delay_ms(unsigned char i) {
(0019)
(0020) unsigned char a, b;
(0021) for (a = 1; a < i; a++) {
0052 E041 LDI R20,1
0053 C006 RJMP 0x005A
(0022) for (b = 1; b; b++) {
0054 E061 LDI R22,1
0055 C001 RJMP 0x0057
0056 9563 INC R22
0057 2366 TST R22
0058 F7E9 BNE 0x0056
0059 9543 INC R20
005A 1740 CP R20,R16
005B F3C0 BCS 0x0054
005C 940E0095 CALL pop_gset2
005E 9508 RET
(0023) ;
(0024) }
(0025) }
(0026) }
(0027)
(0028) /*SPI接口初始化*/
(0029) void SPI_MasterInit(void) {
(0030)
(0031) DDRB |= (1<<PB5) | (1<<PB7); /* 设置MOSI 和SCK 为输出,其他为输入 */
_SPI_MasterInit:
005F B387 IN R24,0x17
0060 6A80 ORI R24,0xA0
0061 BB87 OUT 0x17,R24
(0032) SPCR = (1<<SPE) | (1<<MSTR)
0062 E583 LDI R24,0x53
0063 B98D OUT 0x0D,R24
0064 9508 RET
(0033) | (1<<SPR1) | (1<<SPR0); /* 使能SPI 主机模式,设置时钟速率为fck/128 */
(0034) }
(0035)
(0036) /*SPI数据发送*/
(0037) void SPI_MasterTransmit(unsigned char i) {
(0038)
(0039) SPDR = i; /* 启动数据传输 */
_SPI_MasterTransmit:
i --> R16
0065 B90F OUT 0x0F,R16
(0040) while (!(SPSR & (1<<SPIF))) { /* 等待传输结束 */
0066 9B77 SBIS 0x0E,7
0067 CFFE RJMP 0x0066
0068 9508 RET
_SPI_595_Out:
i --> R20
0069 940E00A0 CALL push_gset1
006B 2F40 MOV R20,R16
(0041) ;
(0042) }
(0043) }
(0044)
(0045) /*595数据输出*/
(0046) void SPI_595_Out(unsigned char i) {
(0047) PORTB &= ~(1 << 4); /*准备锁存*/
006C 98C4 CBI 0x18,4
(0048) SPI_MasterTransmit(i);
006D 2F04 MOV R16,R20
006E DFF6 RCALL _SPI_MasterTransmit
(0049) PORTB |= (1 << 4); /*锁存数据*/
006F 9AC4 SBI 0x18,4
0070 940E00A3 CALL pop_gset1
0072 9508 RET
(0050) }
(0051)
(0052) void main(void) {
(0053)
(0054) unsigned char i = 0;
_main:
i --> R20
0073 2744 CLR R20
(0055)
(0056) DDRA = 0x00; /*方向输入*/
0074 2422 CLR R2
0075 BA2A OUT 0x1A,R2
(0057) PORTA = 0xFF; /*打开上拉*/
0076 EF8F LDI R24,0xFF
0077 BB8B OUT 0x1B,R24
(0058) DDRB = 0xFF; /*方向输出*/
0078 BB87 OUT 0x17,R24
(0059) PORTB = 0xF0; /*电平设置*/
0079 EF80 LDI R24,0xF0
007A BB88 OUT 0x18,R24
(0060) DDRC = 0x00;
007B BA24 OUT 0x14,R2
(0061) PORTC = 0xFF;
007C EF8F LDI R24,0xFF
007D BB85 OUT 0x15,R24
(0062) DDRD = 0xFF;
007E BB81 OUT 0x11,R24
(0063) PORTD = 0xFF;
007F BB82 OUT 0x12,R24
(0064)
(0065) SPI_MasterInit();
0080 DFDE RCALL _SPI_MasterInit
0081 C011 RJMP 0x0093
(0066) while (1) {
(0067) i ++;
0082 9543 INC R20
(0068) if (i > 9) {
0083 E089 LDI R24,0x9
0084 1784 CP R24,R20
0085 F408 BCC 0x0087
(0069) i = 0;
0086 2744 CLR R20
(0070) }
(0071) delay_ms(250);
0087 EF0A LDI R16,0xFA
0088 DFC7 RCALL _delay_ms
(0072) delay_ms(250);
0089 EF0A LDI R16,0xFA
008A DFC5 RCALL _delay_ms
(0073) SPI_595_Out(disp[i]);
FILE: <library>
008B E680 LDI R24,0x60
008C E090 LDI R25,0
008D 2FE4 MOV R30,R20
008E 27FF CLR R31
008F 0FE8 ADD R30,R24
0090 1FF9 ADC R31,R25
0091 8100 LDD R16,Z+0
0092 DFD6 RCALL _SPI_595_Out
0093 CFEE RJMP 0x0082
0094 9508 RET
pop_gset2:
0095 E0E2 LDI R30,2
0096 940C00A4 JMP pop
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 + -