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

📄 u_func_b.c

📁 c8051f020+CH375读写U盘文件的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		  PrintfFat(j,2,(j-1)+(i/4)*4);
	  }
   switch(i%4)
     {
      case -1:    i=0;break;
//	  case 4:	  return 0x00;
	  case 0:     LCD_Printf(1,1,">>");
	              LCD_Printf(2,1,"  ");
				  LCD_Printf(3,1,"  ");
				  LCD_Printf(4,1,"  ");
				  break; 
	  case 1:     LCD_Printf(2,1,">>");
	              LCD_Printf(1,1,"  ");
				  LCD_Printf(3,1,"  ");
				  LCD_Printf(4,1,"  ");
				  break; 
	  case 2:     LCD_Printf(3,1,">>");
	              LCD_Printf(2,1,"  ");
				  LCD_Printf(1,1,"  ");
				  LCD_Printf(4,1,"  ");
				  break; 
	  case 3:     LCD_Printf(4,1,">>");
	              LCD_Printf(2,1,"  ");
				  LCD_Printf(3,1,"  ");
				  LCD_Printf(1,1,"  ");
				  break; 
     }
   }
}



void Opr_Menu_b(unsigned char file_num)
{
 unsigned char *pt,Remain;
 unsigned long FirstClustA;
 pt=Fat[file_num].ext;
 if(CurrtChainNum==0)
   {
	ClustChain[CurrtChainNum]=2;
    CurrtChainNum=1;
   }
 if(*(pt)==0x20)
   {
    ClustChain[CurrtChainNum]=Fat[file_num].St_Clust.value;
    CurrtChainNum++;
	Dis_Fat_In_Clust_b(Fat[file_num].St_Clust.value);
   }
  else
   {
    LCD_Clear ();
    LCD_Printf(2,2,"发送到另一盘?");
	if(Wait_Infrared()==OK)
	   {
	    LCD_Clear ();
        LCD_Printf(2,2,"正在发送...");
	    FirstClustA=WrFAT_a(file_num);
		do{
		   Remain=ReadBB(file_num);
 		   Remain=WriteBA(FirstClustA,file_num);
	      }while(Remain==0xff);

	   	RdFDT_b(file_num);
		WrFDT_a(FirstClustA);
		Rd_Sector_a(root_b);
	   }
	else return;
   }
}


void RdFDT_b(unsigned char file_num)
{
 unsigned char xdata *pt;
 unsigned char i,j=0,LFile=0;
 unsigned int temp_ofst;
 pt=Data_Buf;
 Rd_Sector_b(Fat[file_num].Sector);
 temp_ofst=Fat[file_num].Ofst;
 for(i=0;i<32;i++)
   {
    FDTBuf.Buf[i]=*(pt+temp_ofst+i);
	FDTBuf.FDTNum=32;
	
	if(*(pt+temp_ofst+i)>=0x7e&&i<8)
	   LFile=1;
	
   }
   j=1;
 if(LFile==0) return;
   
 do
   {
    if(temp_ofst==0)
	   {
	    Rd_Sector_b(Fat[file_num].Sector-1);
		temp_ofst=512;
		}
	 temp_ofst-=32;
	 for(i=0;i<32;i++)
	   {
	    FDTBuf.Buf[32*j+i]=*(pt+temp_ofst+i);
	   }
	 FDTBuf.FDTNum+=32;
	 j++;
   }while(*(pt+temp_ofst)<0x40);

}


void WrFDT_a(unsigned long FirstClust)
{
 unsigned char i,j,CtnsNum=0,SectOfst;
 unsigned char xdata *pt;
 unsigned int temp_ofst;
 pt=Data_Buf;
 FDTBuf.Buf[0x1a]=(unsigned char)FirstClust;		 //修改首簇号
 FDTBuf.Buf[0x1b]=(unsigned char)(FirstClust>>8);
 FDTBuf.Buf[0x14]=(unsigned char)(FirstClust>>16);
 FDTBuf.Buf[0x15]=(unsigned char)(FirstClust>>24);
 for(i=0;i<sect_clust_a;i++)
  {
   Rd_Sector_a(root_a+i);
   temp_ofst=0;
   for(j=0;j<16;j++)
      {
	   if(*(pt+j*32)==0||*(pt+j*32)==0xe5)
	      CtnsNum++;
	   else CtnsNum=0;
	   if(CtnsNum*32==FDTBuf.FDTNum)   //如果找到足够的FDT
	      {
		   temp_ofst=j*32;
		   break;
		  }
	  }
   if(j<16) 		   //如果是因为找到足够的FDT而跳出上一个循环
   	 {
	  SectOfst=i;
      break;
	 }
  }
  if(i==sect_clust_a) return;   //如果没找到空FDT
 for(i=0;i<CtnsNum;i++)
    {
	 for(j=0;j<32;j++)
	     {
		  *(pt+temp_ofst+j)=FDTBuf.Buf[32*i+j];
		 }
     if(temp_ofst==0)
	     {
		  Wr_Sector_a(root_a+SectOfst);
		  SectOfst--;
		  Rd_Sector_a(root_a+SectOfst);
		  temp_ofst=480;
		 }
	 else temp_ofst-=32;
	}
  Wr_Sector_a(root_a+SectOfst);
}

unsigned long WrFAT_a(unsigned char file_num)
{
 unsigned char xdata *pt;
 unsigned char SectFirst,SectChange;
 UINT32 data ClustNum;
 UINT32 temp_clust;
 struct{
 	    unsigned long SectOfst;
		unsigned int ByteOfst;
       }c1,c2;
 unsigned long data i;
 unsigned char data j;
 unsigned long fat_a,ChangeClust=0,SumClust,FirstClust=0;
 pt=Data_Buf;

 SumClust=Fat[file_num].Big.value/(512*sect_clust_a)+1;
 fat_a=hidd_sect_a+resv_sect_a;
 for(i=0;i<sect_fat_a;i++)
    {
     Rd_Sector_a(fat_a+i);
	 SectFirst=1;
	 SectChange=0;
	 for(j=0;j<128;j++)
	    {
		 ClustNum.num[3]=*(pt+j*4);
		 ClustNum.num[2]=*(pt+j*4+1);
		 ClustNum.num[1]=*(pt+j*4+2);
		 ClustNum.num[0]=*(pt+j*4+3);
		 if(ClustNum.value==0)		 //是否为空
		    {
			 SectChange=1;
			 if(FirstClust==0)
			   {
				FirstClust=j+128*i;		 //首簇号
				c1.SectOfst=i;
				c1.ByteOfst=j*4;
				c2.SectOfst=i;
				c2.ByteOfst=j*4;
				SectFirst=0;
			 	}
			 else
			    {
				 c2.SectOfst=i;
				 c2.ByteOfst=j*4;
				 temp_clust.value=j+128*i;	  //c2指向的簇号
				 if(SectFirst==1)		//若为此扇区的第一空簇
				    {
					 Rd_Sector_a(fat_a+c1.SectOfst);
					 *(pt+c1.ByteOfst)=temp_clust.num[3];
					 *(pt+c1.ByteOfst+1)=temp_clust.num[2];
					 *(pt+c1.ByteOfst+2)=temp_clust.num[1];
					 *(pt+c1.ByteOfst+3)=temp_clust.num[0];
					 Wr_Sector_a(fat_a+c1.SectOfst);
					 Wr_Sector_a(fat_a+sect_fat_a+c1.SectOfst);	//写FAT2
					 Rd_Sector_a(fat_a+c2.SectOfst);
					 c1=c2;
					 SectFirst=0;	
					}
				  else
				    {
					 *(pt+c1.ByteOfst)=temp_clust.num[3];
					 *(pt+c1.ByteOfst+1)=temp_clust.num[2];
					 *(pt+c1.ByteOfst+2)=temp_clust.num[1];
					 *(pt+c1.ByteOfst+3)=temp_clust.num[0];
					 c1=c2;
					}					
				 }
			ChangeClust++;
			if(ChangeClust>=SumClust) 
			   {
			    *(pt+c2.ByteOfst)=0xff;
			    *(pt+c2.ByteOfst+1)=0xff;
				*(pt+c2.ByteOfst+2)=0xff;
				*(pt+c2.ByteOfst+3)=0x0f;
			    break;			    
			   }			
			}
		}
	  if(SectChange==1)
	      {
	       Wr_Sector_a(fat_a+i);//此扇区修改完毕,写入,注:最后一空簇可能未写
	       Wr_Sector_a(fat_a+sect_fat_a+c1.SectOfst);    //写FAT2
	       if(ChangeClust>=SumClust) return FirstClust;
		  }
	}
}

unsigned char ReadBB(unsigned char file_num)	
{
 static unsigned char data TempSectOfstBB;
 unsigned char xdata *Fpt;
 unsigned int data temp_ofst;
 static unsigned long data BaseSectBB,SumSectorBB,SectorBB=0;
 Fpt=FATBufB; 
 if(SectorBB==0)
    {
     ClusterB.NextClust.value=Fat[file_num].St_Clust.value;		   
     SumSectorBB=Fat[file_num].Big.value/512+1;
	}
 if(SectorBB<=SumSectorBB)
    {
	 
	 if(SectorBB%sect_clust_b==0)
	    {
		 
		 if(ClusterB.NextClust.value/128!=ClusterB.CurrtClust/128||SectorBB==0)
		    {
			 ClusterB.CurrtClust=ClusterB.NextClust.value;
			 Rd_FAT_b(ClusterB.NextClust.value/128+resv_sect_b+hidd_sect_b);
			}
		 else
		    {
			  ClusterB.CurrtClust=ClusterB.NextClust.value;
			}
			  temp_ofst=(ClusterB.CurrtClust%128)*4;			
			  ClusterB.NextClust.num[3]=*(Fpt+temp_ofst);
			  ClusterB.NextClust.num[2]=*(Fpt+temp_ofst+1);
			  ClusterB.NextClust.num[1]=*(Fpt+temp_ofst+2);
			  ClusterB.NextClust.num[0]=*(Fpt+temp_ofst+3);
			  BaseSectBB=(ClusterB.CurrtClust-2)*sect_clust_b+root_b;
			  TempSectOfstBB=0;			
		}
	 Rd_Sector_b(BaseSectBB+TempSectOfstBB);		   //读一扇区
	 TempSectOfstBB++;
	 SectorBB++;
	}
  if(SectorBB>=SumSectorBB)
    {
	 SectorBB=0;
     return 0x00;
	}
  else return 0xff;
}

unsigned char WriteBA(unsigned long FirstClust,unsigned char file_num)		//BA表示B为主盘,对A操作
{
 static unsigned char data TempSectOfstBA;
 unsigned char xdata *Fpt;
 unsigned int data temp_ofst;
 static unsigned long data SectorBA=0,SumSectorBA,BaseSectBA;
 Fpt=FATBufA;
 if(SectorBA==0)
     {
      ClusterA.NextClust.value=FirstClust;
      SumSectorBA=Fat[file_num].Big.value/512+1;
	 }
 if(SectorBA<=SumSectorBA)
    {
	 
	 if(SectorBA%sect_clust_a==0)
	    {
		 
		 if(ClusterA.NextClust.value/128!=ClusterA.CurrtClust/128||SectorBA==0)
		    {
			 ClusterA.CurrtClust=ClusterA.NextClust.value;
			 Rd_FAT_a(ClusterA.NextClust.value/128+resv_sect_a+hidd_sect_a);
			}
		 else
		    {
			  ClusterA.CurrtClust=ClusterA.NextClust.value;
			}
			  temp_ofst=(ClusterA.CurrtClust%128)*4;			
			  ClusterA.NextClust.num[3]=*(Fpt+temp_ofst);
			  ClusterA.NextClust.num[2]=*(Fpt+temp_ofst+1);
			  ClusterA.NextClust.num[1]=*(Fpt+temp_ofst+2);
			  ClusterA.NextClust.num[0]=*(Fpt+temp_ofst+3);
			  BaseSectBA=(ClusterA.CurrtClust-2)*sect_clust_a+root_a;
			  TempSectOfstBA=0;			
		}
	 Wr_Sector_a(BaseSectBA+TempSectOfstBA);		   //读一扇区
	 TempSectOfstBA++;
	 SectorBA++;
	}
  if(SectorBA>=SumSectorBA) 
      {
	   SectorBA=0;
	   return 0x00;
	  }
  else return 0xff;
}



unsigned char Rd_FAT_b(unsigned long LBA)
{
  unsigned char sta,i,j,Next_Num=0;
  unsigned char xdata *pt;
  sta=0x1f;
  pt=FATBufB;
  CH375HM_INDEX_WR_b( DISK_READ );                        //从USB存储器读数据块 
  CH375HM_DATA_WR_b( (unsigned char)LBA );                //LBA的最低8位 
  CH375HM_DATA_WR_b( (unsigned char)( LBA >> 8 ) );
  CH375HM_DATA_WR_b( (unsigned char)( LBA >> 16 ) );
  CH375HM_DATA_WR_b( (unsigned char)( LBA >> 24 ) );      //LBA的最高8位 
  CH375HM_DATA_WR_b( 1 );                           //扇区数 
  Delay();
  for(i=0;i<9;i++)
    {
	sta=Wait_Int_b();
     if(sta==0x1f||sta==0x14) return sta;
	 CH375HM_INDEX_WR_b(RD_USB_DATA);
	 Next_Num=CH375HM_DATA_RD_b();
     for(j=0;j<Next_Num;j++)
	    {
		 *pt=CH375HM_DATA_RD_b();
		 pt++;
		}
	  CH375HM_INDEX_WR_b(DISK_RD_GO);
	 }
return 0xff;
}
								  

⌨️ 快捷键说明

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