⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat16.c

📁 AT89C51 MP3源程序AT89C51 MP3源程序 SD AT89C51 MP3源程序AT89C51 MP3源程序 SD
💻 C
字号:
/*
;*****************************************************************************************************
;*									Copyright (c) 2006 by JiaoJinXing. 
;*											All rights reserved.
;*
;*---- 文件信息 --------------------------------------------------------------------------------------
;* 文   件   名 : FAT16.c
;* 创   建   人 : 焦进星
;* 描        述 : FAT16文件分配表文件
;*
;*---- 历史版本信息 ----------------------------------------------------------------------------------
;* 日   期  : 2008年 12 月 15 日
;* 创 建 人  : 焦进星
;* 描   述  : 建立版本 V1.0.0
;*
;*---- 联系方式 --------------------------------------------------------------------------------------
;* Email    : wyoujtg@163.com
;* Web      : http://wyoujtg.blog.163.com  
;*****************************************************************************************************
;*/

#define IN_FAT16
#include "minifs.h"

/*
;*****************************************************************************************************
;* 函数名称 : GetNextClus
;* 描    述 : 获得指定簇的下一簇号
;* 输 	 入 : ClusIndex: 簇号
;*        
;* 输 	 出 : 下一簇号
;*****************************************************************************************************
;*/
uint16 GetNextClus(uint16 ClusIndex)
{
	uint8 *Buf;
	uint16 ByteOffset, Value; 
	uint32 SecIndex;

	if (ClusIndex >= FS_MaxClus)					/* 簇号无效 */
	{
		return BAD_CLUS;
	}

	SecIndex   = ClusIndex / 256 + FS_FATStartSec;	/* 扇区号	*/
	ByteOffset = ClusIndex * 2 % 512;				/* 字节偏移 */

	Buf = OpenSector(SecIndex);						/* 打开扇区 */	
	if (Buf == NULL)
	{
		return BAD_CLUS;
	}

	Value = GET_UINT16(Buf, ByteOffset);			/* 获得下一簇号	*/	

	return Value;
}

/*
;*****************************************************************************************************
;* 函数名称 : SetNextClus
;* 描    述 : 设置指定簇的下一簇号
;* 输 	 入 : ClusIndex: 簇号, Value: 下一簇号
;*        
;* 输 	 出 : 下一簇号
;*****************************************************************************************************
;*/
uint16 SetNextClus(uint16 ClusIndex, uint16 Value)
{
	uint8 *Buf;
	uint16 ByteOffset; 
	uint32 SecIndex;

	if (ClusIndex >= FS_MaxClus)					/* 簇号无效 */
	{
		return BAD_CLUS;
	}

	SecIndex   = ClusIndex / 256 + FS_FATStartSec;	/* 扇区号	*/
	ByteOffset = ClusIndex * 2 % 512;				/* 字节偏移 */

	Buf = OpenSector(SecIndex);						/* 打开扇区 */	
	if (Buf == NULL)
	{
		return BAD_CLUS;
	}

	SET_UINT16(Buf, ByteOffset, Value);				/* 设置下一簇号 */

	WriteSector();									/* 写扇区 */

	return Value;
}

/*
;*****************************************************************************************************
;* 函数名称 : AddNewClus
;* 描    述 : 为指定簇链增加一个簇
;* 输 	 入 : ClusIndex: 簇号
;*        
;* 输 	 出 : 下一簇号
;*****************************************************************************************************
;*/
uint16 AddNewClus(uint16 ClusIndex)
{
	uint16 NextClus, i;

	if (ClusIndex >= FS_MaxClus)					/* 簇号无效 */
	{
		return BAD_CLUS;
	}

	if (ClusIndex > EMPTY_CLUS_1)					/* 追加簇链 */
	{
		/* 查找簇链尾 */
		do 
		{	
			NextClus = GetNextClus(ClusIndex);		/* 下一簇号 */

			if (NextClus == BAD_CLUS)				/* 当前簇为坏簇 */
			{
				return BAD_CLUS;
			}
			/* 到达簇链尾 */
			if (NextClus >= EOF_CLUS_1 || NextClus <= EMPTY_CLUS_1)
			{
				break;
			}
			ClusIndex = NextClus;
		} while (1);
	}
	else											/* 新建一个簇 */
	{
		ClusIndex = NEW_CLUS_CHAIN;
	}

	/* 查找一个空闲簇 */
	for (i = EMPTY_CLUS_1 + 1; i < FS_MaxClus; i++)
	{
		if (GetNextClus(i) == EMPTY_CLUS)			/* 找到空闲簇 */
		{
			if (ClusIndex != NEW_CLUS_CHAIN)		/* 追加簇链 */
			{
				SetNextClus(ClusIndex, i);
			}
			SetNextClus(i, EOF_CLUS_END);			/* 簇链尾 */
			return i;
		}
	}
	return BAD_CLUS;
}

/*
;*****************************************************************************************************
;* 函数名称 : DelClusChain
;* 描    述 : 删除簇链
;* 输 	 入 : ClusIndex: 簇号
;*        
;* 输 	 出 : 无
;*****************************************************************************************************
;*/
void DelClusChain(uint16 CurClus)
{
	uint16 NextClus;

	/* 簇号无效	*/
	if (CurClus >= FS_MaxClus)
	{
		return;
	}

	while (1)
	{
		NextClus = GetNextClus(CurClus);						/* 获得当前簇的下一簇号	*/
		if (NextClus == BAD_CLUS)								/* 当前簇为坏簇			*/
		{
			break;
		}	
		
		SetNextClus(CurClus, EMPTY_CLUS);						/* 释放当前簇			*/

		if (NextClus >= EOF_CLUS_1 || NextClus <= EMPTY_CLUS_1)	/* 结束或保留簇			*/
		{
			break;
		}
		CurClus = NextClus;
	}
}

/*
;*****************************************************************************************************
;*											End of File
;*****************************************************************************************************
;*/	



	




	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -