亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fat.c

?? 基于stm32的MP3播放器
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include"FAT.h"
//FAT部分代碼 					    
//正點原子@SCUT
//全局變量區域
DWORD FirstDirClust;    //根目錄簇號
DWORD FirstDataSector;	//數據區的第一個扇區
WORD BytesPerSector;	//每扇區字節數
DWORD FATsectors;		//FAT表所占扇區數
WORD SectorsPerClust;	//每簇扇區數
DWORD FirstFATSector;	//第一個FAT表(FAT1)所在扇區
DWORD FirstDirSector;	//第一個目錄扇區 fat32
DWORD RootDirSectors;	//根目錄所在扇區
DWORD RootDirCount;		//根目錄下目錄項數
BYTE FAT32_Enable;		//FAT32文件系統標志

u32 sys_ico[9];  //系統圖標緩存區!不能篡改!
u32 file_ico[4]; //文件圖標緩存區 folder;mus;pic;book;

const unsigned char *folder[7]=
{
"SYSTEM     ",
"FONT       ",
"SYSICO     ",
"GAME       ",
"LEVEL1     ",
"LEVEL2     ",
"LEVEL3     ",
};		   

//系統文件定義
const unsigned char *sysfile[15]=
{			  
"FONT16  FON",
"FONT12  FON",
//系統主界面圖標
"MUSIC   BMP",
"PICTURE BMP",
"GAME    BMP",
"ALARM   BMP",
"TIME    BMP",
"SETTING BMP",  
"TXT     BMP",
"RADIO   BMP",
"LIGHT   BMP",
//系統文件圖標	12開始
"FOLDER  BMP",
"MUS     BMP",
"PIC     BMP",
"BOOK    BMP",
};

//文件信息緩存區		   		    															   
FileInfoStruct F_Info[8];
//外部全局變量

//FAT 數據緩存區,不能和jpg_buffer共用.否則在FAT32文件系統里面,可能出錯!!
u8 fat_buffer[512];
u8 LongNameBuffer[MAX_LONG_NAME_SIZE];//長文件名的緩存區
BOOL LongNameFlag = 0;//是否存在長文件名的標志
     
//顯示一次數據流
void show_data(u8 *p,u16 num)
{			  
	u16 i=0;		  
	printf("TEMP DATA:\n");
	delay_ms(1000);		   
	for(i=0;i<num;i++)printf(" %x",*p++);
	printf("\ndata over\n");  
}	 
//FAT初始化,不含SD的初始化,用之前應先調用sd的初始化
unsigned char FAT_Init(void)//Initialize of FAT  need initialize SD first
{  		   
	bootsector710 *bs  = 0;
	bpb710        *bpb = 0;			  
	partrecord    *pr  = 0;

	DWORD hidsec=0;
	DWORD Capacity;
	
	Capacity = SD_GetCapacity();
	if(Capacity<0xff)return 1;			 
	if(SD_ReadSingleBlock(0,fat_buffer))return 1;
	bs = (bootsector710 *)fat_buffer;	
	pr = (partrecord *)((partsector *)fat_buffer)->psPart;//first partition
	hidsec = pr->prStartLBA;//the hidden sectors
	if(hidsec >= Capacity/512)hidsec = 0;	 
	else 
	{
		if(SD_ReadSingleBlock(pr->prStartLBA,fat_buffer))return 1;//read the bpb sector
		bs = (bootsector710 *)fat_buffer;
		if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)
		{
			hidsec = 0;
			if(SD_ReadSingleBlock(0,fat_buffer))return 1;//read the bpb sector
			bs = (bootsector710 *)fat_buffer;	
		}
	}

	if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)return 1;//對付沒有bootsect的sd卡	//dead with the card which has no bootsect
	bpb = (bpb710 *)bs->bsBPB;
	if(bpb->bpbFATsecs)//detemine thd FAT type  //do not support FAT12
	{
		FAT32_Enable=0;	//FAT16
		FATsectors		= bpb->bpbFATsecs;//FAT表占用的扇區數 
		FirstDirClust = 2;
	}
	else
	{
		FAT32_Enable=1;	//FAT32
		FATsectors		= bpb->bpbBigFATsecs;//FAT占用的扇區數	//the sectors number occupied by one fat talbe
		FirstDirClust = bpb->bpbRootClust;
	}

	BytesPerSector	= bpb->bpbBytesPerSec;      //每扇區字節數
	SectorsPerClust	= (BYTE)bpb->bpbSecPerClust;//每簇扇區數
	FirstFATSector	= bpb->bpbResSectors+hidsec;//第一個FAT表扇區
	RootDirCount	= bpb->bpbRootDirEnts;		//根目錄項數
	RootDirSectors	= (RootDirCount*32)>>9;		//根目錄占用的扇區數
	FirstDirSector	= FirstFATSector+bpb->bpbFATs*FATsectors;//第一個目錄扇區
	FirstDataSector	= FirstDirSector+RootDirSectors;//第一個數據扇區
	return 0; 
}     
//讀下一簇簇號
//Return the cluster number of next cluster of file
//Suitable for system which has limited RAM
unsigned long FAT_NextCluster(unsigned long cluster)
{
	DWORD sector;
	DWORD offset;  

	if(FAT32_Enable)offset = cluster/128;//FAT32的FAT表中,用四個字節表示一個粗地址.512/4=128
	else offset = cluster/256;			 //FAT16的FAT表中,用兩個字節表示一個粗地址.512/2=256
	if(cluster<2)return 0x0ffffff8;		 //簇0,1不能用于存放
	sector=FirstFATSector+offset;//計算實際扇區數
	if(SD_ReadSingleBlock(sector,fat_buffer))return 0x0ffffff8;//讀取FAT表,發生錯誤是返回0x0ffffff8
	if(FAT32_Enable)
	{
		offset=cluster%128;//查找位置
		sector=((unsigned long *)fat_buffer)[offset];	
	}
	else
	{
		offset=cluster%256;//查找位置
		sector=((unsigned short *)fat_buffer)[offset];
	}
	return (unsigned long)sector;//return the cluste number
}
//讀下一簇簇號
//cluster:當前簇號
//startcluster:文件開始的簇號
//返回值:cluster前一個簇的簇號
//返回0xfffffff8則錯誤!
unsigned long FAT_PrevCluster(unsigned long cluster,unsigned long startcluster)
{
	DWORD temp;
	DWORD tempcluster;					  
	tempcluster=startcluster;//從起始簇號開始查找
	if(cluster==startcluster)return 0x0ffffff8;//查找錯誤
	while(1)
	{ 
		temp=FAT_NextCluster(tempcluster);  //查找當前簇的下一簇
		if(temp==cluster)return tempcluster;//下一簇就等于最終簇,返回前一簇,就是最終簇的上一簇
		else tempcluster=temp;				//繼續下一簇查找
		if(temp==0x0ffffff8)return 0x0ffffff8;//查找錯誤
	}
}
//將簇號轉變為扇區號
u32 fatClustToSect(u32 cluster)
{
	return FirstDataSector+(DWORD)(cluster-2)*(DWORD)SectorsPerClust;	 
}

//文件類型
//返回值:對應的類型   0,mp3;1,wma;2,wav,3,mid;4,lrc;5,txt;6,c;7,h;8,jpg;9,jpeg;10,bmp;11,file;12,FON;   
const unsigned char *filetype[13]={"MP3","WMA","WAV","MID","LRC","TXT","C  ","H  ","JPG","JPE","BMP","   ","FON"};
//返回擴展名類型
//輸入:exName 文件擴展名
u16 FileType_Tell(u8 * exName)
{
    u8 i;
    u8 t;   
    for(i=0;i<13;i++)
    { 
        for(t=0;t<3;t++)if(exName[t]!=filetype[i][t])break; 
        if(t==3)break;
    } 
    return 1<<i;//返回文件類型
}  

//復制記錄項信息
void CopyDirentruyItem(FileInfoStruct *Desti,direntry *Source)
{
	BYTE i;
	for(i=0;i<8;i++)Desti->F_ShortName[i]=Source->deName[i];//復制短文件名
	Desti->F_Type         = FileType_Tell(Source->deExtension);
	Desti->F_StartCluster = Source->deStartCluster + (((unsigned long)Source->deHighClust)<<16);//不用管
	Desti->F_Size         = Source->deFileSize;
	Desti->F_Attr         = Source->deAttributes;
	Desti->F_CurClust     = 0;//扇區...
	Desti->F_Offset       = 0;//偏移0 	

	//FAT的簇號不能是0(更目錄簇號)
	if(FAT32_Enable&&Desti->F_StartCluster==0)  
	{																  
		Desti->F_StartCluster=FirstDirClust;//改變這個簇號.使其等于根目錄所在簇號!!
	}   
	if(LongNameFlag)//存在長文件名
	{
		LongNameBuffer[MAX_LONG_NAME_SIZE-1] = 0;
		LongNameBuffer[MAX_LONG_NAME_SIZE-2] = 0;
		UniToGB(LongNameBuffer);  //把Unicode代碼轉換為ASICII碼
		for(i=0;i<80;i++)Desti->F_Name[i] = LongNameBuffer[i];//復制長文件名
	}else //短文件名
	{	
		if(Source->deName[0]==0x2e)//得到一個父目錄(修改為:":\")
		{	
			//保存父目錄簇號   
			Fat_Dir_Cluster=Desti->F_StartCluster; 	 
			Desti->F_Name[0]=':';
			Desti->F_Name[1]=0x5c;//'\'
			Desti->F_Name[2]='\0';//加入結束符
		}else	    			  //普通文件
		{
			for(i=0;i<11;i++)Desti->F_Name[i] = Source->deName[i];//復制短文件名  
			Desti->F_Name[11]='\0';//加入結束符
		}
	} 															   	  								  
	return ;
}


//瀏覽目標文件夾下面的一個文件類
//dir_clust:當前目錄所在簇號
//FileInfo :目標文件的實體對象(FileInfoStruct體)
//type     :要查找的文件類型:1<<0,mp3;1<<1,wma;1<<2,wav,1<<3,mid;1<<4,1<<lrc;
//                           1<<5,txt;1<<6,jpg;1<<7,jpeg;1<<8,bmp;1<<9,file; 
//count    :0,返回當前目錄下,該類型文件的個數;不為零時,返回第count個文件的詳細信息
//返回值   :1,操作成功.0,操作失敗
u8 Get_File_Info(u32 dir_clust,FileInfoStruct *FileInfo,u16 type,u16 *count)
{ 			  	   
	DWORD sector;
	DWORD cluster=dir_clust;
	DWORD tempclust;
	unsigned char cnt;
	unsigned int offset;		 
	unsigned short cont=0;//文件索引標志 <65536
	unsigned char j; //long name fat_buffer offset;
	unsigned char *p;//long name fat_buffer pointer
	direntry *item = 0;
	winentry *we =0;	  
	cont=0;
	LongNameFlag = 0;//清空長文件名標志

	//SD_Init();//初始化SD卡,在意外拔出之后可以正常使用
	//goto SD;
	if(cluster==0 && FAT32_Enable==0)//FAT16根目錄讀取
	{			 
		for(cnt=0;cnt<RootDirSectors;cnt++)
		{
			if(SD_ReadSingleBlock(FirstDirSector+cnt,fat_buffer))return 1;//讀數錯誤
//SD:			for(offset=0;offset<512;offset++)fat_buffer[offset]=temp_buf[offset];	   
			for(offset=0;offset<512;offset+=32)
			{
				item=(direntry *)(&fat_buffer[offset]);//指針轉換
				//找到一個可用的文件
				if((item->deName[0]!=0x2E)&&(item->deName[0]!=0x00)&&(item->deName[0]!=0xe5)
				||((item->deName[0]==0x2E)&&(item->deName[1]==0x2E)))//找到一個合法文件.忽略".",使用".."
				{		   
					if(item->deAttributes == 0x0f)//找到一個長文件名
					{
						we = (winentry *)(&fat_buffer[offset]);
						j = 26 *( (we->weCnt-1) & WIN_CNT);//長文件名的長度
                        if(j<MAX_LONG_NAME_SIZE-25)
						{
							p = &LongNameBuffer[j];//偏移到目標地址
							for (j=0;j<10;j++)	*p++ = we->wePart1[j];			
							for (j=0;j<12;j++)	*p++ = we->wePart2[j];
							for (j=0;j<4;j++)	*p++ = we->wePart3[j];	
							if (we->weCnt & 0x40) (*(unsigned int *)p) = 0;  				
							if ((we->weCnt & WIN_CNT) == 1) LongNameFlag = 1;//最后一個長文件項找到了	
						}	    
					}else 
					{  	 										 									 
						if(type&FileType_Tell(item->deExtension))//找到一個目標文件
						{
							cont++;//文件索引增加
						 }
						 //查找該目錄下,type類型的文件個數
						if(*count&&cont==*count)
						{
							//printf("\ncount:%d",*count);
							CopyDirentruyItem(FileInfo,item);//復制目錄項,提取詳細信息 
							return 1;//找到目標文件成功	 
						}
						LongNameFlag=0;//清空長文件名
					}
				}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产在天天线2019| 久久无码av三级| 欧美不卡一区二区三区四区| 国产精品精品国产色婷婷| 五月天婷婷综合| av电影天堂一区二区在线| 日韩亚洲国产中文字幕欧美| 亚洲视频图片小说| 国产伦精品一区二区三区免费 | 国产日韩欧美精品综合| 亚洲免费在线观看视频| 成人性色生活片免费看爆迷你毛片| 4438x亚洲最大成人网| 亚洲日本乱码在线观看| 国产馆精品极品| 日韩精品一区二区三区视频播放| 亚洲国产va精品久久久不卡综合| av在线不卡免费看| 久久色视频免费观看| 久久国产精品第一页| 欧美日韩国产大片| 亚洲激情自拍偷拍| 91美女片黄在线观看91美女| 国产精品入口麻豆九色| 国产精品正在播放| 久久久久久久久蜜桃| 毛片av一区二区三区| 日韩一区二区在线免费观看| 婷婷综合另类小说色区| 欧美在线啊v一区| 亚洲午夜视频在线观看| 欧美影院午夜播放| 亚洲国产日产av| 欧美日韩在线播放三区| 亚洲线精品一区二区三区八戒| 欧美综合久久久| 亚洲国产成人av网| 日韩一区二区三| 久久精品国产亚洲高清剧情介绍| 日韩欧美中文字幕制服| 捆绑调教美女网站视频一区| 欧美大片拔萝卜| 国产一区在线看| 欧美国产亚洲另类动漫| 99热在这里有精品免费| 一区二区三区四区不卡在线| 欧美午夜影院一区| 免费在线欧美视频| 久久精品一区二区三区av| 成人激情综合网站| 亚洲欧美色图小说| 欧美精选午夜久久久乱码6080| 日日夜夜精品视频免费| 亚洲精品一区二区三区影院| 国产91丝袜在线播放| 亚洲免费观看视频| 5566中文字幕一区二区电影| 国内国产精品久久| 一区二区中文视频| 这里只有精品视频在线观看| 国产精品自拍在线| 自拍偷拍欧美精品| 91精品国产麻豆国产自产在线 | 在线电影院国产精品| 麻豆91精品91久久久的内涵| 欧美经典三级视频一区二区三区| 91免费视频大全| 美国三级日本三级久久99| 国产精品视频你懂的| 欧美日韩国产天堂| 成人一二三区视频| 偷拍与自拍一区| 国产精品美女久久久久av爽李琼| 欧美三电影在线| 国产不卡视频在线观看| 丝袜脚交一区二区| 国产精品久久精品日日| 日韩一区二区三| 在线亚洲精品福利网址导航| 国产一区在线精品| 亚洲成a天堂v人片| 亚洲欧洲精品天堂一级 | 国产精品网曝门| 欧美一区二区三区视频| 99re8在线精品视频免费播放| 久久精品国产成人一区二区三区 | 日韩一区二区麻豆国产| 91国产精品成人| 国产91色综合久久免费分享| 美女一区二区久久| 亚洲一区二区视频在线| 国产精品久久久久久久午夜片| 日韩三级视频中文字幕| 欧美日韩国产综合草草| 一本到高清视频免费精品| 国产精品中文字幕欧美| 免费精品99久久国产综合精品| 亚洲精品视频自拍| 欧美国产欧美综合| 久久蜜桃香蕉精品一区二区三区| 9191成人精品久久| 欧美揉bbbbb揉bbbbb| 在线观看亚洲精品| 色久优优欧美色久优优| 岛国av在线一区| 高清在线不卡av| 国产精品一区2区| 国产综合久久久久久鬼色| 免费看欧美美女黄的网站| 日韩电影一区二区三区四区| 亚洲一区二区三区自拍| 亚洲图片欧美一区| 一区二区三区在线视频免费观看| 亚洲欧美怡红院| **性色生活片久久毛片| 自拍偷拍国产精品| 亚洲欧美日韩国产综合| 尤物在线观看一区| 亚洲午夜私人影院| 天堂成人免费av电影一区| 日韩中文字幕1| 看国产成人h片视频| 国产在线精品一区二区不卡了| 国内精品在线播放| 春色校园综合激情亚洲| 成人黄色网址在线观看| 91啪亚洲精品| 欧美日韩另类一区| 日韩欧美视频在线| 久久久久久97三级| 一区在线中文字幕| 亚洲国产成人高清精品| 岛国一区二区在线观看| 97久久精品人人爽人人爽蜜臀 | 欧美人成免费网站| 91精品国产色综合久久ai换脸 | 中文字幕在线观看不卡| 一区二区三区小说| 日韩电影一二三区| 国产麻豆视频一区二区| av欧美精品.com| 欧美午夜不卡在线观看免费| 欧美一区二区三区四区视频| 久久久亚洲精品一区二区三区| 亚洲国产精品99久久久久久久久| 亚洲视频一区二区在线| 日韩电影在线一区二区| 成人综合日日夜夜| 欧美三区免费完整视频在线观看| 欧美一区二区三级| 国产精品久久夜| 图片区小说区区亚洲影院| 国产精品一区二区免费不卡| 91福利精品视频| 精品国产一区二区亚洲人成毛片 | 成人高清免费在线播放| 欧美日韩一卡二卡三卡| 国产日韩av一区| 五月天精品一区二区三区| 国产成人综合精品三级| 欧美裸体一区二区三区| 国产日韩精品久久久| 五月婷婷欧美视频| 成人午夜激情在线| 日韩三级在线观看| 亚洲午夜一二三区视频| 国产精品中文欧美| 777午夜精品免费视频| 18涩涩午夜精品.www| 免费观看在线综合| 欧美在线免费观看亚洲| 中文字幕不卡在线| 久久国产夜色精品鲁鲁99| 欧美在线观看禁18| 国产精品国产a| 国产精品一区免费在线观看| 欧美精品乱码久久久久久按摩 | 精品国产123| 亚洲成人激情自拍| 色综合久久中文字幕综合网 | 粉嫩av一区二区三区粉嫩| 91精品欧美福利在线观看| 亚洲精品v日韩精品| 不卡高清视频专区| 久久久久国产精品人| 久久精品国产秦先生| 4438x亚洲最大成人网| 亚洲成a人片在线不卡一二三区| 99久久精品免费看国产免费软件| 久久人人97超碰com| 精品夜夜嗨av一区二区三区| 欧美美女视频在线观看| 亚洲午夜精品久久久久久久久| 91看片淫黄大片一级| 成人免费在线视频| www.色综合.com| 亚洲欧洲日韩在线| 99久久精品99国产精品| 中文字幕一区二区日韩精品绯色| 成人污污视频在线观看|