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

📄 mmc.c

📁 C8051FTest.rar 是C8051F系列处理器的基本测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:

char OpenDir(FILESTRUCT *fp)					//打开目录函数,返回选择项(0-12)
{	
	int From;
	char HandMoveF=1;
	char DisF=1;
	char ItemSel=0;
	char IsRoot=0;
	char Page=0;
	unsigned long PageRecord[10];
	CurF.firstcluster=fp->firstcluster;
	SFRPAGE=0x0F;

	//显示界面
	Clear(0,240);
	Udprintf(0,208,"                                        ");
	Udprintf(0,208,PATH);
// 	dprintf( 0,224,"芗   兦                             确定");
 	dprintf( 0,224,"芗   兦                             退出");
	//准备显示第一屏目录项
 	if(fp->firstcluster==0)
 	{
 		IsRoot=1;
// 		dprintf( 30,224,"退出");
 	}
	Found=0;
	DCounter=0;
	PageRecord[0]=0;

//	while(1)
	{
		if(DisF==1)
		{
			DisF=0;
			if(IsRoot==1)		//根目录
			{
				while(Found<13 && DCounter<DIR_LEN)		//显示一屛目录项
				{
					MMC_block_read(MMCDataBuf,DIR_ORI+DCounter);
					Get_File_List(DIR_ORI,(DIR_ORI+DCounter)%512);
				}
			}
			if(IsRoot==0)		//子目录
			{
				while(Found<13 && (From=ReadFile(&CurF,DCounter))!=-1)	//显示一屛目录项
				{
					Get_File_List(CLU_ORI+Find_NextN_Cluster(fp->firstcluster,DCounter/BytePClu)*BytePClu,From);
				}
			}
			if(Found==13)				//如果目录显示超过一页(13条),记录断点,以便向上翻页
			{
				PageRecord[Page+1]=DCounter;
			}
			Show_Dir_List();
		}

// 		if(HandMoveF==1)				//移动小手
// 		{
// 			for(i=0;i<Found;i++)
// 			{
// 				if(ItemSel==i)	
// 				dprintf(0,i*16,"贲");
// 				else
// 				dprintf(0,i*16,"  ");
// 			}
// 			HandMoveF=0;
// 		}

// 		if(CheckKeyF==1)			//键盘检测
// 		{
// 			CheckKey();
// 			CheckKeyF=0;
// 		}
	
// 		if(Key[0].pressed==1)       //检测到上键
// 		{
// 			Key[0].pressed=0;
// 			if(ItemSel>0)
// 			{
// 				ItemSel--;
// 				HandMoveF=1;
// 			}
// 			else
// 			{
// 				if(Page>0)
// 				{
// 					ItemSel=12;
// 					Found=0;
// 					Page--;
// 					DCounter=PageRecord[Page];
// 					DisF=1;
// 					HandMoveF=1;
// 				}
// 			}
// 		}

// 		if(Key[1].pressed==1)       //检测到下键
// 		{
// 			Key[1].pressed=0;
// 			if(ItemSel==12)			//显示下页目录
// 			{
// 				ItemSel=0;
// 				Found=0;
// 				Page++;
// 				DisF=1;
// 			}
// 			if(ItemSel<Found-1)
// 			ItemSel++;
// 			HandMoveF=1;		
// 		}
////////////////////////////////////////////
// 		if(Key[5].pressed==1) 
// 		{
// 			Key[5].pressed=0;
// 			AddFile(0);
// 		}
///////////////////////////////////////////
// 		if(Key[6].pressed==1)       //检测到退出
// 		{
// 			Key[6].pressed=0;
// 			if(IsRoot)			//根目录可以退出
// 			{
// 				ClearKey();
// 				Clear(0,240);
// 				return -1;
// 			}
// 		}

// 		if(Key[7].pressed==1)       //检测到确定,返回选项
// 		{
// 			if(File[ItemSel].attribute==0)		//选择目录,修改PATH
// 			{
// 				if(File[ItemSel].filename[9]==1)	//返回上级目录
// 				{
// 					int i;
// 					DEPTH--;
// 					if(DEPTH==1)
// 					strcpy(PATH+5,"根目录");
// 					for(i=strlen(PATH)-1;i>=0;i--)	
// 					{
// 						if(PATH[i]=='/')
// 						{
// 							PATH[i]=0;	
// 						    break;
// 						}
// 					}				
// 				}
// 				else			//选择其他目录
// 				{
// 					DEPTH++;
// 					if(DEPTH==2)
// 					PATH[5]=0;
// 					sprintf(PATH,"%s%c%s",PATH,'/',File[ItemSel].filename);
// 				}
// 			}
// 			ClearKey();
// 			return ItemSel;
// 		}
	}//while(1)

	return 0;
}

void OpenTxt(FILESTRUCT *fp)		//浏览文本文件
{
	unsigned long Counter=0;		//显示字节计数器
	int Temp;
	//显示界面
	SFRPAGE=0x0F;
	Clear(0,240);
	Udprintf(0,208,"当前位置:                               ");
	dprintf( 0,224,"芗   兦                             退出"); 
	//准备显示第一页
	F=1;
	Key[1].pressed=1;	
	while(1)
	{	
		if(Key[1].pressed==1)       					//检测到下键
		{
			Key[1].pressed=0;
			if(F==1)									//上页写满了,还有下一页
			{	
				Clear(0,208);	
				X=0;
				Y=0;
				F=0;
				while(F==0 && Counter<fp->size)			//显示一屛
				{
					int WB;
					Temp=ReadFile(fp,Counter);
					WB=tprintf(X,Y,MMCDataBuf+Temp)-(MMCDataBuf+Temp);		//本次显示字节数	
					Counter+=WB;										//显示计数器累加
				}
				//显示当前位置信息
				{
					char TempBuf[40];
					sprintf(TempBuf,"%lu/%lu = %.0f%%  ",Counter,fp->size,(100*(float)Counter)/fp->size);	
					Udprintf(9,208,TempBuf);
				}
			}
		}

		if(Key[0].pressed==1)       	//检测到上键
		{
			Key[0].pressed=0;
			if(Counter<1000)
			Counter=0;
			else
			Counter-=1000;
			F=1;
			Key[1].pressed=1;
		}

		if(CheckKeyF==1)            //键盘检测
		{	
			CheckKey();
 	        CheckKeyF=0;
		}

		if(Key[7].pressed==1)		//退出
		{
			ClearKey();
			Clear(0,240);
			return;
		}

	}//while(1)		
}

int AddFile(char n)				//新建文件或文件夹
{
	int i,j;
	unsigned long offset=0;
	unsigned int value1,value2;
	unsigned int firstcluster=0;

	if(File[n].attribute==0)
	firstcluster=SearchEmptyCluster();

	while(ReadFile(&CurF,offset)!=-1)
	{
		for(i=0;i<512;i+=32)
		{
			if(MMCDataBuf[i]==0 || MMCDataBuf[i]==0xE5)
			{
				for(j=0;j<11;j++)
				MMCDataBuf[i+j]=0x20;
				for(j=11;j<32;j++)
				MMCDataBuf[i+j]=0;

				//文件名
				for(j=0;j<strlen(File[n].filename);j++)
				if('a'<=File[n].filename[j] && File[n].filename[j]<='z')
				File[n].filename[j]-=32;

				memcpy(MMCDataBuf+i,File[n].filename,strlen(File[n].filename));

				//扩展名
				for(j=0;j<strlen(File[n].extension);j++)
				if('a'<=File[n].extension[j] && File[n].extension[j]<='z')
				File[n].extension[j]-=32;
				
				memcpy(MMCDataBuf+i+0x08,File[n].extension,strlen(File[n].extension));
				
                //文件权限
				if(File[n].attribute==1)
				MMCDataBuf[i+0x0b]=0x20;
				else
				MMCDataBuf[i+0x0b]=0x10;

				//设置文件名大小写,0x18表示全部小写,0x10表示全部大写	
				//大小写混合需用到长文件名,目前程序不支持
				MMCDataBuf[i+0x0c]=0x10;		
			
				//首簇号
				MMCDataBuf[i+0x1a]=firstcluster;
				MMCDataBuf[i+0x1b]=firstcluster>>8;
		
				//文件大小
				MMCDataBuf[i+0x1c]=0;
				MMCDataBuf[i+0x1d]=0;
				MMCDataBuf[i+0x1e]=0;
				MMCDataBuf[i+0x1f]=0;
				
				//时间
				value1=File[n].hour*2048+File[n].minute*32;
				MMCDataBuf[i+0x16]=value1;
				MMCDataBuf[i+0x17]=value1>>8;

				//日期
				value2=(File[n].year+20)*512+File[n].month*32+File[n].day;
				MMCDataBuf[i+0x18]=value2;
				MMCDataBuf[i+0x19]=value2>>8;
				
				memcpy(MMCUSBBuf,MMCDataBuf,512);
				WriteFile(MMCUSBBuf,&CurF,offset);
				goto A;
			}
		}//	for(i=0;i<512;i+=32)
		offset+=512;
	}//while(ReadFile(&CurF,offset)!=-1)


A:	if(File[n].attribute==0)
	{
		offset=512;
		memset(MMCDataBuf,0,512);
		while(offset<BytePClu)
		{
			MMC_block_write(MMCDataBuf,CLU_ORI+firstcluster*BytePClu+offset);
			offset+=512;
		}
		memset(MMCDataBuf,0x20,11);
		memset(MMCDataBuf+32,0x20,11);
		//当前目录项
		MMCDataBuf[0]='.';
		MMCDataBuf[0x0b]=0x10;
		MMCDataBuf[0x16]=value1;
		MMCDataBuf[0x17]=value1>>8;
		MMCDataBuf[0x18]=value2;
		MMCDataBuf[0x19]=value2>>8;
		MMCDataBuf[0x1a]=firstcluster;
		MMCDataBuf[0x1b]=firstcluster>>8;

		//上层目录
		MMCDataBuf[0x20+0]='.';
		MMCDataBuf[0x20+1]='.';
		MMCDataBuf[0x20+0x0b]=0x10;
		MMCDataBuf[0x20+0x16]=value1;
		MMCDataBuf[0x20+0x17]=value1>>8;
		MMCDataBuf[0x20+0x18]=value2;
		MMCDataBuf[0x20+0x19]=value2>>8;
		MMCDataBuf[0x20+0x1a]=CurF.firstcluster;
		MMCDataBuf[0x20+0x1b]=CurF.firstcluster>>8;

		MMC_block_write(MMCDataBuf,CLU_ORI+firstcluster*BytePClu);
	}
}

int DeleteFile(char n)
{
	unsigned long temp,next;
	//将目录项首字节改成E5
	MMC_block_read(MMCDataBuf,File[n].Addr);
	MMCDataBuf[File[n].Addr%512]=0xE5;
	MMC_block_write(MMCDataBuf,File[n].Addr);

	temp=File[n].firstcluster;
	//首簇为零表示空文件,直接返回成功
	if(temp==0)
	return 1;
	//需要将FAT表中该文件占用簇释放
	do
	{
		MMC_block_read(MMCDataBuf,FAT1_ORI+temp*2);			//读出该簇所在块	
		next=MMCDataBuf[(temp%256)*2]+MMCDataBuf[(temp%256)*2+1]*0x100;	//下一簇,ffff表示该簇是最后一块
		MMCDataBuf[(temp%256)*2]=0;				//释放
		MMCDataBuf[(temp%256)*2+1]=0;
		MMC_block_write(MMCDataBuf,FAT1_ORI+temp*2);	//写回
		temp=next;			
	}	
	while(temp!=0xFFFF);
	return 1;
}
///////////////////////////////////////////////////////////////////////////

void mmc_fopen(char n)				//保存打开文件号,读写指针清零
{
	FILENO=n;	
	RCnt=0;					
	WCnt=0;
}

void mmc_fseek(unsigned long offset)
{
	if(offset>=File[FILENO].size)
	offset=File[FILENO].size;
	RCnt=WCnt=offset;
}

int  mmc_fread(char *buf,int size)
{
	int offset,i,j;
	unsigned long temp=RCnt;

	if(RCnt>=File[FILENO].size)
	return -1;

	if(RCnt+size>File[FILENO].size)
	size=File[FILENO].size-RCnt;

	offset=ReadFile(&File[FILENO],RCnt);
	for(i=0,j=offset;i<size;i++)
	{
		buf[i]=MMCDataBuf[j];
		j++;		
		if(j==512)
		{	
			temp+=512;
			ReadFile(&File[FILENO],temp);
			j=0;
		}
	}
	RCnt+=size;	
}

int  mmc_fwrite(char *buf,int size)
{
	int i,j=0;
	unsigned char TempBuf[512];	
	int counter;
	int temp=size;

	if(File[FILENO].firstcluster==0)		//空文件,申请首簇
	File[FILENO].firstcluster=SearchEmptyCluster();

	while(1)
	{	
		ReadFile(&File[FILENO],WCnt);
		for(i=WCnt%512,counter=0;i<512;i++,size--)
		{
			if(size>0)
			{
				MMCDataBuf[i]=buf[j];
				j++;
				counter++;
			}
			else
				MMCDataBuf[i]=0;
		}
		memcpy(TempBuf,MMCDataBuf,512);
		WriteFile(TempBuf,&File[FILENO],WCnt);
		WCnt+=counter;
		if(size<=0)
		return 1;
	}
}

void mmc_fclose()		//关闭文件,修改文件大小(和首簇对于空文件)
{	
	int Temp=File[FILENO].Addr%512;
	MMC_block_read(MMCDataBuf,File[FILENO].Addr);

	MMCDataBuf[Temp+0x1a]=File[FILENO].firstcluster;
	MMCDataBuf[Temp+0x1b]=File[FILENO].firstcluster/256;
	
	File[FILENO].size=WCnt;
	MMCDataBuf[Temp+0x1c]=WCnt;
	MMCDataBuf[Temp+0x1d]=WCnt>>8;
	MMCDataBuf[Temp+0x1e]=WCnt>>16;
	MMCDataBuf[Temp+0x1f]=WCnt>>24;		
	
	MMC_block_write(MMCDataBuf,File[FILENO].Addr);
}

//////////////////////////////////////////////////////////////////////////////////////////////////
//									MMC模块主程序										   		//
//////////////////////////////////////////////////////////////////////////////////////////////////
void MMC()
{
	while(MMC_OK);

	SYS_INIT();				//初始化管脚,SPI,MMC卡
	
	if(MMC_SPI_INIT()==KO)	//检测MMC是否插入
	return ;

	CheckCard();			//获取MMC基本信息

	USB_test2();

}

⌨️ 快捷键说明

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