⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp3.s

📁 用AVR的MP3代码
💻 S
📖 第 1 页 / 共 2 页
字号:
	.dbline 35
; SPSR = 0x01;                //setup SPI
	ldi R24,1
	out 0xe,R24
	.dbline 37
; 
; fatInit();                  //查询SDFAT格式
	xcall _fatInit
	.dbline 38
; if(Fat32Enabled)            //设置FAT格式标志
	lds R2,_Fat32Enabled
	tst R2
	breq L4
	.dbline 39
;  FAT_MASK=FAT32_MASK;
	ldi R20,255
	ldi R21,255
	ldi R22,255
	ldi R23,15
	sts _FAT_MASK+1,R21
	sts _FAT_MASK,R20
	sts _FAT_MASK+2+1,R23
	sts _FAT_MASK+2,R22
	xjmp L7
L4:
	.dbline 41
; else 
; FAT_MASK=FAT16_MASK;
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	sts _FAT_MASK+1,R21
	sts _FAT_MASK,R20
	sts _FAT_MASK+2+1,R23
	sts _FAT_MASK+2,R22
	xjmp L7
L6:
	.dbline 45
; 
; 
;    while(1)
;    { 
	.dbline 47
; //播放音乐
;    for(t=3;t<50;t++)
	ldi R24,3
	ldi R25,0
	sts _t+1,R25
	sts _t,R24
	xjmp L12
L9:
	.dbline 48
	.dbline 49
	clr R2
	sts _flag,R2
	.dbline 50
	lds R16,_t
	lds R17,_t+1
	xcall _fatGetDirEntry
	xcall _mp3_play
	.dbline 51
L10:
	.dbline 47
	lds R24,_t
	lds R25,_t+1
	adiw R24,1
	sts _t+1,R25
	sts _t,R24
L12:
	.dbline 47
	lds R24,_t
	lds R25,_t+1
	cpi R24,50
	ldi R30,0
	cpc R25,R30
	brlo L9
	.dbline 52
L7:
	.dbline 44
	xjmp L6
X0:
	.dbline -2
L2:
	adiw R28,5
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e mp3_play _mp3_play fV
;             t1 -> <dead>
;           rate -> <dead>
;    NextCluster -> y+4
;            LBA -> y+0
;              i -> R10,R11
;              n -> R14
;   data_pointer -> R12,R13
;     FirstClust -> y+18
	.even
_mp3_play::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,8
	.dbline -1
	.dbline 57
;     {
; 	flag=0;
; 	mp3_play(fatGetDirEntry(t));
; 	}
;     }
; }
; 
; 
; void mp3_play(unsigned long FirstClust)
; {  
	.dbline 61
; uint32 LBA,NextCluster;
; uint16 i,data_pointer,rate;
; uint8 n,t1;
; NextCluster = FirstClust;
	movw R30,R28
	ldd R2,z+18
	ldd R3,z+19
	ldd R4,z+20
	ldd R5,z+21
	movw R30,R28
	std z+4,R2
	std z+5,R3
	std z+6,R4
	std z+7,R5
	xjmp L15
L14:
	.dbline 64
; 
;    while (1)
;  	  {	
	.dbline 65
; 	  LBA =fatClustToSect(NextCluster);
	movw R30,R28
	ldd R16,z+4
	ldd R17,z+5
	ldd R18,z+6
	ldd R19,z+7
	xcall _fatClustToSect
	movw R30,R28
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 66
; 	  for (i=0;i<SectorsPerCluster;i++)
	clr R10
	clr R11
	xjmp L20
L17:
	.dbline 67
; 	  	  {
	.dbline 68
; 		  if(flag==0)  ReadBlock(LBA+i);      //读完后文件指针自动后移
	lds R2,_flag
	tst R2
	brne L21
	.dbline 68
	movw R2,R10
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R16,R6
	movw R18,R8
	xcall _ReadBlock
L21:
	.dbline 72
; 		  
; 	//按键处理程序
; 	    //ST/PS键按下
; 	  if(!(PINE&STOP))
	sbic 0x1,6
	rjmp L23
	.dbline 73
; 	   {
	.dbline 74
; 	    delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 74
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 74
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 74
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 74
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 75
; 		if(!(PINE&STOP))
	sbic 0x1,6
	rjmp L25
	.dbline 76
; 		{
	.dbline 77
; 		 flag^=0x01;
	ldi R24,1
	lds R2,_flag
	eor R2,R24
	sts _flag,R2
	.dbline 78
; 		 }
L25:
	.dbline 79
; 	   }
L23:
	.dbline 81
; 	  //VOLUP键按下
; 	  if(!(PINE&VOLDOWN))  
	sbic 0x1,4
	rjmp L27
	.dbline 82
; 	   {
	.dbline 83
; 	    delay_nus(250);
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 84
; 	    if(!(PINE&VOLDOWN))  
	sbic 0x1,4
	rjmp L29
	.dbline 85
; 		  {
	.dbline 86
; 		  vol=vol+((uint)(2<<8)+2);
	lds R24,_vol
	lds R25,_vol+1
	subi R24,254  ; offset = 514
	sbci R25,253
	sts _vol+1,R25
	sts _vol,R24
	.dbline 87
; 		   if(vol>=0xFAFA) vol=0xF0F0; 
	cpi R24,250
	ldi R30,250
	cpc R25,R30
	brlo L31
	.dbline 87
	ldi R24,61680
	ldi R25,240
	sts _vol+1,R25
	sts _vol,R24
	xjmp L32
L31:
	.dbline 88
; 	       else vs1003_cmd_write(0x0b,vol);    //每次左右声道VOL减2
	lds R18,_vol
	lds R19,_vol+1
	ldi R16,11
	xcall _vs1003_cmd_write
L32:
	.dbline 89
; 		  }
L29:
	.dbline 90
; 	   }
L27:
	.dbline 92
; 	  //VOLDOWN键按下
; 	  if(!(PINE&VOLUP)) 
	sbic 0x1,5
	rjmp L33
	.dbline 93
; 	    {
	.dbline 94
; 		delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 94
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 94
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 94
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 95
; 		if(!(PINE&VOLUP)) 
	sbic 0x1,5
	rjmp L35
	.dbline 96
; 		  {
	.dbline 97
; 		   vol=vol-((uint)(2<<8)+2);
	lds R24,_vol
	lds R25,_vol+1
	subi R24,2
	sbci R25,2
	sts _vol+1,R25
	sts _vol,R24
	.dbline 98
; 		   if(vol<=0x0505) vol=0x0505;
	ldi R24,1285
	ldi R25,5
	lds R2,_vol
	lds R3,_vol+1
	cp R24,R2
	cpc R25,R3
	brlo L37
	.dbline 98
	sts _vol+1,R25
	sts _vol,R24
	xjmp L38
L37:
	.dbline 99
; 		   else vs1003_cmd_write(0x0b,vol);   //每次左右声道VOL加2
	lds R18,_vol
	lds R19,_vol+1
	ldi R16,11
	xcall _vs1003_cmd_write
L38:
	.dbline 100
; 	      }
L35:
	.dbline 101
; 		}
L33:
	.dbline 103
; 	  //NEXT键按下
; 	  if(!(PINE&NEXTSONG)) 
	sbic 0x1,3
	rjmp L39
	.dbline 104
; 	    {
	.dbline 105
; 		delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 105
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 105
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 105
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 106
; 		delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 106
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 106
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 106
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 107
; 		if(!(PINE&NEXTSONG))  goto NEXT;       //跳到下一首歌曲
	sbic 0x1,3
	rjmp L41
	.dbline 107
	xjmp L43
L41:
	.dbline 108
; 	    }
L39:
	.dbline 110
; 	    //PREV键按下
; 	  if(!(PINE&PREVSONG)) 
	sbic 0x1,2
	rjmp L44
	.dbline 111
; 	    {
	.dbline 112
; 		delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 112
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 112
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 112
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 113
; 		if(!(PINE&PREVSONG))
	sbic 0x1,2
	rjmp L46
	.dbline 114
; 		  {
	.dbline 115
; 		  t=t-2;goto NEXT;  //返回前一首歌曲
	lds R24,_t
	lds R25,_t+1
	sbiw R24,2
	sts _t+1,R25
	sts _t,R24
	.dbline 115
	xjmp L43
L46:
	.dbline 117
; 	      }
; 		}
L44:
	.dbline 120
; 		
; 	 	
; 		 data_pointer=0; 
	clr R12
	clr R13
	xjmp L49
L48:
	.dbline 122
;         while(data_pointer<512)
;         {    
	.dbline 123
;             if(PINB&MP3_DATA_REQ)
	sbis 0x16,6
	rjmp L51
	.dbline 124
;                {
	.dbline 125
;                  for(n=0;n<32;n++)
	clr R14
	xjmp L56
L53:
	.dbline 126
	.dbline 127
	ldi R24,<_BUFFER
	ldi R25,>_BUFFER
	movw R30,R12
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _vs1003_data_write
	.dbline 128
	movw R24,R12
	adiw R24,1
	movw R12,R24
	.dbline 129
L54:
	.dbline 125
	inc R14
L56:
	.dbline 125
	mov R24,R14
	cpi R24,32
	brlo L53
	.dbline 130
; 		           {
;                     vs1003_data_write(BUFFER[data_pointer]);
;                     data_pointer++;   
;    	               }
; 				}
L51:
	.dbline 131
; 	     if (data_pointer==511) break;   //如果现在的数据不够了,则跳出来
	movw R24,R12
	cpi R24,255
	ldi R30,1
	cpc R25,R30
	brne L57
	.dbline 131
	xjmp L50
L57:
	.dbline 132
L49:
	.dbline 121
	movw R24,R12
	cpi R24,0
	ldi R30,2
	cpc R25,R30
	brlo L48
L50:
	.dbline 133
L18:
	.dbline 66
	movw R24,R10
	adiw R24,1
	movw R10,R24
L20:
	.dbline 66
	lds R2,_SectorsPerCluster
	lds R3,_SectorsPerCluster+1
	cp R10,R2
	cpc R11,R3
	brsh X1
	xjmp L17
X1:
	.dbline 134
; 	     }
; 	}
; 	NextCluster = fatNextCluster(NextCluster);
	movw R30,R28
	ldd R16,z+4
	ldd R17,z+5
	ldd R18,z+6
	ldd R19,z+7
	xcall _fatNextCluster
	movw R30,R28
	std z+4,R16
	std z+5,R17
	std z+6,R18
	std z+7,R19
	.dbline 135
; 	if (NextCluster >=(CLUST_RSRVD&FAT_MASK))break;
	ldi R20,246
	ldi R21,255
	ldi R22,255
	ldi R23,255
	lds R4,_FAT_MASK+2
	lds R5,_FAT_MASK+2+1
	lds R2,_FAT_MASK
	lds R3,_FAT_MASK+1
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R30,R28
	ldd R6,z+4
	ldd R7,z+5
	ldd R8,z+6
	ldd R9,z+7
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo L59
	.dbline 135
	xjmp L16
L59:
	.dbline 136
L15:
	.dbline 63
	xjmp L14
L16:
L43:
	.dbline 137
; 	}
;  NEXT: delay_nus(1);  /* 下一首歌曲*/
	ldi R16,1
	ldi R17,0
	xcall _delay_nus
	.dbline -2
L13:
	adiw R28,8
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l t1 1 c
	.dbsym l rate 1 i
	.dbsym l NextCluster 4 l
	.dbsym l LBA 0 l
	.dbsym r i 10 i
	.dbsym r n 14 c
	.dbsym r data_pointer 12 i
	.dbsym l FirstClust 18 l
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\V3U~1\sd\M64-SD卡MP3程序\mp3.c
_t::
	.blkb 2
	.dbfile E:\V3U~1\sd\M64-SD卡MP3程序/mp3.h
	.dbsym e t _t i
_true::
	.blkb 1
	.dbsym e true _true c
_FAT_MASK::
	.blkb 4
	.dbsym e FAT_MASK _FAT_MASK l
	.area data(ram, con, rel)
	.dbfile E:\V3U~1\sd\M64-SD卡MP3程序/mp3.h
L3:
	.blkb 15
	.area idata
	.byte 'M,'E,'G,'A,54,52,'L,32,32,32,32,'M,'P,51,0
	.area data(ram, con, rel)
	.dbfile E:\V3U~1\sd\M64-SD卡MP3程序/mp3.h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -