📄 mp3_player.c
字号:
/* Copyright (C) 1996-2005 Brilliant Ideal Electronics. All rights reserved.
MP3_Player+USB_Disk V3.0 Edit by JMBIE STUDIO 2005.07
*/
#include "AT89C51SND1_REG.H"
#include "MP3_PLAYER.H"
#include "UDISK_DEF.H"
#include "FILE_SYS.H"
#include "MCU_UART.H"
#include "LCD.H"
int RDCOUNT = 0;
unsigned char data MP3_Framehead[4];
unsigned char SONG[88]; //Not more than 8 songs
unsigned char data CurrentFun = SELECTSONG;
unsigned char data PlayState = STOP;
unsigned char data NowPlaying = 0;
unsigned char data NumofSong = 0;
unsigned char data MP3InitFlag= 1;
unsigned char data ChangeSong = 0;
unsigned char data KeyState = 0,KeyState1 = 0;
static void PllInit(void);
static void MP3Init(void);
static void AudioInit();
void MP3FsInit(unsigned char NDIV, unsigned int RDIV, unsigned char MPCD, unsigned char AUCD)
{
PLLNDIV = 0;
PLLRDIV = 0;
MP3CLK = 0;
AUDCLK = 0;
//PLLclk=(OSCclk*(RDIV+1))/(int)(NDIV+1)
PLLNDIV = 0x7f&NDIV; //set NDIV
PLLCON |= (0x3&RDIV) << 6; //set RDIV
PLLRDIV = (0x3ff&RDIV) >> 2;
//MP3CLK=PLLCLK/(int)(MPCD+1)
MP3CLK |= MPCD;
//AUDCLK=PLLCLK/(int)(AUCD+1)
AUDCLK |= AUCD;
}
void PllInit(void)
{
CKCON |= X2;
PLLCON &= (~PLLRES); //Enable PLL
PLLCON |= PLLEN;
}
void MP3Init(void)
{
MP3VOR = 0x0a;
MP3VOL = 0x0a;
MP3BAS = 0x10;
MP3MED = 0x10;
MP3TRE = 0x10;
MP3CON &= (~MSKREQ); //Clear to allow the
//MPREQ flag to generate a MP3 interrupt.
MP3CON |= MPEN; //enable the MP3 decoder.
}
void AudioInit()
{
unsigned char i = 10;
AUDCON0 = 0x77; //0111 0110
AUDCON1 &= (~0xB0); //SRC=0,MSREQ=0,MUDRN=0
AUDCON1 |= 0x01;
while (i)i--;
AUDCON1 |= 0x40;
}
void MP3_Init(void)
{
PllInit();
MP3Init();
AudioInit();
}
char PlayInit(unsigned char *SongName)
{
int i = 0, j = 0, f = 0;
int k = 0;
unsigned int total_size;
DataRead = 0;
RDCOUNT = ReadSector(SongName, Page_Buf); //Read 512 Bytes at first
if(RDCOUNT==0)
return 0;
/* when the first 3 bytes are 49 44 33 the next can be 03,this means ID3 V2.3 */
if (Page_Buf[0] == 0x49)
if ((Page_Buf[1] == 0x44) && (Page_Buf[2] == 0x33))
{
/********** search the 7th-10th bytes,use the formular to calculate ***********/
total_size = (Page_Buf[6] & 0x7F) * 0x200000 + (Page_Buf[7] & 0x7F) * 0x4000 + (Page_Buf[8] & 0x7F) * 0x80 + (Page_Buf[9] & 0x7F);
while (total_size > 512)
{
ReadSector(SongName, Page_Buf);
total_size -=512;
}
i = total_size;
}
if (Page_Buf[i] != 0xFF) //if not 0xFF,there is not the Frame head, but extend label
i += 10; //then add 10 Bytes
if ((Page_Buf[i] == 0xFF) && (Page_Buf[i + 1] & 0xF0 == 0xF0))//get MP3 information from FF FX XX XX 4bytes,
{
MP3_Framehead[0] = Page_Buf[i];
MP3_Framehead[1] = Page_Buf[i + 1];
MP3_Framehead[2] = Page_Buf[i + 2];
MP3_Framehead[3] = Page_Buf[i + 3];
}
if (MP3_Framehead[1] & 0x08)
{
switch ((MP3_Framehead[2] & 0x0C) >> 2)
{
case 0x00 : MP3FsInit(24, 126, 3, 5); break; //Fs=44.1kHz
case 0x01 : MP3FsInit(124, 575, 3, 4); break; //Fs=48kHz
case 0x02 : MP3FsInit(124, 511, 3, 9); AUDCON0 = 0x76; break;//Fs=32kHz
default : break;
}
}
else
{
switch ((MP3_Framehead[2] & 0x0C) >> 2)
{
case 0x00 : MP3FsInit(24, 126, 3, 11); break; //Fs=22.05kHz
case 0x01 : MP3FsInit(124, 575, 3, 9); break; //Fs=24kHz
case 0x02 : MP3FsInit(124, 511, 3, 19); AUDCON0 = 0x76; break; //Fs=16kHz
default : break;
}
}
return 1;
}
void PlayMP3(unsigned char *SongName)
{
int i =0,m =0;
while (1)
{
RDCOUNT = ReadSector(SongName, Page_Buf);
for (i=0; i<RDCOUNT; i++)
{
while (!(MP3STA1 & MPBREQ));
MP3DAT = Page_Buf[i];
}
//////////////////////////////////////////for LCD display
KeyState1=KeyState;
do{
switch(KeyState)
{ case 0: break;
case 1: LCD_printen(72,2,"VOLUME");break;
case 2: LCD_printen(72,2,"TONE ");break;
case 3: LCD_printen(72,2,LCD_chstr);
if(PlayState)
LCD_printen(72,3,"PLAY..");
else
LCD_printen(72,3,"STOP..");
break;
case 4: LCD_printen(72,3,"Down 1");break;
case 5: LCD_printen(72,3,"Down 2");break;
case 6: LCD_printen(72,3,"Up 1 ");break;
case 7: LCD_printen(72,3,"Up 2 ");break;
case 8: LCD_printen(72,3,"STOP..");break;
case 9: LCD_printen(72,3,"PLAY..");break;
}
//
}while (!PlayState); //Pause control
//////////////////////////////////////////
if(KeyState==KeyState1) KeyState = 0;
if (ChangeSong)
{
DataRead = 0;
ChangeSong = 0;
m =1;
}
if (RDCOUNT < 512)
{
NowPlaying++;
MP3InitFlag = 1;
m =1;
}
if(m)
{
while(MP3STA1 & MPFREQ)
MP3DAT = 0x00;
return;
}
}
}
void Func()
{
if (CurrentFun < 3)
CurrentFun++;
else if (CurrentFun == 3)
CurrentFun = 1;
switch(CurrentFun)
{case VOLUME: KeyState = 1;
//LCD_printen(72,2,"VOLUME");
break;
case EFFECTION: KeyState = 2;
//LCD_printen(72,2,"TONE ");
break;
case SELECTSONG: KeyState = 3;
//LCD_printen(72,2," ");
break;
}
}
void Next()
{
switch (CurrentFun)
{
case VOLUME :
if (MP3VOR > 0x00)
{
MP3VOR -= 0x01;
MP3VOL -= 0x01;
KeyState = 4;
//LCD_printen(72,3,"Down 1");
}
break;
case EFFECTION :
if (MP3BAS > 2)
{
MP3BAS -= 2;
MP3TRE += 2;
KeyState = 5;
//LCD_printen(72,3,"Down 2");
}
break;
case SELECTSONG :
if (NowPlaying == (NumofSong - 1))
NowPlaying = 0;
else
NowPlaying++;
MP3InitFlag = 1;
ChangeSong = 1;
break;
default: break;
}
}
void Previous()
{
switch (CurrentFun)
{
case VOLUME :
if (MP3VOR < 0x1f)
{
MP3VOR += 0x01;
MP3VOL += 0x01;
KeyState = 6;
//LCD_printen(72,3,"Up 1 ");
}
break;
case EFFECTION :
if (MP3BAS < 0x1e)
{
MP3BAS += 2;
MP3TRE -= 2;
KeyState = 7;
//LCD_printen(72,3,"Up 2 ");
}
break;
case SELECTSONG :
if (NowPlaying > 0)
NowPlaying--;
else
NowPlaying = NumofSong - 1;
MP3InitFlag = 1;
ChangeSong = 1;
break;
default: break;
}
}
void PlayPause()
{
PlayState = !PlayState;
//Mute(!PlayState);
if (PlayState==0)
{printu("STOP..\n");
KeyState = 8;
//LCD_printen(72,3,"STOP..");
}
else
{printu("PLAY.....\n");
KeyState = 9;
//LCD_printen(72,3,"PLAY..");
}
}
void Mute(unsigned char sw)
{
static char volume;
if(sw)
{
volume = MP3VOL;
MP3VOR = 0x00;
MP3VOL = 0x00;
AUDCON1 &= (~0x01);
MP3CON &= (~MPEN);
}
else
{
MP3VOR = volume;
MP3VOL = volume;
AUDCON1 |= 0x01;
MP3CON |= MPEN;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -