📄 mp3.lis
字号:
0076 ; SPSR = 0x01; //setup SPI
0076 81E0 ldi R24,1
0078 8EB9 out 0xe,R24
007A .dbline 37
007A ;
007A ; fatInit(); //查询SDFAT格式
007A 0E940000 xcall _fatInit
007E .dbline 38
007E ; if(Fat32Enabled) //设置FAT格式标志
007E 20900000 lds R2,_Fat32Enabled
0082 2220 tst R2
0084 69F0 breq L4
0086 .dbline 39
0086 ; FAT_MASK=FAT32_MASK;
0086 4FEF ldi R20,255
0088 5FEF ldi R21,255
008A 6FEF ldi R22,255
008C 7FE0 ldi R23,15
008E 50930400 sts _FAT_MASK+1,R21
0092 40930300 sts _FAT_MASK,R20
0096 70930600 sts _FAT_MASK+2+1,R23
009A 60930500 sts _FAT_MASK+2,R22
009E 2FC0 xjmp L7
00A0 L4:
00A0 .dbline 41
00A0 ; else
00A0 ; FAT_MASK=FAT16_MASK;
00A0 4FEF ldi R20,255
00A2 5FEF ldi R21,255
00A4 60E0 ldi R22,0
00A6 70E0 ldi R23,0
00A8 50930400 sts _FAT_MASK+1,R21
00AC 40930300 sts _FAT_MASK,R20
00B0 70930600 sts _FAT_MASK+2+1,R23
00B4 60930500 sts _FAT_MASK+2,R22
00B8 22C0 xjmp L7
00BA L6:
00BA .dbline 45
00BA ;
00BA ;
00BA ; while(1)
00BA ; {
00BA .dbline 47
00BA ; //播放音乐
00BA ; for(t=3;t<50;t++)
00BA 83E0 ldi R24,3
00BC 90E0 ldi R25,0
00BE 90930100 sts _t+1,R25
00C2 80930000 sts _t,R24
00C6 13C0 xjmp L12
00C8 L9:
00C8 .dbline 48
00C8 .dbline 49
00C8 2224 clr R2
00CA 20920200 sts _flag,R2
00CE .dbline 50
00CE 00910000 lds R16,_t
00D2 10910100 lds R17,_t+1
00D6 0E940000 xcall _fatGetDirEntry
00DA 14D0 xcall _mp3_play
00DC .dbline 51
00DC L10:
00DC .dbline 47
00DC 80910000 lds R24,_t
00E0 90910100 lds R25,_t+1
00E4 0196 adiw R24,1
00E6 90930100 sts _t+1,R25
00EA 80930000 sts _t,R24
00EE L12:
00EE .dbline 47
00EE 80910000 lds R24,_t
00F2 90910100 lds R25,_t+1
00F6 8233 cpi R24,50
00F8 E0E0 ldi R30,0
00FA 9E07 cpc R25,R30
00FC 28F3 brlo L9
00FE .dbline 52
00FE L7:
00FE .dbline 44
00FE DDCF xjmp L6
0100 X0:
0100 .dbline -2
0100 L2:
0100 2596 adiw R28,5
0102 .dbline 0 ; func end
0102 0895 ret
0104 .dbend
0104 .dbfunc e mp3_play _mp3_play fV
0104 ; t1 -> <dead>
0104 ; rate -> <dead>
0104 ; NextCluster -> y+4
0104 ; LBA -> y+0
0104 ; i -> R10,R11
0104 ; n -> R14
0104 ; data_pointer -> R12,R13
0104 ; FirstClust -> y+18
.even
0104 _mp3_play::
0104 0E940000 xcall push_arg4
0108 0E940000 xcall push_gset5
010C 2897 sbiw R28,8
010E .dbline -1
010E .dbline 57
010E ; {
010E ; flag=0;
010E ; mp3_play(fatGetDirEntry(t));
010E ; }
010E ; }
010E ; }
010E ;
010E ;
010E ; void mp3_play(unsigned long FirstClust)
010E ; {
010E .dbline 61
010E ; uint32 LBA,NextCluster;
010E ; uint16 i,data_pointer,rate;
010E ; uint8 n,t1;
010E ; NextCluster = FirstClust;
010E FE01 movw R30,R28
0110 2288 ldd R2,z+18
0112 3388 ldd R3,z+19
0114 4488 ldd R4,z+20
0116 5588 ldd R5,z+21
0118 FE01 movw R30,R28
011A 2482 std z+4,R2
011C 3582 std z+5,R3
011E 4682 std z+6,R4
0120 5782 std z+7,R5
0122 2EC1 xjmp L15
0124 L14:
0124 .dbline 64
0124 ;
0124 ; while (1)
0124 ; {
0124 .dbline 65
0124 ; LBA =fatClustToSect(NextCluster);
0124 FE01 movw R30,R28
0126 0481 ldd R16,z+4
0128 1581 ldd R17,z+5
012A 2681 ldd R18,z+6
012C 3781 ldd R19,z+7
012E 0E940000 xcall _fatClustToSect
0132 FE01 movw R30,R28
0134 0083 std z+0,R16
0136 1183 std z+1,R17
0138 2283 std z+2,R18
013A 3383 std z+3,R19
013C .dbline 66
013C ; for (i=0;i<SectorsPerCluster;i++)
013C AA24 clr R10
013E BB24 clr R11
0140 F0C0 xjmp L20
0142 L17:
0142 .dbline 67
0142 ; {
0142 .dbline 68
0142 ; if(flag==0) ReadBlock(LBA+i); //读完后文件指针自动后移
0142 20900200 lds R2,_flag
0146 2220 tst R2
0148 81F4 brne L21
014A .dbline 68
014A 1501 movw R2,R10
014C 4424 clr R4
014E 5524 clr R5
0150 FE01 movw R30,R28
0152 6080 ldd R6,z+0
0154 7180 ldd R7,z+1
0156 8280 ldd R8,z+2
0158 9380 ldd R9,z+3
015A 620C add R6,R2
015C 731C adc R7,R3
015E 841C adc R8,R4
0160 951C adc R9,R5
0162 8301 movw R16,R6
0164 9401 movw R18,R8
0166 0E940000 xcall _ReadBlock
016A L21:
016A .dbline 72
016A ;
016A ; //按键处理程序
016A ; //ST/PS键按下
016A ; if(!(PINE&STOP))
016A 0E99 sbic 0x1,6
016C 1CC0 rjmp L23
016E .dbline 73
016E ; {
016E .dbline 74
016E ; delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
016E 0AEF ldi R16,250
0170 10E0 ldi R17,0
0172 0E940000 xcall _delay_nus
0176 .dbline 74
0176 0AEF ldi R16,250
0178 10E0 ldi R17,0
017A 0E940000 xcall _delay_nus
017E .dbline 74
017E 0AEF ldi R16,250
0180 10E0 ldi R17,0
0182 0E940000 xcall _delay_nus
0186 .dbline 74
0186 0AEF ldi R16,250
0188 10E0 ldi R17,0
018A 0E940000 xcall _delay_nus
018E .dbline 74
018E 0AEF ldi R16,250
0190 10E0 ldi R17,0
0192 0E940000 xcall _delay_nus
0196 .dbline 75
0196 ; if(!(PINE&STOP))
0196 0E99 sbic 0x1,6
0198 06C0 rjmp L25
019A .dbline 76
019A ; {
019A .dbline 77
019A ; flag^=0x01;
019A 81E0 ldi R24,1
019C 20900200 lds R2,_flag
01A0 2826 eor R2,R24
01A2 20920200 sts _flag,R2
01A6 .dbline 78
01A6 ; }
01A6 L25:
01A6 .dbline 79
01A6 ; }
01A6 L23:
01A6 .dbline 81
01A6 ; //VOLUP键按下
01A6 ; if(!(PINE&VOLDOWN))
01A6 0C99 sbic 0x1,4
01A8 22C0 rjmp L27
01AA .dbline 82
01AA ; {
01AA .dbline 83
01AA ; delay_nus(250);
01AA 0AEF ldi R16,250
01AC 10E0 ldi R17,0
01AE 0E940000 xcall _delay_nus
01B2 .dbline 84
01B2 ; if(!(PINE&VOLDOWN))
01B2 0C99 sbic 0x1,4
01B4 1CC0 rjmp L29
01B6 .dbline 85
01B6 ; {
01B6 .dbline 86
01B6 ; vol=vol+((uint)(2<<8)+2);
01B6 80910000 lds R24,_vol
01BA 90910100 lds R25,_vol+1
01BE 8E5F subi R24,254 ; offset = 514
01C0 9D4F sbci R25,253
01C2 90930100 sts _vol+1,R25
01C6 80930000 sts _vol,R24
01CA .dbline 87
01CA ; if(vol>=0xFAFA) vol=0xF0F0;
01CA 8A3F cpi R24,250
01CC EAEF ldi R30,250
01CE 9E07 cpc R25,R30
01D0 38F0 brlo L31
01D2 .dbline 87
01D2 80EF ldi R24,61680
01D4 90EF ldi R25,240
01D6 90930100 sts _vol+1,R25
01DA 80930000 sts _vol,R24
01DE 07C0 xjmp L32
01E0 L31:
01E0 .dbline 88
01E0 ; else vs1003_cmd_write(0x0b,vol); //每次左右声道VOL减2
01E0 20910000 lds R18,_vol
01E4 30910100 lds R19,_vol+1
01E8 0BE0 ldi R16,11
01EA 0E940000 xcall _vs1003_cmd_write
01EE L32:
01EE .dbline 89
01EE ; }
01EE L29:
01EE .dbline 90
01EE ; }
01EE L27:
01EE .dbline 92
01EE ; //VOLDOWN键按下
01EE ; if(!(PINE&VOLUP))
01EE 0D99 sbic 0x1,5
01F0 31C0 rjmp L33
01F2 .dbline 93
01F2 ; {
01F2 .dbline 94
01F2 ; delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
01F2 0AEF ldi R16,250
01F4 10E0 ldi R17,0
01F6 0E940000 xcall _delay_nus
01FA .dbline 94
01FA 0AEF ldi R16,250
01FC 10E0 ldi R17,0
01FE 0E940000 xcall _delay_nus
0202 .dbline 94
0202 0AEF ldi R16,250
0204 10E0 ldi R17,0
0206 0E940000 xcall _delay_nus
020A .dbline 94
020A 0AEF ldi R16,250
020C 10E0 ldi R17,0
020E 0E940000 xcall _delay_nus
0212 .dbline 95
0212 ; if(!(PINE&VOLUP))
0212 0D99 sbic 0x1,5
0214 1FC0 rjmp L35
0216 .dbline 96
0216 ; {
0216 .dbline 97
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -