📄 mp3.lst
字号:
__start:
__text_start:
0035 E5CF LDI R28,0x5F
0036 E0D4 LDI R29,4
0037 BFCD OUT 0x3D,R28
0038 BFDE OUT 0x3E,R29
0039 54C0 SUBI R28,0x40
003A 40D0 SBCI R29,0
003B EA0A LDI R16,0xAA
003C 8308 STD Y+0,R16
003D 2400 CLR R0
003E E6E5 LDI R30,0x65
003F E0F0 LDI R31,0
0040 E013 LDI R17,3
0041 36E0 CPI R30,0x60
0042 07F1 CPC R31,R17
0043 F011 BEQ 0x0046
0044 9201 ST R0,Z+
0045 CFFB RJMP 0x0041
0046 8300 STD Z+0,R16
0047 E6E4 LDI R30,0x64
0048 E0F0 LDI R31,0
0049 E6A0 LDI R26,0x60
004A E0B0 LDI R27,0
004B E010 LDI R17,0
004C 36E9 CPI R30,0x69
004D 07F1 CPC R31,R17
004E F021 BEQ 0x0053
004F 95C8 LPM
0050 9631 ADIW R30,1
0051 920D ST R0,X+
0052 CFF9 RJMP 0x004C
0053 940E005F CALL _main
_exit:
0055 CFFF RJMP _exit
_DREQ:
0056 940E0AC6 CALL push_lset
FILE: F:\mine\mp3\MP3\main.c
(0001) #include<all.h>
(0002) #include<vs1001k.h>
(0003) #include<sdcom.h>
(0004) #include<fat.h>
(0005)
(0006) char songnumber=0;//歌曲编号
(0007)
(0008)
(0009) #pragma interrupt_handler DREQ:iv_INT0 //数据缓冲
(0010) void DREQ(void)
(0011) { delay(50);}
0058 E302 LDI R16,0x32
0059 E010 LDI R17,0
005A 940E0293 CALL _delay
005C 940E0ADD CALL pop_lset
005E 9518 RETI
_main:
n --> Y+16
table3 --> Y+8
table2 --> Y+0
005F 9764 SBIW R28,0x14
(0012)
(0013)
(0014) void main(void)
(0015) { ulong n;
(0016) uchar table2[8]={0x45,0x78,0x69,0x74,0,0,0,0};
0060 E584 LDI R24,0x54
0061 E090 LDI R25,0
0062 01FE MOVW R30,R28
0063 E008 LDI R16,0x8
0064 E010 LDI R17,0
0065 93FA ST R31,-Y
0066 93EA ST R30,-Y
0067 939A ST R25,-Y
0068 938A ST R24,-Y
0069 940E0B0C CALL asgncblk
(0017) uchar table3[8]={0x53,0xef,0x6e,0x30,0,0,0,0};
006B E58C LDI R24,0x5C
006C E090 LDI R25,0
006D 01FE MOVW R30,R28
006E 9638 ADIW R30,0x8
006F E008 LDI R16,0x8
0070 E010 LDI R17,0
0071 93FA ST R31,-Y
0072 93EA ST R30,-Y
0073 939A ST R25,-Y
0074 938A ST R24,-Y
0075 940E0B0C CALL asgncblk
(0018) DDRB=0xbb;
0077 EB8B LDI R24,0xBB
0078 BB87 OUT 0x17,R24
(0019) DDRD=0x02;
0079 E082 LDI R24,2
007A BB81 OUT 0x11,R24
(0020) PORTB=0xff;
007B EF8F LDI R24,0xFF
007C BB88 OUT 0x18,R24
(0021) PORTD=0xff;
007D BB82 OUT 0x12,R24
(0022) MCUCR=0x08;//INT0低电平中断 INT1下降沿
007E E088 LDI R24,0x8
007F BF85 OUT 0x35,R24
(0023) GICR=0xC0;
0080 EC80 LDI R24,0xC0
0081 BF8B OUT 0x3B,R24
(0024) // SEI();//开中断
(0025) // while(1);
(0026)
(0027) SPCR=0x50;//高位先
0082 E580 LDI R24,0x50
0083 B98D OUT 0x0D,R24
(0028) SPSR=0x01;//rat/2
0084 E081 LDI R24,1
0085 B98E OUT 0x0E,R24
(0029) while(sd_init()==0);//等待SD初始化
0086 940E027F CALL _sd_init
0088 2300 TST R16
0089 F3E1 BEQ 0x0086
(0030) setlight;
008A 9891 CBI 0x12,1
(0031) vs1001k_reset();//VS1001K复位
008B 940E0302 CALL _vs1001k_reset
(0032)
(0033) GetinBoot();//进入
008D 940E039E CALL _GetinBoot
(0034) GetFatSec();//得到FAT扇区
008F 940E05A6 CALL _GetFatSec
(0035) SongSector();//得到每首歌的扇区号
0091 940E0645 CALL _SongSector
(0036)
(0037)
(0038) SEI();//开中断
0093 9478 BSET 7
0094 C004 RJMP 0x0099
(0039) while(1)
(0040) PlaySong(songnumber);
0095 91000060 LDS R16,0x60
0097 940E08FB CALL _PlaySong
0099 CFFB RJMP 0x0095
(0041) _NOP();
009A 0000 NOP
(0042) }
009B 9664 ADIW R28,0x14
009C 9508 RET
FILE: F:\mine\mp3\MP3\sd.c
(0001) #include<all.h>
(0002) #include<vs1001k.h>
(0003) #include<sd.h>
(0004) #define SD_INIT_TRY 50
(0005) #define SD_IDLE_WAIT_MAX 100 //等待进入IDLE次数
(0006) #define SD_CMD_TIMEOUT 100 //读CMD次数
(0007) #define TIMEOUT_WRITE 10000 // 8M/8
(0008) #define TIMEOUT_READ 400000 // 8M/20
(0009)
(0010) uchar mp3_data[DATA_LENGTH];
(0011) uchar response[5];
(0012)
(0013) void sd_wait_nobusy(void)
(0014) {
(0015) while(read_single()!=0xff);
_sd_wait_nobusy:
009D 940E02B1 CALL _read_single
009F 3F0F CPI R16,0xFF
00A0 F7E1 BNE 0x009D
(0016) select_vs;
00A1 9AC3 SBI 0x18,3
(0017) }
00A2 9508 RET
_sd_delay:
n --> R20
dat --> R22
00A3 940E0A91 CALL push_gset2
00A5 2F60 MOV R22,R16
(0018) void sd_delay(uchar dat)
(0019) { uint n;
(0020) for(n=0;n<dat;n++)
00A6 2744 CLR R20
00A7 2755 CLR R21
00A8 C005 RJMP 0x00AE
(0021) write_single(0xff);
00A9 EF0F LDI R16,0xFF
00AA 940E02AC CALL _write_single
00AC 5F4F SUBI R20,0xFF
00AD 4F5F SBCI R21,0xFF
00AE 2E26 MOV R2,R22
00AF 2433 CLR R3
00B0 1542 CP R20,R2
00B1 0553 CPC R21,R3
00B2 F3B0 BCS 0x00A9
(0022) }
00B3 940E0A6E CALL pop_gset2
00B5 9508 RET
_sd_write_command:
response_length --> R14
dat --> R22
n --> R20
response --> R10
arg --> Y+10
response_type --> R12
cmd --> R20
00B6 940E0A9D CALL push_gset5
00B8 2EC2 MOV R12,R18
00B9 2F40 MOV R20,R16
00BA 84AE LDD R10,Y+14
00BB 84BF LDD R11,Y+15
(0023) /****************sd 发命令**********************/
(0024) uchar sd_write_command(uchar cmd,uchar response_type,ulong arg,uchar *response)
(0025) { uchar response_length,dat;
(0026) int n;
(0027) select_sd;//选择SD
00BC 98C3 CBI 0x18,3
(0028) write_single(cmd|0x40);
00BD 2F04 MOV R16,R20
00BE 6400 ORI R16,0x40
00BF 940E02AC CALL _write_single
(0029) write_single(arg>>24);
00C1 E188 LDI R24,0x18
00C2 E090 LDI R25,0
00C3 01FE MOVW R30,R28
00C4 8422 LDD R2,Z+10
00C5 8433 LDD R3,Z+11
00C6 8444 LDD R4,Z+12
00C7 8455 LDD R5,Z+13
00C8 938A ST R24,-Y
00C9 0181 MOVW R16,R2
00CA 0192 MOVW R18,R4
00CB 940E0B00 CALL lsr32
00CD 940E02AC CALL _write_single
(0030) write_single(arg>>16);
00CF 01FE MOVW R30,R28
00D0 8422 LDD R2,Z+10
00D1 8433 LDD R3,Z+11
00D2 8444 LDD R4,Z+12
00D3 8455 LDD R5,Z+13
00D4 0112 MOVW R2,R4
00D5 2444 CLR R4
00D6 2455 CLR R5
00D7 2D02 MOV R16,R2
00D8 940E02AC CALL _write_single
(0031) write_single(arg>>8);
00DA E088 LDI R24,0x8
00DB E090 LDI R25,0
00DC 01FE MOVW R30,R28
00DD 8422 LDD R2,Z+10
00DE 8433 LDD R3,Z+11
00DF 8444 LDD R4,Z+12
00E0 8455 LDD R5,Z+13
00E1 938A ST R24,-Y
00E2 0181 MOVW R16,R2
00E3 0192 MOVW R18,R4
00E4 940E0B00 CALL lsr32
00E6 940E02AC CALL _write_single
(0032) write_single(arg);
00E8 01FE MOVW R30,R28
00E9 8502 LDD R16,Z+10
00EA 940E02AC CALL _write_single
(0033) write_single(0x95);//CRC 对于CMD0有效,SPI忽略
00EC E905 LDI R16,0x95
00ED 940E02AC CALL _write_single
(0034) response_length=0;
00EF 24EE CLR R14
(0035) switch(response_type)
00F0 2D4C MOV R20,R12
00F1 2755 CLR R21
00F2 3041 CPI R20,1
00F3 E0E0 LDI R30,0
00F4 075E CPC R21,R30
00F5 F069 BEQ 0x0103
00F6 3042 CPI R20,2
00F7 E0E0 LDI R30,0
00F8 075E CPC R21,R30
00F9 F049 BEQ 0x0103
00FA 3043 CPI R20,3
00FB E0E0 LDI R30,0
00FC 075E CPC R21,R30
00FD F041 BEQ 0x0106
00FE 3044 CPI R20,4
00FF E0E0 LDI R30,0
0100 075E CPC R21,R30
0101 F039 BEQ 0x0109
0102 C008 RJMP 0x010B
(0036) { case R1:
(0037) case R1B:response_length=1;break;
0103 24EE CLR R14
0104 94E3 INC R14
0105 C005 RJMP 0x010B
(0038) case R2: response_length=2;break;
0106 E082 LDI R24,2
0107 2EE8 MOV R14,R24
0108 C002 RJMP 0x010B
(0039) case R3: response_length=5;break;
0109 E085 LDI R24,5
010A 2EE8 MOV R14,R24
(0040) default: break;
(0041) }
(0042) n=0;
010B 2744 CLR R20
010C 2755 CLR R21
(0043) do //等待响应
(0044) { dat=read_single();
010D 940E02B1 CALL _read_single
010F 2F60 MOV R22,R16
(0045) n++;
0110 5F4F SUBI R20,0xFF
0111 4F5F SBCI R21,0xFF
(0046) }
(0047) while(((dat&0x80)!=0)&&(n<SD_CMD_TIMEOUT));
0112 FF67 SBRS R22,7
0113 C004 RJMP 0x0118
0114 3644 CPI R20,0x64
0115 E0E0 LDI R30,0
0116 075E CPC R21,R30
0117 F3AC BLT 0x010D
(0048) if(n>=SD_CMD_TIMEOUT) //超时
0118 3644 CPI R20,0x64
0119 E0E0 LDI R30,0
011A 075E CPC R21,R30
011B F01C BLT 0x011F
(0049) { select_vs;
011C 9AC3 SBI 0x18,3
(0050) return 0;
011D 2700 CLR R16
011E C01F RJMP 0x013E
(0051) }
(0052) for(n=response_length-1;n>=0;n--)//取数据
011F 2D4E MOV R20,R14
0120 2755 CLR R21
0121 5041 SUBI R20,1
0122 4050 SBCI R21,0
0123 C009 RJMP 0x012D
(0053) { response[n]=dat;
0124 01FA MOVW R30,R20
0125 0DEA ADD R30,R10
0126 1DFB ADC R31,R11
0127 8360 STD Z+0,R22
(0054) dat=read_single();
0128 940E02B1 CALL _read_single
012A 2F60 MOV R22,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -