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

📄 mp3decodedrv.c

📁 该软件为在sunplus的61单片机上实现的mp3播放器.里面有完整的源代码.
💻 C
字号:
/*C**************************************************************************
* 文件名:       MP3DecodeDrv.c
*----------------------------------------------------------------------------
* 版权:        (c) 2004 TGE.
*----------------------------------------------------------------------------
* 释放:         Spce061A      
* 版本:         1.0     
*----------------------------------------------------------------------------
* 目的:
* This is the demonstration software for SPCE061A
*****************************************************************************/

/*_____    包括     ________________________________________________________*/
#include "..\\spce061\\061reg.h"
#include "MA8201EQINTa.h"
#include "..\\public\\public.h"
#include "mp3decodeDrv.h"

/*_____    宏       ________________________________________________________*/

/*_____    定义     ________________________________________________________*/

/*_____    声明     ________________________________________________________*/
extern  unsigned int g_RWBuf[];

unsigned int mp3Volume;
extern  unsigned int F_SPI_ReadWord(void);
extern  F_SIO_SendData(unsigned int , unsigned int);
extern  F_SPI_WriteWord(unsigned int);

const unsigned char VolumeValue[] = {0xfefe,0x9e9e,0x8686,0x7878,0x7373,0x6e6e,0x6969,0x6464,0x5f5f,0x5a5a,0x5555,0x5050,0x4b4b,0x4646,0x4141,0x3b3b,0x3737,0x3232,0x2c2c,0x2828,0x2323,0x1e1e,0x1919,0x1414,0x0f0f,0x0a0a,0x0505,0x0000};
void MP3_VolumeDec()
{
	if(mp3Volume>0x00)
		mp3Volume--;
	MP3VolumeLevel(mp3Volume);
}

void MP3_VolumeInc()
{
	if( mp3Volume < (sizeof(VolumeValue)-1) )
		mp3Volume++;
	MP3VolumeLevel(mp3Volume);
}

void MP3_Init(void)
{
//	MUTE_GATE_HIGH()
	MA8201HardReset();
	DelayMS(10);
	MA8201ClearReset();			
	MA8201Disable();
	if(*P_IOB_Data&0x0004)
	{
		MA8201Enable();
		MA8201ClosePlaySong();
		MA8201HardReset();
		DelayMS(10);
		MA8201ClearReset();
		MA8201ClosePlaySong();
	}
	else
	 	MA8201Enable();
	 	
	MA8201WriteRegister(MA8201_VOL,0xfefe);	//(J)mute 
	MA8201InitialEQ();
	MA8201SelectEQ(0);	
}

void  MA8201WriteRegister(unsigned int wAddr, unsigned int wData)
{
	MA8201Enable();
	F_SPI_WriteWord(wAddr | MA8201_WRITE);
	F_SPI_WriteWord(wData);	
	MA8201Disable();
}

unsigned int MA8201ReadRegister(unsigned rAddr)
{
    unsigned int i;
	MA8201Enable();	
	F_SPI_WriteWord(rAddr | MA8201_READ); 
	i=F_SPI_ReadWord();
	MA8201Disable();	
	return(i);
}	

unsigned MA8201MultiWriteRegister(unsigned int *pWriteData)
{
	while( (*pWriteData != 0xff) || ((*(pWriteData+1)&0xff00) != 0xff00) || ( (*(pWriteData+1)&0x00ff ) !=0x00ff) )
	{
		MA8201WriteRegister( *pWriteData, *(pWriteData+1) );
		pWriteData+=3;
	}
}

const unsigned int MA8201_INITIAL_SETTING[]=
{
		0xff,0xffff
};

const unsigned int MA8201_PLAY_SONG_SETTING[]=
{
	MA8201_MODE,0x0000,
	MA8201_CLOCKF,0x0000,
	MA8201_STATUS,0x0000,
	0x00ff,0xffff
};

void MA8201InitialPlaySong(void)
{
	unsigned int i;
	while(1)
	{
		MA8201ClearReset();
		MA8201WriteRegister(MA8201_MODE,0x0004); 	//do software reset
		DelayMS(2);
		
		if(MA8201ReadRegister(MA8201_MODE)&0x0004)
		{
			MA8201HardReset();
			DelayMS(10);
			MA8201ClearReset();
			continue;
		}
		
		MA8201MultiWriteRegister(MA8201_PLAY_SONG_SETTING);
		
		for(i=0; i<10; i++);
			g_RWBuf[i];
		
		F_SIO_SendData(g_RWBuf, 10);
		DelayMS(10);
		break;
	}

	MP3VolumeLevel(mp3Volume);//max 25 0
//	MA8201WriteRegister(MA8201_VOL,0xfefe);	
	MA8201SelectEQ(0);
//	MA8201WriteRegister(MA8201_CLOCKF,0x8bb8);
	MA8201WriteRegister(MA8201_CLOCKF,0x9707);		
}

void MA8201ClosePlaySong(void)
{
	unsigned int i;
	for(i=0; i<512; i++)
		g_RWBuf[i]=0x00;
		
	for(i=0; i<4; i++)			
		F_SIO_SendData(g_RWBuf, 512);
	
	DelayMS(10); //delay 10ms
}

void MA8201InitialEQ(void)
{
	unsigned int i;
	i=0;
	while(EQ8201_Init[i] != 0xff)
	{
		*P_Watchdog_Clear=0x0001;
		MA8201WriteRegister(EQ8201_Init[i],EQ8201_Init[i+1]);
		i=i+2;
	}
}

const signed int T_EQ[]={1,4,12};

void MA8201SelectEQ(unsigned int mode)
{
	if (mode==1)
		MA8201WriteRegister(MA8201_A1ADDR,0x4200);	//(j) Active EQ
	
	MA8201WriteRegister(MA8201_A1CTRL0,0x0000);		//(j) Active EQ	
	if (mode)
	{
		mode=T_EQ[mode-1];
		MA8201WriteRegister(MA8201_A1CTRL0,mode);
	}
	else
		MA8201WriteRegister(MA8201_A1ADDR,0x0000);	//(j) Deactive EQ
}

void MP3VolumeLevel(unsigned int bLevel)
{
	MA8201WriteRegister(MA8201_VOL,VolumeValue[bLevel]);
}

⌨️ 快捷键说明

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