📄 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 940E00FD CALL push_gset2
FILE: D:\Backup\我的文档\MYDESG~1\AVR\ICC\AVRMEG~1\SPI接口实验LED显示\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 940E00F4 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 940E00FF 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 940E0102 CALL pop_gset1
0072 9508 RET
(0050) }
(0051)
(0052) void main(void) {
(0053)
(0054) unsigned int i = 0;
_main:
i --> R20
0073 2744 CLR R20
0074 2755 CLR R21
(0055)
(0056) DDRA = 0x00; /*方向输入*/
0075 2422 CLR R2
0076 BA2A OUT 0x1A,R2
(0057) PORTA = 0xFF; /*打开上拉*/
0077 EF8F LDI R24,0xFF
0078 BB8B OUT 0x1B,R24
(0058) DDRB = 0xFF; /*方向输出*/
0079 BB87 OUT 0x17,R24
(0059) PORTB = 0xFF; /*电平设置*/
007A BB88 OUT 0x18,R24
(0060) DDRC = 0x00;
007B BA24 OUT 0x14,R2
(0061) PORTC = 0xFF;
007C BB85 OUT 0x15,R24
(0062) DDRD = 0xFF;
007D BB81 OUT 0x11,R24
(0063) PORTD = 0xFF;
007E BB82 OUT 0x12,R24
(0064)
(0065) SPI_MasterInit();
007F DFDF RCALL _SPI_MasterInit
0080 C055 RJMP 0x00D6
(0066) while (1)
(0067) {
(0068) i ++;
0081 5F4F SUBI R20,0xFF
0082 4F5F SBCI R21,0xFF
(0069) if (i > 9999)
0083 E08F LDI R24,0xF
0084 E297 LDI R25,0x27
0085 1784 CP R24,R20
0086 0795 CPC R25,R21
0087 F410 BCC 0x008A
(0070) {
(0071) i = 0;
0088 2744 CLR R20
0089 2755 CLR R21
(0072) }
(0073) //delay_ms(250);
(0074) //delay_ms(250);
(0075) SPI_595_Out(disp[(i/1000)%10]);
008A EE28 LDI R18,0xE8
008B E033 LDI R19,3
008C 018A MOVW R16,R20
008D 940E00DA CALL div16u
008F E02A LDI R18,0xA
0090 E030 LDI R19,0
0091 940E00D8 CALL mod16u
0093 01F8 MOVW R30,R16
0094 E680 LDI R24,0x60
0095 E090 LDI R25,0
0096 0FE8 ADD R30,R24
0097 1FF9 ADC R31,R25
0098 8100 LDD R16,Z+0
0099 DFCF RCALL _SPI_595_Out
(0076) PORTB &= ~(1 << 3);
009A 98C3 CBI 0x18,3
(0077) delay_ms(50);
009B E302 LDI R16,0x32
009C DFB3 RCALL _delay_ms
(0078) //delay_ms(250);
(0079) PORTB |=(1 << 3);
009D 9AC3 SBI 0x18,3
(0080)
(0081) SPI_595_Out(disp[(i/100)%10]);
009E E624 LDI R18,0x64
009F E030 LDI R19,0
00A0 018A MOVW R16,R20
00A1 940E00DA CALL div16u
00A3 E02A LDI R18,0xA
00A4 E030 LDI R19,0
00A5 940E00D8 CALL mod16u
00A7 01F8 MOVW R30,R16
00A8 E680 LDI R24,0x60
00A9 E090 LDI R25,0
00AA 0FE8 ADD R30,R24
00AB 1FF9 ADC R31,R25
00AC 8100 LDD R16,Z+0
00AD DFBB RCALL _SPI_595_Out
(0082) PORTB &= ~(1 << 2);
00AE 98C2 CBI 0x18,2
(0083) delay_ms(50);
00AF E302 LDI R16,0x32
00B0 DF9F RCALL _delay_ms
(0084) //delay_ms(250);
(0085) PORTB |=(1 << 2);
00B1 9AC2 SBI 0x18,2
(0086)
(0087) SPI_595_Out(disp[(i/10)%10]);
00B2 E02A LDI R18,0xA
00B3 E030 LDI R19,0
00B4 018A MOVW R16,R20
00B5 940E00DA CALL div16u
00B7 E02A LDI R18,0xA
00B8 E030 LDI R19,0
00B9 940E00D8 CALL mod16u
00BB 01F8 MOVW R30,R16
00BC E680 LDI R24,0x60
00BD E090 LDI R25,0
00BE 0FE8 ADD R30,R24
00BF 1FF9 ADC R31,R25
00C0 8100 LDD R16,Z+0
00C1 DFA7 RCALL _SPI_595_Out
(0088) PORTB &= ~(1 << 1);
00C2 98C1 CBI 0x18,1
(0089) delay_ms(50);
00C3 E302 LDI R16,0x32
00C4 DF8B RCALL _delay_ms
(0090) //delay_ms(250);
(0091) PORTB |=(1 << 1);
00C5 9AC1 SBI 0x18,1
(0092)
(0093) SPI_595_Out(disp[i%10]);
00C6 E02A LDI R18,0xA
00C7 E030 LDI R19,0
00C8 018A MOVW R16,R20
00C9 940E00D8 CALL mod16u
00CB 01F8 MOVW R30,R16
00CC E680 LDI R24,0x60
00CD E090 LDI R25,0
00CE 0FE8 ADD R30,R24
00CF 1FF9 ADC R31,R25
00D0 8100 LDD R16,Z+0
00D1 DF97 RCALL _SPI_595_Out
(0094) PORTB &= ~(1 << 0);
00D2 98C0 CBI 0x18,0
(0095) delay_ms(50);
00D3 E302 LDI R16,0x32
00D4 DF7B RCALL _delay_ms
(0096) PORTB |=(1 << 0);
FILE: <library>
00D5 9AC0 SBI 0x18,0
00D6 CFAA RJMP 0x0081
00D7 9508 RET
mod16u:
00D8 9468 BSET 6
00D9 C001 RJMP xdiv16u
div16u:
00DA 94E8 BCLR 6
xdiv16u:
00DB 92EA ST R14,-Y
00DC 92FA ST R15,-Y
00DD 938A ST R24,-Y
00DE 24EE CLR R14
00DF 24FF CLR R15
00E0 E180 LDI R24,0x10
00E1 0F00 LSL R16
00E2 1F11 ROL R17
00E3 1CEE ROL R14
00E4 1CFF ROL R15
00E5 16E2 CP R14,R18
00E6 06F3 CPC R15,R19
00E7 F018 BCS 0x00EB
00E8 1AE2 SUB R14,R18
00E9 0AF3 SBC R15,R19
00EA 9503 INC R16
00EB 958A DEC R24
00EC F7A1 BNE 0x00E1
00ED F416 BRTC 0x00F0
00EE 2D0E MOV R16,R14
00EF 2D1F MOV R17,R15
00F0 9189 LD R24,Y+
00F1 90F9 LD R15,Y+
00F2 90E9 LD R14,Y+
00F3 9508 RET
pop_gset2:
00F4 E0E2 LDI R30,2
00F5 940C0103 JMP pop
push_gset5:
00F7 92FA ST R15,-Y
00F8 92EA ST R14,-Y
push_gset4:
00F9 92DA ST R13,-Y
00FA 92CA ST R12,-Y
push_gset3:
00FB 92BA ST R11,-Y
00FC 92AA ST R10,-Y
push_gset2:
00FD 937A ST R23,-Y
00FE 936A ST R22,-Y
push_gset1:
00FF 935A ST R21,-Y
0100 934A ST R20,-Y
0101 9508 RET
pop_gset1:
0102 E0E1 LDI R30,1
pop:
0103 9149 LD R20,Y+
0104 9159 LD R21,Y+
0105 FDE0 SBRC R30,0
0106 9508 RET
0107 9169 LD R22,Y+
0108 9179 LD R23,Y+
0109 FDE1 SBRC R30,1
010A 9508 RET
010B 90A9 LD R10,Y+
010C 90B9 LD R11,Y+
010D FDE2 SBRC R30,2
010E 9508 RET
010F 90C9 LD R12,Y+
0110 90D9 LD R13,Y+
0111 FDE3 SBRC R30,3
0112 9508 RET
0113 90E9 LD R14,Y+
0114 90F9 LD R15,Y+
0115 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -