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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? save.c

?? 多功能MP3代碼
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
#include"FAT.h"

DWORD FirstDirClust;    //第一個(gè)目錄簇號(hào)
DWORD FirstDataSector;	// 數(shù)據(jù)區(qū)的第一個(gè)扇區(qū)
WORD BytesPerSector;	// 每扇區(qū)字節(jié)數(shù)
DWORD FATsectors;		// 一個(gè)FAT表所占扇區(qū)數(shù)
WORD SectorsPerClust;	// 每簇扇區(qū)數(shù)
DWORD FirstFATSector;	// 第一個(gè)FAT表所在扇區(qū)
DWORD FirstDirSector;	// 第一個(gè)目錄扇區(qū)
DWORD RootDirSectors;	// 根目錄所在扇區(qū)
DWORD RootDirCount;		// 根目錄下目錄項(xiàng)數(shù)
BYTE FAT32_Enable;

BYTE TABLE_READ = 0;
DWORD START_CLUSTER = 0x0ffffff8;	//when the mcu has large ram
BYTE FAT_TABLE[512];				//when the mcu has large ram


BYTE LongNameBuffer[MAX_LONG_NAME_SIZE];
BYTE LongNameFlag = 0;

 					    
//顯示一次數(shù)據(jù)流
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");  
}	

struct FileInfoStruct FileInfo;//temporarily buffer for file information
 
//FAT初始化,不含SD的初始化,用之前應(yīng)先調(diào)用sd的初始化
unsigned char FAT_Init()//Initialize of FAT  need initialize SD first
{  		   
	struct bootsector710 *bs  = 0;
	struct bpb710        *bpb = 0;
//	struct partsector    *ps  = 0;
	struct partrecord    *pr  = 0;

	BYTE buffer[512];
	DWORD hidsec=0;
	DWORD Capacity;
	
	Capacity = SD_GetCapacity();
	if(Capacity<0xff)return 1;


	if(SD_ReadSingleBlock(0,buffer))return 1;
	bs = (struct bootsector710 *)buffer;

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

	if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)//對(duì)付沒(méi)有bootsect的sd卡	//dead with the card which has no bootsect
	{
		return 1;
	}
	bpb = (struct bpb710 *)bs->bsBPB;

	
	if(bpb->bpbFATsecs)//detemine thd FAT type  //do not support FAT12
	{
		FAT32_Enable=0;	//FAT16
		FATsectors		= bpb->bpbFATsecs;//FAT表占用的扇區(qū)數(shù) 
		FirstDirClust = 2;
	}
	else
	{
		FAT32_Enable=1;	//FAT32
		FATsectors		= bpb->bpbBigFATsecs;//FAT占用的扇區(qū)數(shù)	//the sectors number occupied by one fat talbe
		FirstDirClust = bpb->bpbRootClust;
	}

	BytesPerSector	= bpb->bpbBytesPerSec;//每扇區(qū)字節(jié)數(shù)
	SectorsPerClust	= (BYTE)bpb->bpbSecPerClust;//每簇扇區(qū)數(shù)
	FirstFATSector	= bpb->bpbResSectors+hidsec;//第一個(gè)FAT表扇區(qū)
	RootDirCount	= bpb->bpbRootDirEnts;		//根目錄項(xiàng)數(shù)
	RootDirSectors	= (RootDirCount*32)>>9;		//根目錄占用的扇區(qū)數(shù)
	FirstDirSector	= FirstFATSector+bpb->bpbFATs*FATsectors;//第一個(gè)目錄扇區(qū)
	FirstDataSector	= FirstDirSector+RootDirSectors;//第一個(gè)數(shù)據(jù)扇區(qū)
	return 0; 
}  

//讀一個(gè)簇中的一個(gè)扇區(qū)
unsigned char FAT_LoadPartCluster(unsigned long cluster,unsigned part,BYTE * buffer)
{
	DWORD sector;
	sector=(DWORD)FirstDataSector+(DWORD)(cluster-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
	if(SD_ReadSingleBlock(sector+part,buffer))return 1;
	else return 0;
}


//讀整個(gè)簇
//Read the a cluster
//Not suitable for system which has few data RAM  
unsigned char FAT_LoadCluster(unsigned long cluster,BYTE * buffer)
{
	DWORD sector;
	unsigned char i;
	sector=FirstDataSector+(DWORD)(cluster-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
	for(i=0;i<SectorsPerClust;i++)
	{
		if(SD_ReadSingleBlock(sector+i,buffer+(i<<9)))break;
	}
	if(i==SectorsPerClust)return 0;
	else return 1;
}

//讀下一簇簇號(hào)
//Return the cluster number of next cluster of file
//Suitable for system which has limited RAM
unsigned long FAT_NextCluster(unsigned long cluster)
{
	BYTE buffer[512];
	DWORD sector;
	DWORD offset;
	if(FAT32_Enable)offset = cluster/128;
	else offset = cluster/256;
	if(cluster<2)return 0x0ffffff8;
	sector=FirstFATSector+offset;//calculate the actual sector
	if(SD_ReadSingleBlock(sector,buffer))return 0x0ffffff8;//read fat table / return 0xfff8 when error occured

	if(FAT32_Enable)
	{
		offset=cluster%128;//find the position
		sector=((unsigned long *)buffer)[offset];	
	}
	else
	{
		offset=cluster%256;//find the position
		sector=((unsigned int *)buffer)[offset];
	}
	return (unsigned long)sector;//return the cluste number
}    

//顯示給定路徑下的文件
//display the content of a foler , 0 as root directory
unsigned char FAT_DisDir(BYTE *dir)
{
	BYTE *buffer;
	DWORD sector;
	DWORD cluster;
	DWORD tempclust;
	unsigned int cnt;
	unsigned int offset;
	unsigned char i;
	struct direntry *item = 0;
	cluster = FAT_OpenDir(dir);
	if(cluster == 1)return 1;
	if(cluster==0 && FAT32_Enable==0)// root directory
	{
		buffer=malloc(512);//apply memory
		if(buffer==0)return 1;//if failed
		for(cnt=0;cnt<RootDirSectors;cnt++)
		{
			if(SD_ReadSingleBlock(FirstDirSector+cnt,buffer)){free(buffer);return 1;}
			for(offset=0;offset<512;offset+=32)
			{
				item=(struct direntry *)(&buffer[offset]);//pointer convert
				//find a valid item and display it
				if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5) && (item->deAttributes != 0x0f))
				{
					putchar(0x0d);
					putchar(0x0a);
					for(i=0;i<8;i++)//name
					{
						putchar(item->deName[i]);	
					}
					if((item->deAttributes & 0x10)==0)putchar('.');
					for(i=0;i<3;i++)//extention
					{
						putchar(item->deExtension[i]);
					}
				}
			}
		}
		free(buffer);//release
	}
	else//other folders
	{
		tempclust=cluster;
		while(1)
		{
			sector=(DWORD)FirstDataSector+(DWORD)(tempclust-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
			buffer=malloc(512);//apply memory
			if(buffer==0)return 1;//if failed
			for(cnt=0;cnt<SectorsPerClust;cnt++)
			{
				if(SD_ReadSingleBlock(sector+cnt,buffer)){free(buffer);return 1;}
				for(offset=0;offset<512;offset+=32)
				{
					item=(struct direntry *)(&buffer[offset]);
					if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5) && (item->deAttributes != 0x0f))
					{
						putchar(0x0d);
						putchar(0x0a);
						for(i=0;i<8;i++)
						{
							putchar(item->deName[i]);	
						}
						if((item->deAttributes & 0x10)==0)putchar('.');
						for(i=0;i<3;i++)
						{
							putchar(item->deExtension[i]);
						}
					}
				}
			}
			free(buffer);//release
			tempclust=FAT_NextCluster(tempclust);//next cluster
			if( tempclust == 0x0ffffff8 )return 1;
			if((FAT32_Enable == 0 && tempclust == 0xffff) || tempclust == 0x0fffffff)break;
		}
	}
	return 0;
}
	 
//在給定目錄下查找文件
//Find a item in the directory which specify by the parameter "cluster"
//Return the start cluster number
unsigned int FAT_FindItem(unsigned long cluster, BYTE *name, struct FileInfoStruct *FileInfo)
{
	BYTE *buffer;
	DWORD tempclust;
	DWORD sector;
	unsigned int cnt;
	unsigned int offset;
	unsigned char i;
	struct direntry *item = 0;
	if((cluster==0) && (FAT32_Enable == 0))// root directory
	{
		buffer=malloc(512);//apply memory
		if(buffer==0)return 1;//if failed
		for(cnt=0;cnt<RootDirSectors;cnt++)
		{
			if(SD_ReadSingleBlock(FirstDirSector+cnt,buffer)){free(buffer);return 1;}
			for(offset=0;offset<512;offset+=32)
			{
				item=(struct direntry *)(&buffer[offset]);
				if((item->deName[0] != 0x00) && (item->deName[0] != 0xe5) && (item->deAttributes != 0x0f))
				{
					for(i=0;i<11;i++)
					{
						if(buffer[offset+i]!=name[i])break;
					}
					if(i==11)
					{
						//return the parameter of the item
						FileInfo->StartCluster = item->deStartCluster + (((unsigned long)item->deHighClust)<<16);//don't care
						FileInfo->Size         = item->deFileSize;
						FileInfo->Attr         = item->deAttributes;
						FileInfo->Sector       = FirstDirSector+cnt;
						FileInfo->Offset       = offset;
						free(buffer);
						return 0;
					}
				}
			}
		}
		free(buffer);//release
	}
	else//other folders
	{
		tempclust=cluster;
		while(1)
		{
			sector=(DWORD)FirstDataSector+(DWORD)(tempclust-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
			buffer=malloc(512);//apply memory
			if(buffer==0)return 1;//if failed
			for(cnt=0;cnt<SectorsPerClust;cnt++)
			{
				if(SD_ReadSingleBlock(sector+cnt,buffer)){free(buffer);return 1;}
				for(offset=0;offset<512;offset+=32)
				{
					item=(struct direntry *)(&buffer[offset]);
					if((item->deName[0] != 0x00) && (item->deName[0] != 0xe5) && (item->deAttributes != 0x0f))
					{
						for(i=0;i<11;i++)
						{
							if(buffer[offset+i]!=name[i])break;
						}
						if(i==11)
						{
							FileInfo->StartCluster = item->deStartCluster + (((unsigned long)item->deHighClust)<<16);//don't care
							FileInfo->Size         = item->deFileSize;
							FileInfo->Attr         = item->deAttributes;
							FileInfo->Sector       = sector+cnt;
							FileInfo->Offset       = offset;
							free(buffer);
							return 0;
						}
					}
				}
			}
			free(buffer);//release
			tempclust=FAT_NextCluster(tempclust);//next cluster
			if((FAT32_Enable == 0 && tempclust == 0xffff) || tempclust == 0x0ffffff8 || tempclust == 0x0fffffff)break;
		}
	}
	return 1;
}

  
// find the location with the given path
unsigned long FAT_Open(BYTE * dir)
{
	BYTE name[11];
	BYTE *p=dir;
	BYTE deep=0;
	BYTE i,j;
	DWORD cluster=0;
	if(FAT32_Enable)cluster=FirstDirClust;
	if(*p != '\\')return 1;//invalid path
	while(*p)
	{
		if(*p == '\\')
		{
			deep++;
		}
		p++;
	}
	p=dir;
	for(i=0;i<deep-1;i++)
	{
		p++;
		for(j=0;j<11;j++)name[j]=0x20;
		j=0;
		while(*p != '\\')
		{
			if((*p) >= 'a' && (*p) <= 'z')name[j] = (*p++)-0x20;
			else name[j] = *p++;
			j++;
		}
		if(FAT_FindItem(cluster,name, &FileInfo))return 1;//find the directory
		cluster = FileInfo.StartCluster;
	}
	p++;
	for(j=0;j<11;j++)name[j]=0x20;
	j=0;
	while(*p != '.')//file must have a extention
	{
		if(*p>='a' && *p<='z')name[j]=(*p++)-0x20;
		else name[j]=*p++;
		j++;
	}
	j=8;
	p++;
	while(*p)
	{
		if(*p>='a' && *p<='z')name[j]=(*p++)-0x20;
		else name[j]=*p++;
		j++;
	}
	if(FAT_FindItem(cluster,name, &FileInfo))return 1;//find the file
	cluster = FileInfo.StartCluster;
	return cluster;
}

// find a directory with the given path
unsigned long FAT_OpenDir(BYTE * dir)
{
	BYTE name[11];
	BYTE *p=dir;
	BYTE deep=0;
	BYTE i,j;
	DWORD cluster=0;
	if(FAT32_Enable)cluster = FirstDirClust;
	if(*p != '\\')return 1;//invalid path
	while(*p)
	{
		if(*p == '\\')
		{
			deep++;
		}
		p++;
	}
	p=dir;
	for(i=0;i<deep-1;i++)
	{
		p++;
		for(j=0;j<11;j++)name[j]=0x20;
		j=0;
		while(*p != '\\')
		{
			if((*p) >= 'a' && (*p) <= 'z')name[j] = (*p++)-0x20;
			else name[j] = *p++;
			j++;
		}
		if(FAT_FindItem(cluster,name, &FileInfo))return 1;//find the directory
		cluster = FileInfo.StartCluster;
	}
	p++;
	for(j=0;j<11;j++)name[j]=0x20;
	j=0;
	while(*p)
	{
		if(*p>='a' && *p<='z')name[j]=(*p++)-0x20;
		else name[j]=*p++;
		j++;
	}
	if(j == 0)return cluster;
	if(FAT_FindItem(cluster,name, &FileInfo))return 1;//find the final directory
	cluster = FileInfo.StartCluster;
	return cluster;
}
 /*
unsigned int FAT_Close(unsigned long * p)
{
	*p=1;
	return 0;
}

// Output the data of a file
// size 0 means read all of the file
unsigned char FAT_Read(unsigned long pointer, unsigned long size)
{
	DWORD sector;
	DWORD tempclust=pointer;
	BYTE *buffer;
	unsigned int i=0,j=0;
	sector=(DWORD)FirstDataSector+(DWORD)(tempclust-2)*(DWORD)SectorsPerClust;
	if(size==0)size = FileInfo.Size;//whether need to read all
	putchar(0x0d);
	putchar(0x0a);//new line
	while(size)
	{
		buffer=malloc(512);
		if(SD_ReadSingleBlock(sector+j,buffer)){free(buffer);return 1;}
		if(size<=512)
		{
			for(i=0;i<size;i++)
			{
				putchar(buffer[i]);//output
			}
			free(buffer);
			return 0;//file over
		}
		else
		{
			for(i=0;i<512;i++)
			{
				putchar(buffer[i]);
			}
			j++;
			if(j==SectorsPerClust)
			{
				j=0;
				free(buffer);
				tempclust=FAT_NextCluster(tempclust);//find the next cluster the data was stored
				if((FAT32_Enable == 0 && tempclust == 0xffff) || tempclust == 0x0ffffff8 || tempclust == 0x0fffffff)return 1;//error
				sector=(DWORD)FirstDataSector+(DWORD)(tempclust-2)*(DWORD)SectorsPerClust;//reculculate the sector
			}
			else free(buffer);
			size-=512;
			
		}
	}
	return 0;
}  

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品久久一区| 亚洲猫色日本管| 欧美一区二区性放荡片| 91成人网在线| 91在线国内视频| 色综合久久99| 在线亚洲一区二区| 在线视频国内自拍亚洲视频| 91丨porny丨国产| 色偷偷88欧美精品久久久 | 日本高清视频一区二区| av电影天堂一区二区在线| 不卡的电影网站| 91视频xxxx| 91黄色激情网站| 欧美男人的天堂一二区| 88在线观看91蜜桃国自产| 日韩一区二区视频| 精品日韩在线一区| 久久蜜桃av一区精品变态类天堂 | av一区二区不卡| 成人午夜视频在线| www.日韩精品| 91精彩视频在线观看| 欧美日韩一区二区三区视频| 欧美日韩黄色一区二区| 日韩欧美色综合网站| 国产亚洲成av人在线观看导航| 国产精品免费视频网站| 亚洲激情在线播放| 日本怡春院一区二区| 韩国一区二区三区| 9人人澡人人爽人人精品| 99久久久无码国产精品| 欧美吞精做爰啪啪高潮| 欧美一级片在线| 欧美激情一区二区三区四区| 亚洲精品国产无天堂网2021 | 首页综合国产亚洲丝袜| 久久精品久久99精品久久| 国产成人免费网站| 色婷婷亚洲一区二区三区| 91精品国产一区二区人妖| 国产天堂亚洲国产碰碰| 亚洲欧美色图小说| 蜜臀av一区二区在线免费观看 | 欧美高清一级片在线| 久久综合视频网| 亚洲欧美视频在线观看| 美女视频黄频大全不卡视频在线播放| 懂色av一区二区三区免费观看| 色综合久久中文字幕| 欧美成人激情免费网| 国产精品久久99| 全国精品久久少妇| 99免费精品视频| 日韩一级片在线播放| 日韩美女精品在线| 麻豆精品久久精品色综合| 99re在线精品| 欧美不卡在线视频| 亚洲最大色网站| 国产白丝网站精品污在线入口| 樱桃视频在线观看一区| 极品少妇一区二区三区精品视频| 日本韩国一区二区| 国产偷国产偷亚洲高清人白洁| 婷婷激情综合网| 成人午夜在线播放| 精品国产一区二区亚洲人成毛片| 亚洲欧美日韩在线不卡| 国产传媒一区在线| 91精品国产品国语在线不卡| 综合av第一页| 国产乱国产乱300精品| 91精品欧美综合在线观看最新| 亚洲欧美一区二区在线观看| 国产一区二区三区综合| 在线播放中文字幕一区| 国产精品久久久久久亚洲毛片 | 日韩视频在线永久播放| 一区在线中文字幕| 国产一区二区在线电影| 制服丝袜亚洲播放| 亚洲综合一区二区| av在线播放不卡| 国产亚洲自拍一区| 久久99精品久久久久久动态图| 欧美三级电影在线观看| 亚洲欧美日韩电影| 99精品在线观看视频| 久久久久久久av麻豆果冻| 亚洲成av人片www| 91国在线观看| 亚洲精品老司机| 91在线观看下载| 国产精品高潮呻吟久久| 国v精品久久久网| 久久精品人人做人人爽97| 久草在线在线精品观看| 欧美一区二区三区日韩视频| 午夜精品久久一牛影视| 亚洲午夜一二三区视频| 97精品电影院| 日韩一区欧美小说| 91美女在线看| 亚洲另类中文字| 色婷婷av一区二区| 一区二区三区不卡视频| 色欧美88888久久久久久影院| 亚洲精品乱码久久久久久黑人 | 国产精品久久午夜夜伦鲁鲁| 国产91精品一区二区麻豆网站 | 国产精品无人区| 成人免费va视频| 亚洲国产成人午夜在线一区| 国产69精品久久777的优势| 国产日韩精品一区二区浪潮av| 国产成人综合网站| 国产精品免费视频网站| 91美女片黄在线观看91美女| 亚洲图片欧美综合| 7777精品久久久大香线蕉| 免费精品视频在线| 欧美精品一区二区三区蜜桃视频| 国产激情一区二区三区| 中文字幕在线不卡视频| 色婷婷av一区二区| 手机精品视频在线观看| 欧美大片国产精品| 欧美成人video| 国产一区二区在线观看视频| 欧美极品少妇xxxxⅹ高跟鞋 | 成人av在线一区二区三区| 中文字幕一区二区三区四区不卡| 日本电影亚洲天堂一区| 日韩和欧美一区二区三区| 精品国产一区二区三区av性色| 国产福利一区二区三区视频在线| 亚洲日本一区二区三区| 欧美日韩免费高清一区色橹橹| 青青草91视频| 欧美激情一区在线| 欧美视频在线播放| 狠狠色丁香婷综合久久| 18欧美亚洲精品| 欧美日韩一区二区在线观看视频 | 国产乱码精品1区2区3区| 日韩伦理免费电影| 91精品国产黑色紧身裤美女| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品一级片| 亚洲综合一区二区三区| 26uuu国产一区二区三区| 99久久精品国产导航| 日韩成人av影视| 欧美国产精品中文字幕| 69p69国产精品| 成人国产免费视频| 日韩av中文在线观看| 中文字幕一区二区三区不卡 | 欧美精品 国产精品| 成人激情动漫在线观看| 婷婷丁香久久五月婷婷| 一区在线观看视频| 欧美精品一区二区三区很污很色的| 99v久久综合狠狠综合久久| 美女网站在线免费欧美精品| 亚洲人妖av一区二区| 精品久久久久久久人人人人传媒 | 日韩美女精品在线| 欧美v国产在线一区二区三区| 在线观看欧美日本| 国产69精品一区二区亚洲孕妇| 亚洲大片免费看| 亚洲图片欧美激情| xnxx国产精品| 538prom精品视频线放| 色视频成人在线观看免| 成人综合婷婷国产精品久久| 捆绑紧缚一区二区三区视频| 亚洲一级二级在线| 亚洲欧美偷拍卡通变态| 亚洲国产高清在线观看视频| 精品久久久久久久久久久久久久久 | 一区二区三区精品视频在线| 国产精品久久三区| 国产日本一区二区| 久久先锋影音av鲁色资源网| 欧美一区二区美女| 欧美日韩二区三区| 欧美亚洲国产bt| 97se亚洲国产综合自在线 | 欧美精品一区二| 欧美一区国产二区| 欧美无人高清视频在线观看| 在线看日韩精品电影| 色哟哟精品一区| 色婷婷综合久色| 色综合久久久久综合体桃花网|