|
发表于 2006-11-16 19:51:27
|
显示全部楼层
以下是本人测试SD卡时用的播放程序,效果还不错,有兴趣的朋友可以参考参考!
//播放MP3程序
void mp3_play(unsigned long FirstClust)
{
unsigned long LBA,NextCluster;
unsigned int i,data_pointer,rate,data;
unsigned char n,t1;
NextCluster = FirstClust;
while (1)
{
LBA =fatClustToSect(NextCluster);
for (i=0;i<SectorsPerCluster;i++)
{
if(flag==0)
ReadBlock(LBA+i); //读完后文件指针自动后移
//按键处理程序
//ST/PS键按下
if(!(PINE&STOP))
{
delay_nms(20);
if(!(PINE&STOP))
{
flag^=0x01;
}
}
//VOLUP键按下
if(!(PINE&VOLDOWN))
{
delay_nms(20);
if(!(PINE&VOLDOWN))
{
vol=vol+((unsigned int)(2<<8)+2);
if(vol>=0xF0F0)
vol=0xF0F0;
else
VS1003_cmd_write(0x0b,vol); //每次左右声道VOL减2
}
}
//VOLDOWN键按下
if(!(PINE&VOLUP))
{
delay_nms(20);
if(!(PINE&VOLUP))
{
vol=vol-((unsigned int)(2<<8)+2);
if(vol<=0x0505)
vol=0x0505;
else
VS1003_cmd_write(0x0b,vol); //每次左右声道VOL加2
}
}
//NEXT键按下
if(!(PINE&NEXTSONG))
{
delay_nms(20);
if(!(PINE&NEXTSONG))
{
goto NEXT; //跳到下一首歌曲
}
}
//PREV键按下
if(!(PINE&PREVSONG))
{
delay_nms(20);
if(!(PINE&PREVSONG))
{
t=t-2;
goto NEXT; //返回前一首歌曲
}
}
data_pointer=0;
while(data_pointer<512)
{
if(VS1003_DREQ_PIN&VS1003_DREQ_BIT)
{
for(n=0;n<32;n++)
{
VS1003_data_write(BUFFER[data_pointer]);
data_pointer++;
}
}
if (data_pointer==511)
break; //如果现在的数据不够了,则跳出来
}
}
NextCluster = fatNextCluster(NextCluster);
if(NextCluster >=(CLUST_RSRVD&FAT_MASK))
break;
}
NEXT: delay_nms(50); /* 下一首歌曲*/
} |
|