📄 fat32.h
字号:
void fat32_init()
{
u16 ii;
u8 DPT[16]; //储存DPT数据所用数组,一个分区表16字节
u8 BPB[90]; //储存BPB数据所用数组,DBR前90字节有效
u32 DBR; //计算DBR扇区
u32 DBRBye; //计算DBR扇区地址
u16 Retain; //计算保留扇区
u32 Fat; //计算Fat表扇区
u32 OneFatBlock; //一个Fat表的扇区数
SD_ReadSingleBlock(0,buffer);
if(buffer[0]!=0xeb)
{
for(ii=0;ii<16;ii++)
{
DPT[ii]=buffer[446+ii];
}
DBR=DPT[11]<<24|DPT[10]<<16|DPT[9]<<8|DPT[8];
DBRBye=DBR*512;
}
else
{
DBR=0;
}
SD_ReadSingleBlock(DBRBye,buffer);
for(ii=0;ii<90;ii++)
{
BPB[ii]=buffer[ii];
}
Retain=BPB[15]<<8|BPB[14];
Fat=DBR+Retain;
OneFatBlock=BPB[39]<<24|BPB[38]<<16|BPB[37]<<8|BPB[36];
FirstBlock=OneFatBlock*2+Fat;
}
void music()
{
u16 d,ii,bb,i=0,aa=0,jj=0,mm=0;
u8 cc[26];
Show_Str(63,0,"找到的音乐文件",16,1);
while(1)
{
SD_ReadSingleBlock(FirstBlock*512+i*512,buffer);
i++;
for(d=mm*32;d<512;d=d+32)
{
if(((buffer[0+d]!=0x2E)&&(buffer[0+d]!=0x00)&&(buffer[0+d]!=0xe5))||((buffer[0+d]==0x2E)&&(buffer[1+d]==0x2E)))
{
if(buffer[11+d] == 0x0f)//找到一个长文件名
{
if(buffer[0+d]==0x42)
{
if(d<=447)mm=0;
if(d>=448)mm=1;
if(d>=480)mm=2;
d+=64;
goto rst;
}
for(ii=0;ii<10;ii++) //提取前5个字符
{
cc[ii]=buffer[d+ii+1];
}
for(ii=0;ii<12;ii++) //提取第6-12个字符
{
cc[ii+10]=buffer[d+ii+14];
}
for(ii=0;ii<4;ii++) //提取12-16个字符
{
cc[ii+22]=buffer[d+ii+28];
}
UniToGB(cc);
for(ii=0;ii<26;ii++) //提取长文件名中的mp3后缀,是mp3则显示出来
{
if(cc[ii]=='m')
{
if(cc[ii+1]=='p')
{
if(cc[ii+2]=='3')
{
cc[ii+3]=0;
Show_Str(0,16+jj,cc,16,1);
jj+=16; //换行
d+=32;
for(ii=0;ii<32;ii++)
{
Music[aa*32+ii]=buffer[d+ii];
}
aa++; //歌曲记数,每页显示15首
if(aa==15)goto Break; //如果达到15首,退出循环
goto rst; //退出检测
}
}
}
}
}
else if(buffer[11+d] == 0x20)
{
for(ii=0;ii<8;ii++) //提取文件名
{
cc[ii]=buffer[d+ii];
}
for(ii=0;ii<8;ii++)
{
if(cc[ii]==0x20)
{
bb=ii;
goto asdf;
}
else
{
bb=8;
}
}
asdf: cc[bb]='.';
cc[bb+1]=buffer[d+8];
cc[bb+2]=buffer[d+9];
cc[bb+3]=buffer[d+10];
cc[bb+4]=0x00;
for(ii=0;ii<12;ii++)
{
if(cc[ii]=='M')
{
if(cc[ii+1]=='P')
{
if(cc[ii+2]=='3')
{
Show_Str(0,16+jj,cc,16,1);
jj+=16;
for(ii=0;ii<32;ii++)
{
Music[aa*32+ii]=buffer[d+ii];
}
aa++; //歌曲记数,每页显示15首
if(aa==15)goto Break;
goto rst;
}
}
}
}
}
}
else if(buffer[0+d]==0x00)
{
goto Break;
}
rst:
}
}
Break:
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -