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

📄 sdfilelib.c

📁 在单片机keil编辑其中如何创建自己的函数库。方便以后自己调用
💻 C
📖 第 1 页 / 共 3 页
字号:
	//current_clust=m;
	//====================
	file[pfile].current_sector=(n%(Init_Arg1.SectorsPerClust*512))/512;					//不足一簇的扇数
	file[pfile].current_byte=(n%(Init_Arg1.SectorsPerClust*512))%512;					//在一扇中的哪一位

}
//----------------------读取文件内容-------------------------
void fread(uchar pfile,uchar *store,uint read_num)
{
	uint i,m;
	//bit flag=1;
	se=(file[pfile].current_clust-3)*Init_Arg1.SectorsPerClust+Init_Arg1.FirstDataSector+file[pfile].current_sector;//文件都是从第三簇开始的
	Read_SD_Sector(se);
	m=file[pfile].current_byte;
	for(i=0;i<read_num;i++)
	{	
		//if(flag)
		//{
			if(m+i==512)								//如果所需数据不在同一扇区
			{
				if(file[pfile].current_sector==(Init_Arg1.SectorsPerClust-1))	//如果所需数据不在同一簇
				{
					file[pfile].current_clust=FAT32_GetNextCluster(file[pfile].current_clust);
					se=(file[pfile].current_clust-3)*Init_Arg1.SectorsPerClust+Init_Arg1.FirstDataSector;
					Read_SD_Sector(se);	
				}
				else
					se++;
				Read_SD_Sector(se);	
				m=0-i;
				//flag=0;
			}
		//}
		store[i]=FAT32_Buffer[m+i];
	}
}
//-----------------对文件增加一个簇------------------------------------
unsigned long Add_Newclust(unsigned char pfile)  
{
//    static  unsigned int Save_Fat_Sectors;
    unsigned char flag=0,j;
	unsigned long Clust_thing,current_clust,i;
	struct FAT32_FAT  *Test;
	struct FAT32_FAT_Item *Test_Item,Test_Item_2={0xff,0xff,0xff,0x0f};
	for(i=Init_Arg1.FirstFATSector;i<=Init_Arg1.FirstFATSector+Init_Arg1.FATsectors;i++)//查询整个FAT表中的空簇
	{
		se=i;
		Read_SD_Sector(se);
		Test=(struct FAT32_FAT*)FAT32_Buffer;
		for(j=0;j<128;j++)
		{
		 	Test_Item=&(Test->Items[j]);
			Clust_thing=Little_To_Big((unsigned char*)Test_Item,4);
		    if(Clust_thing==0)											//找到一个空簇   
			{
				Test->Items[j]=Test_Item_2;    					  		//创建一个簇后并连接到文件的结尾
				Write_SD_Sector(se);
				
				current_clust=j+(i-Init_Arg1.FirstFATSector)*128;		//计算该处簇号
				Clust_thing=current_clust;
				Test_Item_2.Item[0]=Clust_thing&0xff;
				Clust_thing=current_clust;
				Test_Item_2.Item[1]=(Clust_thing>>8)&0xff;
				Clust_thing=current_clust;
				Test_Item_2.Item[2]=(Clust_thing>>16)&0xff;
				Clust_thing=current_clust;
				Test_Item_2.Item[3]=(Clust_thing>>24)&0xff;
				
				fseek(pfile,file[pfile].file_size);
				se=((file[pfile].current_clust/128)+Init_Arg1.FirstFATSector);		//计算文件所在的最后一个族的位置
				Read_SD_Sector(se);
				Test=(struct FAT32_FAT *)FAT32_Buffer;
				Test->Items[file[pfile].current_clust%128]=Test_Item_2;
				Write_SD_Sector(se);
				flag=1;
				break;
				//return  current_clust=j+(i-Init_Arg1.FirstFATSector)*128;	//计算该处簇号
			}
						
		}
		if(flag==1)
			break;

	}
	return current_clust;
}
//-----------------写入文件内容,只能写在结尾-----------------------------------
void fwrite(uchar pfile,uchar *store,uint write_num)
{
	unsigned int i,m;
	unsigned long Newclust;

	fseek(pfile,file[pfile].file_size);										//找到文件的结尾
	se=(file[pfile].current_clust-3)*Init_Arg1.SectorsPerClust+Init_Arg1.FirstDataSector+file[pfile].current_sector;//文件都是从第三簇开始的
//	se1=se;
	Read_SD_Sector(se);											//读取文件的最后一扇
	m=file[pfile].current_byte;
	for(i=0;i<write_num;i++)
	{
		
		if((m+i)==512)									//如果数据同一扇区放不下
		{
			Write_SD_Sector(se);
//			se2=se;
			if(file[pfile].current_sector==(Init_Arg1.SectorsPerClust-1))	//如果数据同一簇放不下	
			{
				Newclust=Add_Newclust(pfile);
				se=(Newclust-3)*Init_Arg1.SectorsPerClust+Init_Arg1.FirstDataSector;
			}
			else
				se++;
			m=0-i;
			
			Read_SD_Sector(se);
		}
		FAT32_Buffer[m+i]=store[i];
	}
//	se1=se;

	Write_SD_Sector(se);
	write_size(pfile, write_num);			//修变并写入文件的大小
									
}
//-----------------写入文件大小-----------------------------------
void write_size(unsigned char pfile,unsigned int write_num)
{
	unsigned long  file_size;
	file[pfile].file_size=file[pfile].file_size+write_num;		//改变文件的大小增加用‘+’,减小用‘-’
	se=file[pfile].file_name_sector;
	Read_SD_Sector(se);										
	file_size=file[pfile].file_size;
	FAT32_Buffer[file[pfile].file_name_byte+28]=file_size&0xff;
	file_size=file[pfile].file_size;
	FAT32_Buffer[file[pfile].file_name_byte+29]=(file_size>>8)&0xff;
	file_size=file[pfile].file_size;
	FAT32_Buffer[file[pfile].file_name_byte+30]=(file_size>>16)&0xff;
	file_size=file[pfile].file_size;
	FAT32_Buffer[file[pfile].file_name_byte+31]=(file_size>>24)&0xff;

	Write_SD_Sector(se);										//写入文件大小
}
//-----------------写入文件内容,删除原来文件内容-----------------------------------
void fwriteall(uchar pfile,uchar *store,uint write_num)
{
	unsigned char j=0;
	unsigned long  clust,next_clust,Newclust;
	unsigned int  size,i,m=0;
	struct FAT32_FAT  *Test;
	struct FAT32_FAT_Item Test_Item_2={0xff,0xff,0xff,0x0f},Test_Item_3={0,0,0,0};
	size=file[pfile].file_size/(512*Init_Arg1.SectorsPerClust);//文件占几个簇										
	file[pfile].file_size=0;//清除文件大小
	//清除文件的簇连接
	if(size!=0)
	{
		//fseek(pfile,0);												//得到文件的起始簇
//		se2=file[pfile].frist_clust;
		clust=FAT32_GetNextCluster(file[pfile].frist_clust);		//找到第一簇指向下一簇簇号
		se=((file[pfile].frist_clust/128)+Init_Arg1.FirstFATSector);//找到该簇的扇区
//		se1=se;
			//while(!EA);			//用于测试
		Read_SD_Sector(se);
		Test=(struct FAT32_FAT*)FAT32_Buffer;					//类型转换
		Test->Items[file[pfile].frist_clust%128]=Test_Item_2;	   //第一簇送0xff,0xff,0xff,0x0f,以后送{0,0,0,0}
		Write_SD_Sector(se);
		while(1)			//for(i=0;i<size;i++)
		{
			next_clust=FAT32_GetNextCluster(clust);		//找下一簇簇号
			se=((clust/128)+Init_Arg1.FirstFATSector);//找到该簇的扇区
			Read_SD_Sector(se);
			//Test=(struct FAT32_FAT*)FAT32_Buffer;					//类型转换
			Test->Items[clust%128]=Test_Item_3;	   //{0,0,0,0}
			Write_SD_Sector(se);
			clust=next_clust;
			if(clust==0x0FFFFFFF)
				break;
				
		}
	}
	se=(file[pfile].frist_clust-3)*Init_Arg1.SectorsPerClust+Init_Arg1.FirstDataSector;//
	Read_SD_Sector(se);	
	for(i=0;i<write_num;i++)
	{
		if(i/512!=0&&i%512==0)
		{
			Write_SD_Sector(se);
			se++;j++;
			if(j==Init_Arg1.SectorsPerClust)//即多于一个簇
			{
				Newclust=Add_Newclust(pfile);
				se=(Newclust-3)*Init_Arg1.SectorsPerClust+Init_Arg1.FirstDataSector;
				j=0;
			}
			m=512+m;
		}
		FAT32_Buffer[i-m]=store[i];
	}

	Write_SD_Sector(se);
	write_size(pfile, write_num);			//重新写入文件的大小
}

//-----------------汉字库与液晶汉字库的转换-----------------------
void HZKLCD(unsigned char *ch,unsigned char *CH)
{
	unsigned char ii,jj,aa,bb,n=0;
//----------------------转换算法---------------
	for(ii=0;ii<8;ii++)
	{
	 	bb=0;
		for(jj=0;jj<8;jj++)
		{
			aa=ch[2*jj]&0x80;
			ch[2*jj]<<=1;
			aa>>=(7-jj);
			bb=bb|aa;
		}
		CH[n]=bb;
		n++;
		bb=0;
		for(jj=8;jj<16;jj++)
		{
			aa=ch[2*jj]&0x80;
			ch[2*jj]<<=1;
			aa>>=(15-jj);
			bb=bb|aa;
		}
		CH[n]=bb;
		n++;
	}
	for(ii=0;ii<8;ii++)
	{
		bb=0;
		for(jj=0;jj<8;jj++)
		{
			aa=ch[2*jj+1]&0x80;
			ch[2*jj+1]<<=1;
			aa>>=(7-jj);
			bb=bb|aa;
		}
		CH[n]=bb;
		n++;
		bb=0;
		for(jj=8;jj<16;jj++)
		{
			aa=ch[2*jj+1]&0x80;
			ch[2*jj+1]<<=1;
			aa>>=(15-jj);
			bb=bb|aa;
		}
		CH[n]=bb;
		n++;
	}
}
//--------------*********地址折半查找法************--------------------
unsigned long find1(unsigned char pfile,unsigned char pfile1,unsigned char len1,unsigned char *array,unsigned char len,unsigned char len2)//	
//array 为所找到的内容,len为array内容的长度,最大长度为20 ;len1为一条记录长度
{
	unsigned char s,ch[20],ch1[5];
	bit	m;
	unsigned int  n,j=0;
	int i;
	unsigned long N,M;										//计算“书籍1.txt”中有多少条记录
	//pf=fopen("书籍1   ");
	//N=file[pfile].file_size/86;								//一条记录是86个字节
	
	N=file[pfile1].file_size/len1;								//一条记录的地址占86个字节
	j=0;s=0;
	for(n=0;n<(log(N)/log(2)+2);n++)					//折半查找应该是对数次,‘2’是在附近查找的次数
	{	//last_num=n;
		i=pow(-1,s)*(N/pow(2,n+1));
		if(!i)
		{
			if(s)
			{
				if(j==0)									//防止找到起始位置出错
					j++;
				j--;
			}
			else
			{
				if(j==(N-1))
					j--;
				j++;
			}
				
		}
		else
			j=j+i;
		M=len1*j;
		fseek(pfile1,M);										//移动指针位置
		fread(pfile1,ch1,len1);									//读取文件的条码
		M=atoi(ch1);
		//se1=M;
		M=(M-1)*len2;
//		se1=j;
		fseek(pfile,M);										//移动指针位置
		fread(pfile,ch,len);									//读取文件的条码
		for(i=0;i<len;i++)
		{
			if(ch[i]==array[i])
				m=1;
			else if(ch[i]>array[i])
			{s=1;m=0;break;}
			else 
			{s=0;m=0;break;}								//只要有一位不等就退出
		}
		if(m)
			break;
	}
	if(m)													//找到文件后返回文件的位置
		return M;
	else
		return 55;											//没有找到则返回无内容标志
}

⌨️ 快捷键说明

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