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

📄 mp3.s

📁 介绍AVR单片机与SD卡及MP3芯片的通信接口代码。
💻 S
📖 第 1 页 / 共 4 页
字号:
	.byte 255,255
	.byte 255,255
	.byte 255,255
	.byte 255,255
	.byte 255,255
	.byte 255,255
	.byte 255,255
	.byte 255,255
	.byte 255,255
	.byte 255,255
	.byte 255,128
	.byte 2,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 255,242
	.byte 130,'T
	.byte 9,232
	.byte 255,22
	.byte 224,1
	.byte 46,0
	.byte 0,0
	.byte 0,0
	.byte 168,2
	.byte 92,172
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.byte 0,0
	.dbsym e vsBeepMP3 _vsBeepMP3 A[4800:4800]kc
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序/mp3.h
	.dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\mp3.c
	.dbfunc e key_port _key_port fV
	.even
_key_port::
	.dbline -1
	.dbline 17
; /************************************************************/
; /*		         MP3 Code for   M32L					    */
; /*				   By   pasyong								*/
; /*				   2006-4									*/
; /*				   Base ICC6.31A					        */
; /************************************************************/
; #include <iom32v.h>
; #include <macros.h>
; #include <stdio.h>
; #include "1011.h"
; #include "mp3.h"
; #include "sd.h"
; #include "fat.h"
; #include "uarst.h"
; 
; void key_port(void)
;  {
	.dbline 18
;  DDRD=0X00;
	clr R2
	out 0x11,R2
	.dbline 19
;  PORTD=0XFF;
	ldi R24,255
	out 0x12,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 22
;  }
; void main()
; {
	.dbline 23
; key_port();
	xcall _key_port
	.dbline 24
; spi_init();
	xcall _spi_init
	.dbline 25
; mp3_port_init();vs1011_init();vs1011_init();
	xcall _mp3_port_init
	.dbline 25
	xcall _vs1011_init
	.dbline 25
	xcall _vs1011_init
	.dbline 26
; sd_port_init();SD_Init();SD_Init();
	xcall _sd_port_init
	.dbline 26
	xcall _SD_Init
	.dbline 26
	xcall _SD_Init
	.dbline 27
; uart0_init();
	xcall _uart0_init
	.dbline 28
; SPCR = 0x50;                //提速
	ldi R24,80
	out 0xd,R24
	.dbline 29
; SPSR = 0x01;                //setup SPI
	ldi R24,1
	out 0xe,R24
	.dbline 31
; 
; fatInit();                  //查询SDFAT格式
	xcall _fatInit
	.dbline 32
; if(Fat32Enabled)            //设置FAT格式标志
	lds R2,_Fat32Enabled
	tst R2
	breq L3
	.dbline 33
;  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 L6
L3:
	.dbline 35
; 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 L6
L5:
	.dbline 39
; 
; 
;    while(1)
;    { 
	.dbline 41
; //播放音乐
;    for(t=3;t<50;t++)
	ldi R24,3
	ldi R25,0
	sts _t+1,R25
	sts _t,R24
	xjmp L11
L8:
	.dbline 42
	.dbline 43
	clr R2
	sts _flag,R2
	.dbline 44
	lds R16,_t
	lds R17,_t+1
	xcall _fatGetDirEntry
	xcall _mp3_play
	.dbline 45
L9:
	.dbline 41
	lds R24,_t
	lds R25,_t+1
	adiw R24,1
	sts _t+1,R25
	sts _t,R24
L11:
	.dbline 41
	lds R24,_t
	lds R25,_t+1
	cpi R24,50
	ldi R30,0
	cpc R25,R30
	brlo L8
	.dbline 46
L6:
	.dbline 38
	xjmp L5
X0:
	.dbline -2
L2:
	.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 51
;     {
; 	flag=0;
; 	mp3_play(fatGetDirEntry(t));
; 	}
;     }
; }
; 
; 
; void mp3_play(unsigned long FirstClust)
; {  
	.dbline 55
; 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 L14
L13:
	.dbline 58
; 
;    while (1)
;  	  {	
	.dbline 59
; 	  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 60
; 	  for (i=0;i<SectorsPerCluster;i++)
	clr R10
	clr R11
	xjmp L19
L16:
	.dbline 61
; 	  	  {
	.dbline 62
; 		  if(flag==0)  ReadBlock(LBA+i);      //读完后文件指针自动后移
	lds R2,_flag
	tst R2
	brne L20
	.dbline 62
	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
L20:
	.dbline 66
; 		  
; 	//按键处理程序
; 	    //ST/PS键按下
; 	  if(!(PIND&STOP))
	sbic 0x10,6
	rjmp L22
	.dbline 67
; 	   {
	.dbline 68
; 	    delay_nus(250);
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 69
; 		if(!(PIND&STOP))
	sbic 0x10,6
	rjmp L24
	.dbline 70
; 		{
	.dbline 71
; 		 flag^=0x01;
	ldi R24,1
	lds R2,_flag
	eor R2,R24
	sts _flag,R2
	.dbline 72
; 		 }
L24:
	.dbline 73
; 	   }
L22:
	.dbline 75
; 	  //VOLUP键按下
; 	  if(!(PIND&VOLDOWN))  
	sbic 0x10,4
	rjmp L26
	.dbline 76
; 	   {
	.dbline 77
; 	    delay_nus(250);
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 78
; 	    if(!(PIND&VOLDOWN))  
	sbic 0x10,4
	rjmp L28
	.dbline 79
; 		  {
	.dbline 80
; 		  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 81
; 		   if(vol>=0xF0F0) vol=0xF0F0; 
	cpi R24,240
	ldi R30,240
	cpc R25,R30
	brlo L30
	.dbline 81
	ldi R24,61680
	ldi R25,240
	sts _vol+1,R25
	sts _vol,R24
	xjmp L31
L30:
	.dbline 82
; 	       else vs1011_cmd_write(0x0b,vol);    //每次左右声道VOL减2
	lds R18,_vol
	lds R19,_vol+1
	ldi R16,11
	xcall _vs1011_cmd_write
L31:
	.dbline 83
; 		  }
L28:
	.dbline 84
; 	   }
L26:
	.dbline 86
; 	  //VOLDOWN键按下
; 	  if(!(PIND&VOLUP)) 
	sbic 0x10,5
	rjmp L32
	.dbline 87
; 	    {
	.dbline 88
; 		delay_nus(250);
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 89
; 		if(!(PIND&VOLUP)) 
	sbic 0x10,5
	rjmp L34
	.dbline 90
; 		  {
	.dbline 91
; 		   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 92
; 		   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 L36
	.dbline 92
	sts _vol+1,R25
	sts _vol,R24
	xjmp L37
L36:
	.dbline 93
; 		   else vs1011_cmd_write(0x0b,vol);   //每次左右声道VOL加2
	lds R18,_vol
	lds R19,_vol+1
	ldi R16,11
	xcall _vs1011_cmd_write
L37:
	.dbline 94
; 	      }
L34:
	.dbline 95
; 		}
L32:
	.dbline 97
; 	   //NEXT键按下
; 	  if(!(PIND&NEXTSONG)) 
	sbic 0x10,3
	rjmp L38
	.dbline 98
; 	    {
	.dbline 99
; 		delay_nus(250);		
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 100
; 		if(!(PIND&NEXTSONG))  goto NEXT;       //跳到下一首歌曲
	sbic 0x10,3
	rjmp L40
	.dbline 100
	xjmp L42
L40:
	.dbline 101
; 	    }
L38:
	.dbline 103
; 	    //PREV键按下
; 	  if(!(PIND&PREVSONG)) 
	sbic 0x10,2
	rjmp L43
	.dbline 104
; 	    {
	.dbline 105
; 		delay_nus(250);
	ldi R16,250
	ldi R17,0
	xcall _delay_nus
	.dbline 106
; 		if(!(PIND&PREVSONG))
	sbic 0x10,2
	rjmp L45
	.dbline 107
; 		  {
	.dbline 108
; 		  t=t-2;goto NEXT;  //返回前一首歌曲
	lds R24,_t
	lds R25,_t+1
	sbiw R24,2
	sts _t+1,R25
	sts _t,R24
	.dbline 108
	xjmp L42
L45:
	.dbline 110
; 	      }
; 		}
L43:
	.dbline 113
; 		
; 	 	
; 		 data_pointer=0; 
	clr R12
	clr R13
	xjmp L48
L47:
	.dbline 115
;         while(data_pointer<512)
;         {    
	.dbline 116
;             if(PINB&MP3_DATA_REQ)
	sbis 0x16,2
	rjmp L50
	.dbline 117
;                {
	.dbline 118
;                  for(n=0;n<32;n++)
	clr R14
	xjmp L55
L52:
	.dbline 119
	.dbline 120
	ldi R24,<_BUFFER
	ldi R25,>_BUFFER
	movw R30,R12
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _vs1011_data_write
	.dbline 121
	movw R24,R12
	adiw R24,1
	movw R12,R24
	.dbline 122
L53:
	.dbline 118
	inc R14
L55:
	.dbline 118
	mov R24,R14
	cpi R24,32
	brlo L52
	.dbline 123
; 		           {
;                     vs1011_data_write(BUFFER[data_pointer]);
;                     data_pointer++;   
;    	               }
; 				}
L50:
	.dbline 124
; 	     if (data_pointer==511) break;   //如果现在的数据不够了,则跳出来
	movw R24,R12
	cpi R24,255
	ldi R30,1
	cpc R25,R30
	brne L56
	.dbline 124
	xjmp L49
L56:
	.dbline 125
L48:
	.dbline 114
	movw R24,R12
	cpi R24,0
	ldi R30,2
	cpc R25,R30
	brlo L47
L49:
	.dbline 126
L17:
	.dbline 60
	movw R24,R10
	adiw R24,1
	movw R10,R24
L19:
	.dbline 60
	lds R2,_SectorsPerCluster
	lds R3,_SectorsPerCluster+1
	cp R10,R2
	cpc R11,R3
	brsh X1
	xjmp L16
X1:
	.dbline 127
; 	     }
; 	}
; 	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 128
; 	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 L58
	.dbline 128
	xjmp L15
L58:
	.dbline 129
L14:
	.dbline 57
	xjmp L13
L15:
L42:
	.dbline 130
; 	}
;  NEXT: delay_nus(3);  /* 下一首歌曲*/
	ldi R16,3
	ldi R17,0
	xcall _delay_nus
	.dbline -2
L12:
	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 C:\DOCUME~1\pas\桌面\SD卡MP3程序\mp3.c
_t::
	.blkb 2
	.dbfile C:\DOCUME~1\pas\桌面\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

⌨️ 快捷键说明

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