📄 u_func_b.c
字号:
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 + -