新手上路
- 积分
- 27
- 金钱
- 27
- 注册时间
- 2018-7-14
- 在线时间
- 6 小时
|
5金钱
本帖最后由 aucheng 于 2018-7-28 22:27 编辑
RT,希望各位大佬指教一下,下面是图和我的代码,还有我的MP3模块是正点原子的VS1053MP3模块,但是我的开发板不是探索者的板,是我自己画的F4板,MP3模块代码仿照F1战舰板的代码,这部分代码中的引脚初始化也改成了我的F4板的代码,其余代码仿照探索者的板的代码。
#include "mp3player.h"
#include "vs10xx.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "malloc.h"
#include "text.h"
#include "string.h"
#include "exfuns.h"
#include "ff.h"
#include "flac.h"
#include "usart.h"
void mp3_index_show(u16 index,u16 total)
{
LCD_ShowxNum(30+0,230,index,3,16,0X80);
LCD_ShowChar(30+24,230,'/',16,0);
LCD_ShowxNum(30+32,230,total,3,16,0X80);
}
void mp3_vol_show(u8 vol)
{
LCD_ShowString(30+110,230,200,16,16,"VOL:");
LCD_ShowxNum(30+142,230,vol,2,16,0X80);
}
u16 f_kbps=0;
void mp3_msg_show(u32 lenth)
{
static u16 playtime=0;//²¥·Åʱ¼ä±ê¼Ç
u16 time=0;// ʱ¼ä±äÁ¿
u16 temp=0;
if(f_kbps==0xffff)
{
playtime=0;
f_kbps=VS_Get_HeadInfo();
}
time=VS_Get_DecodeTime();
if(playtime==0)playtime=time;
else if((time!=playtime)&&(time!=0))
{
playtime=time;
temp=VS_Get_HeadInfo();
if(temp!=f_kbps)
{
f_kbps=temp;
}
LCD_ShowxNum(30,210,time/60,2,16,0X80);
LCD_ShowChar(30+16,210,':',16,0);
LCD_ShowxNum(30+24,210,time%60,2,16,0X80);
LCD_ShowChar(30+40,210,'/',16,0);
//ÏÔʾ×Üʱ¼ä
if(f_kbps)time=(lenth/f_kbps)/125;
else time=0;
LCD_ShowxNum(30+48,210,time/60,2,16,0X80);
LCD_ShowChar(30+64,210,':',16,0);
LCD_ShowxNum(30+72,210,time%60,2,16,0X80);
//ÏÔʾλÂÊ
LCD_ShowxNum(30+110,210,f_kbps,3,16,0X80); //ÏÔʾλÂÊ
LCD_ShowString(30+134,210,200,16,16,"Kbps");
LED0=!LED0; //DS0·­×ª
}
}
//µÃµ½path·¾¶ÏÂ,Ä¿±êÎļþµÄ×ܸöÊý
//path:·¾¶
//·µ»ØÖµ:×ÜÓÐЧÎļþÊý
u16 mp3_get_tnum(u8 *path)
{
u8 res;
u16 rval=0;
DIR tdir; //ÁÙʱĿ¼
FILINFO tfileinfo; //ÁÙʱÎļþÐÅÏ¢
u8 *fn;
res=f_opendir(&tdir,(const TCHAR*)path); //´ò¿ªÄ¿Â¼
tfileinfo.lfsize=_MAX_LFN*2+1; //³¤ÎļþÃû×î´ó³¤¶È
tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize); //Ϊ³¤Îļþ»º´æÇø·ÖÅäÄÚ´æ
if(res==FR_OK&&tfileinfo.lfname!=NULL)
{
while(1)//²éѯ×ܵÄÓÐЧÎļþÊý
{
res=f_readdir(&tdir,&tfileinfo); //¶ÁȡĿ¼ÏµÄÒ»¸öÎļþ
if(res!=FR_OK||tfileinfo.fname[0]==0)break; //´íÎóÁË/µ½Ä©Î²ÁË,Í˳ö
fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);
res=f_typetell(fn);
if((res&0XF0)==0X40)//È¡¸ßËÄλ,¿´¿´ÊDz»ÊÇÒôÀÖÎļþ
{
rval++;//ÓÐЧÎļþÊýÔö¼Ó1
}
}
}
myfree(SRAMIN,tfileinfo.lfname);
return rval;
}
//²¥·ÅÒôÀÖ
void mp3_play(void)
{
u8 res;
DIR mp3dir; //Ŀ¼
FILINFO mp3fileinfo;//ÎļþÐÅÏ¢
u8 *fn; //³¤ÎļþÃû
u8 *pname; //´øÂ·¾¶µÄÎļþÃû
u16 totmp3num; //ÒôÀÖÎļþ×ÜÊý
u16 curindex; //ͼƬµ±Ç°Ë÷Òý
u8 key; //¼üÖµ
u16 temp;
u16 *mp3indextbl; //ÒôÀÖË÷Òý±í
while(f_opendir(&mp3dir,"0:/MUSIC"))//´ò¿ªÍ¼Æ¬Îļþ¼Ð
{
Show_Str(30,190,240,16,"MUSICÎļþ¼Ð´íÎó!",16,0);
delay_ms(200);
LCD_Fill(30,190,240,206,WHITE);//Çå³ýÏÔʾ
delay_ms(200);
}
totmp3num=mp3_get_tnum("0:/MUSIC"); //µÃµ½×ÜÓÐЧÎļþÊý
while(totmp3num==NULL)//ÒôÀÖÎļþ×ÜÊýΪ0
{
Show_Str(30,190,240,16,"ûÓÐÒôÀÖÎļþ!",16,0);
delay_ms(200);
LCD_Fill(30,190,240,146,WHITE);//Çå³ýÏÔʾ
delay_ms(200);
}
mp3fileinfo.lfsize=_MAX_LFN*2+1; //³¤ÎļþÃû×î´ó³¤¶È
mp3fileinfo.lfname=mymalloc(SRAMIN,mp3fileinfo.lfsize); //Ϊ³¤Îļþ»º´æÇø·ÖÅäÄÚ´æ
pname=mymalloc(SRAMIN,mp3fileinfo.lfsize); //Ϊ´øÂ·¾¶µÄÎļþÃû·ÖÅäÄÚ´æ
mp3indextbl=mymalloc(SRAMIN,2*totmp3num); //ÉêÇë2*totmp3num¸ö×Ö½ÚµÄÄÚ´æ,ÓÃÓÚ´æ·ÅÒôÀÖÎļþË÷Òý
while(mp3fileinfo.lfname==NULL||pname==NULL||mp3indextbl==NULL)//ÄÚ´æ·ÖÅä³ö´í
{
Show_Str(30,190,240,16,"ÄÚ´æ·ÖÅäʧ°Ü!",16,0);
delay_ms(200);
LCD_Fill(30,190,240,146,WHITE);//Çå³ýÏÔʾ
delay_ms(200);
}
VS_HD_Reset();
VS_Soft_Reset();
vsset.mvol=250; //ĬÈÏÉèÖÃÒôÁ¿Îª220.
mp3_vol_show((vsset.mvol-100)/5); //ÒôÁ¿ÏÞÖÆÔÚ:100~250,ÏÔʾµÄʱºò,°´ÕÕ¹«Ê½(vol-100)/5,ÏÔʾ,Ò²¾ÍÊÇ0~30
//¼Ç¼Ë÷Òý
res=f_opendir(&mp3dir,"0:/MUSIC"); //´ò¿ªÄ¿Â¼
if(res==FR_OK)
{
curindex=0;//µ±Ç°Ë÷ÒýΪ0
while(1)//È«²¿²éѯһ±é
{
temp=mp3dir.index; //¼Ç¼µ±Ç°index
res=f_readdir(&mp3dir,&mp3fileinfo); //¶ÁȡĿ¼ÏµÄÒ»¸öÎļþ
if(res!=FR_OK||mp3fileinfo.fname[0]==0)break; //´íÎóÁË/µ½Ä©Î²ÁË,Í˳ö
fn=(u8*)(*mp3fileinfo.lfname?mp3fileinfo.lfname:mp3fileinfo.fname);
res=f_typetell(fn);
if((res&0XF0)==0X40)//È¡¸ßËÄλ,¿´¿´ÊDz»ÊÇÒôÀÖÎļþ
{
mp3indextbl[curindex]=temp;//¼Ç¼Ë÷Òý
curindex++;
}
}
}
curindex=0; //´Ó0¿ªÊ¼ÏÔʾ
res=f_opendir(&mp3dir,(const TCHAR*)"0:/MUSIC"); //´ò¿ªÄ¿Â¼
while(res==FR_OK)//´ò¿ª³É¹¦
{
dir_sdi(&mp3dir,mp3indextbl[curindex]); //¸Ä±äµ±Ç°Ä¿Â¼Ë÷Òý
res=f_readdir(&mp3dir,&mp3fileinfo); //¶ÁȡĿ¼ÏµÄÒ»¸öÎļþ
if(res!=FR_OK||mp3fileinfo.fname[0]==0)break; //´íÎóÁË/µ½Ä©Î²ÁË,Í˳ö
fn=(u8*)(*mp3fileinfo.lfname?mp3fileinfo.lfname:mp3fileinfo.fname);
strcpy((char*)pname,"0:/MUSIC/"); //¸´ÖÆÂ·¾¶(Ŀ¼)
strcat((char*)pname,(const char*)fn); //½«ÎļþÃû½ÓÔÚºóÃæ
LCD_Fill(30,190,240,190+16,WHITE); //Çå³ý֮ǰµÄÏÔʾ
Show_Str(30,190,240-30,16,fn,16,0); //ÏÔʾ¸èÇúÃû×Ö
mp3_index_show(curindex+1,totmp3num);
key=mp3_play_song(pname); //²¥·ÅÕâ¸öMP3
if(key==2) //ÉÏÒ»Çú
{
if(curindex)curindex--;
else curindex=totmp3num-1;
}else if(key<=1)//ÏÂÒ»Çú
{
curindex++;
if(curindex>=totmp3num)curindex=0;//µ½Ä©Î²µÄʱºò,×Ô¶¯´ÓÍ·¿ªÊ¼
}else break; //²úÉúÁË´íÎó
}
myfree(SRAMIN,mp3fileinfo.lfname); //ÊÍ·ÅÄÚ´æ
myfree(SRAMIN,pname); //ÊÍ·ÅÄÚ´æ
myfree(SRAMIN,mp3indextbl); //ÊÍ·ÅÄÚ´æ
}
//²¥·ÅÒ»ÇúÖ¸¶¨µÄ¸èÇú
//·µ»ØÖµ:0,Õý³£²¥·ÅÍê³É
// 1,ÏÂÒ»Çú
// 2,ÉÏÒ»Çú
// 0XFF,³öÏÖ´íÎóÁË
u8 mp3_play_song(u8 *pname)
{
FIL* fmp3;
u16 br;
u8 res,rval;
u8 *databuf;
u16 i=0;
u8 key;
rval=0;
fmp3=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//ÉêÇëÄÚ´æ
databuf=(u8*)mymalloc(SRAMIN,4096); //¿ª±Ù4096×Ö½ÚµÄÄÚ´æÇøÓò
if(databuf==NULL||fmp3==NULL)rval=0XFF ;//ÄÚ´æÉêÇëʧ°Ü.
if(rval==0)
{
VS_Restart_Play(); //ÖØÆô²¥·Å
VS_Set_All(); //ÉèÖÃÒôÁ¿µÈÐÅÏ¢
VS_Reset_DecodeTime(); //¸´Î»½âÂëʱ¼ä
res=f_typetell(pname); //µÃµ½Îļþºó׺
if(res==0x4c)//Èç¹ûÊÇflac,¼ÓÔØpatch
{
VS_Load_Patch((u16*)vs1053b_patch,VS1053B_PATCHLEN);
}
res=f_open(fmp3,(const TCHAR*)pname,FA_READ);//´ò¿ªÎļþ ''
if(res==0)//´ò¿ª³É¹¦.
{
VS_SPI_SpeedHigh(); //¸ßËÙ
while(rval==0)
{
res=f_read(fmp3,databuf,4096,(UINT*)&br);//¶Á³ö4096¸ö×Ö½Ú
i=0;
do//Ö÷²¥·ÅÑ­»·
{
if(VS_Send_MusicData(databuf+i)==0)//¸øVS10XX·¢ËÍÒôƵÊý¾Ý
{
i+=32;
}else
{
key=9;
switch(key)
{
case KEY0_PRES:
rval=1; //ÏÂÒ»Çú
break;
case KEY2_PRES:
rval=2; //ÉÏÒ»Çú
break;
case WKUP_PRES: //ÒôÁ¿Ôö¼Ó
if(vsset.mvol<250)
{
vsset.mvol+=5;
VS_Set_Vol(vsset.mvol);
}else vsset.mvol=250;
mp3_vol_show((vsset.mvol-100)/5); //ÒôÁ¿ÏÞÖÆÔÚ:100~250,ÏÔʾµÄʱºò,°´ÕÕ¹«Ê½(vol-100)/5,ÏÔʾ,Ò²¾ÍÊÇ0~30
break;
case KEY1_PRES: //ÒôÁ¿¼õ
if(vsset.mvol>100)
{
vsset.mvol-=5;
VS_Set_Vol(vsset.mvol);
}else vsset.mvol=100;
mp3_vol_show((vsset.mvol-100)/5); //ÒôÁ¿ÏÞÖÆÔÚ:100~250,ÏÔʾµÄʱºò,°´ÕÕ¹«Ê½(vol-100)/5,ÏÔʾ,Ò²¾ÍÊÇ0~30
break;
}
mp3_msg_show(fmp3->fsize);//ÏÔʾÐÅÏ¢
}
}while(i<4096);//Ñ­»··¢ËÍ4096¸ö×Ö½Ú
if(br!=4096||res!=0)
{
rval=0;
break;//¶ÁÍêÁË.
}
}
f_close(fmp3);
}else rval=0XFF;//³öÏÖ´íÎó
}
myfree(SRAMIN,databuf);
myfree(SRAMIN,fmp3);
return rval;
}
|
-
LCD显示MP3信息
-
串口接收到的MP3 RAM测试值
|