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

📄 u_func_b.c

📁 c8051f020+CH375读写U盘文件的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<c8051f020.h>
#include<intrins.h>
#include"lcd.h"
#include"read_U.h"
#include"read_U_b.h"
#include"read_U_a.h"
//#include"infrared_receive.h"
#include<stdlib.h>


void CH375HM_INDEX_WR_b(index_b)
{

P5=index_b;
USB_A0b=1;
//P74OUT   = 0x0C;
USB_RDb=1;

USB_CSb=0;
USB_WRb=0;
Delay();
USB_WRb=1;
USB_CSb=1;
USB_A0b=1;
P5=0xff;
}
void CH375HM_DATA_WR_b(Data)
{ 
P5=Data;
//P74OUT   = 0x0C;
USB_A0b=0;
USB_CSb=0;
USB_WRb=0;
Delay();
USB_WRb=1;
USB_CSb=1;
USB_A0b=1;
P5=0xff;
}

unsigned char CH375HM_DATA_RD_b(void)
{
 unsigned char m; 
//P74OUT   = 0x0C;
 USB_A0b=0;
 USB_CSb=0;
 USB_RDb=0;
 Delay();
 m=P5;
 USB_RDb=1;
 USB_CSb=1;
 USB_A0b=1;
 return (m);
}

unsigned char Init_Disk_b()
{
    unsigned char sta;
	CH375HM_INDEX_WR_b(DISK_INIT);
    Delay();
	sta=Wait_Int_b();
    while(sta!=0x14);
	sta=USB_INT_DISK_ERR;
	CH375HM_INDEX_WR_b(DISK_READY);
	Delay();
    sta=Wait_Int_b();
	CH375HM_INDEX_WR_b(  DISK_R_SENSE );  // 检查USB 存储设备的错误 
    sta = Wait_Int_b( );  // 等待中断并获取状态 
	CH375HM_INDEX_WR_b(DISK_READY);
    sta=Wait_Int_b();
	return sta;	   
}

unsigned char Set_Mode_b(unsigned char mode)
{
    unsigned char temp;
 	CH375HM_INDEX_WR_b(SET_USB_MODE);
	CH375HM_DATA_WR_b(mode);
	temp=CH375HM_DATA_RD_b();
	return (temp);
}

	


unsigned char Rd_Sector_b(unsigned long LBA)
{
  unsigned char sta,i,j,Next_Num=0;
  unsigned char xdata *pt;
  sta=0x1f;
  pt=Data_Buf;
  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;
}

void Wr_Sector_b(unsigned long LBA)
{
 unsigned char sta,i,j;
  unsigned char xdata *pt;
  sta=0x1f;
  pt=Data_Buf;
  CH375HM_INDEX_WR_b( DISK_WRITE );                        // 写数据块到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=sta=Wait_Int_b();
     if(sta==0x1f||sta==0x14) return;
	 CH375HM_INDEX_WR_b(WR_USB_DATA7);
	 CH375HM_DATA_WR_b(64);
	 for(j=0;j<64;j++)
	   {
	    CH375HM_DATA_WR_b(*pt);
		pt++;
	   }
	 CH375HM_INDEX_WR_b(DISK_WR_GO);
	}
}


unsigned char Wait_Int_b()
{
 unsigned sta=0,temp=0;
 while(USB_INTb); 

 CH375HM_INDEX_WR_b(GET_STATUS);
 Delay();
 sta=CH375HM_DATA_RD_b();
 return sta;
}

unsigned char Get_Base_b()
{
 unsigned char a,b;
 unsigned char xdata *pt;
 Rd_Sector_b(0x00000000);
 pt=Data_Buf;
 a=*pt;b=*(pt+1);	  
 if(a!=0xeb&&b!=0x58)
    {
	 hidd_sect_b=*(pt+0x1c6);
	 Rd_Sector_b( (unsigned long)hidd_sect_b );
	}
 a=*pt;b=*(pt+1);
 if(a==0xeb&&b==0x58)
   {
    hidd_sect_b=*(pt+0x1c);
 	byte_sect_b=*(pt+0x0b)+(*(pt+0x0c)<<8);
	sect_clust_b=*(pt+0x0d);
	resv_sect_b=*(pt+0x0e)+(*(pt+0x0f)<<8);
    sect_fat_b=*(pt+0x24)+(*(pt+0x25)<<8);
	root_b=hidd_sect_b+resv_sect_b+2*sect_fat_b;
	return 0x14;
   }
 else return 0x1f; 
}


void Show_Disk_b()
{
 unsigned char i;
 unsigned char  *disk_name;		 
 unsigned char xdata *pt;
 unsigned int data charact;			 
 Rd_Sector_b(root_b);
 pt=Data_Buf;
 for(i=0;i<16;i++)
   {
//   charact=Data_Buf[0x0b+i*32];	//这种也赋不了
	charact=*(pt+0x0b+i*32);	  //charact不定义为data就赋不了值。???
    if(charact==0x08) 
       {
        disk_name=pt+i*32;		  //disk_name定义成指向xdata也赋不了值。???
        *(disk_name+11)=0;
        LCD_Printf(2,2,disk_name);
        return;
       }
   }

}  


void Get_Lfat_b()
{
 unsigned char xdata *pt;
 unsigned char temp1,temp2,i=0,*na,nai=0;
 unsigned int Temp_Ofst;
 unsigned char which[26]={1,3,5,7,9,14,16,18,20,22,24,28,30};  //确定长文件名储存的地方
 pt=Data_Buf;
 na=Fat[Currt_File].name;
 if(St_Ofst_b==0)		 //若短文件名在扇区的第一个32字节,则指向上一个扇区的最后32字节
    {
	 Rd_Sector_b(Rd_Rec.Last_Sect);
	 Temp_Ofst=480;		  
	}
 else Temp_Ofst=St_Ofst_b-32;//若短文件名不在本扇区的第一个32字节,则指向上一个32字节
 do{  //读长文件名  
    while(i<13)
	{
    temp1=*(pt+Temp_Ofst+which[i]);
	if(temp1==0x2e) 
	  {
	   *(na+nai)=0;
	   break;
	  }
	temp2=*(pt+Temp_Ofst+which[i]+1);
	if(temp2!=0)
	  {  
	   *(na+nai)=0x7e;
	   *(na+nai+1)=0x31;
	   *(na+nai+2)=0;
	   break;
	  }					 
	*(na+nai)=temp1;
	nai++;
	i++;
	}
	if(Temp_Ofst==0)  //若已在本扇区最开始
    {
	 if(*(pt+Temp_Ofst)<0x3f) break; //若是长文件名的最后一段
	 else
	   {
	    Rd_Sector_b(Rd_Rec.Last_Sect);
	    Temp_Ofst=512;
	   }
	}
	Temp_Ofst-=32;
   }while(*(pt+Temp_Ofst+32)<0x3f);
   Rd_Sector_b(Rd_Rec.Currt_Sect);
}

unsigned char Dis_Fat_In_Clust_b(unsigned long Menu_Clust)
{
 unsigned long Menu_LBA;
 unsigned char *na,i,j,rd_short=0;
 unsigned char xdata *pt;
 St_Ofst_b=0;
 Currt_File=0;
 File_Over=0;
 Menu_LBA=(Menu_Clust-2)*sect_clust_b+root_b;
 Rd_Rec.Currt_Sect=Rd_Rec.Last_Sect=Menu_LBA;
 Rd_Rec.Next_Sect=Rd_Rec.Currt_Sect+1;


 while(Rd_Rec.Currt_Sect-Menu_LBA<sect_clust_b)  //读完整个簇
   {
    Rd_Sector_b(Rd_Rec.Currt_Sect);
   pt=Data_Buf;
    if(*(pt+St_Ofst_b)!=0xe5&&*(pt+St_Ofst_b+11)!=0x0f&&*(pt+St_Ofst_b+11)!=0x08&&*(pt+St_Ofst_b)!=0x2e)	 //判断是否为有效文件
	  {
	  na=Fat[Currt_File].ext;		  //读扩展名
	  for(i=0;i<3;i++)
	     {
		   *(na+i)=*(pt+St_Ofst_b+8+i);
		 }
	  
//	  Fat[Currt_File].St_Clust=*(pt+St_Ofst+0x1a)+*(pt+St_Ofst+0x1b)<<8+*(pt+St_Ofst+0x14)<<16;	  //定义Fat[Currt_File].St_Clust为一个长整型这样赋不了值?
      
	  Fat[Currt_File].St_Clust.num[3]=*(pt+St_Ofst_b+0x1a);	   //起始簇
	  Fat[Currt_File].St_Clust.num[2]=*(pt+St_Ofst_b+0x1b);
	  Fat[Currt_File].St_Clust.num[1]=*(pt+St_Ofst_b+0x14);
	  Fat[Currt_File].St_Clust.num[0]=*(pt+St_Ofst_b+0x15);
//	  Fat[Currt_File].Big=*(pt+St_Ofst+0x1c)+*(pt+St_Ofst+0x1d)<<8+*(pt+St_Ofst+0x1e)<<16+*(pt+St_Ofst+0x1f)<<24;	//这个跟Fat[Currt_File].St_Clust一样赋不了??
	  Fat[Currt_File].Big.num[0]=*(pt+St_Ofst_b+0x1f);  //文件大小
	  Fat[Currt_File].Big.num[1]=*(pt+St_Ofst_b+0x1e);
	  Fat[Currt_File].Big.num[2]=*(pt+St_Ofst_b+0x1d);
	  Fat[Currt_File].Big.num[3]=*(pt+St_Ofst_b+0x1c);

	  Fat[Currt_File].Sector=Rd_Rec.Currt_Sect;   //文件目录项所在的扇区
	  Fat[Currt_File].Ofst=St_Ofst_b;             //文件目录项所在的偏移量

	  if(*(pt+St_Ofst_b+6)==0x7e||*(pt+St_Ofst_b+5)==0x7e)
	   for(i=0;i<8;i++)
	     {		  
		     if(*(pt+St_Ofst_b+i)>0x7e)
		          {
				   rd_short=1;
				   break;
				   }
			 else rd_short=0;		  
		 }
	  else rd_short=1; 
	   if(rd_short)	   //是否为短文件名或是中文名
	      {
		   na=Fat[Currt_File].name;
		   for(j=0;j<8;j++)
		      *(na+j)=*(pt+St_Ofst_b+j);
		   *(na+8)=0;
		  }
	   else			   //若是长文件名
	    Get_Lfat_b();
	   Currt_File++;
//	   if(Currt_File==4) return  Currt_File;		
	  }
	St_Ofst_b+=32;
	
	if(St_Ofst_b==512)
	  {
	   	St_Ofst_b=0;
	    Rd_Rec.Currt_Sect++;
		Rd_Rec.Last_Sect=Rd_Rec.Currt_Sect-1;
		Rd_Rec.Next_Sect=Rd_Rec.Currt_Sect+1;
		Sect_Ofst_b++;
//	   return Currt_File; //
	   }	
	if(*(pt+St_Ofst_b)==0) 
	  {
	   St_Ofst_b=0;
	   return 0xff;	//文件名已读完,返回0xff
	  }
   }
 return Currt_File;
}			

unsigned char Key_Opare_b()
{ 
 signed char Key,i=0,j;
// LCD_Printf(1,1,">>");
CurrtChainNum=0;	
 while(1)
  {
   Key=Wait_Infrared();
   switch(Key)
     {
	   case UP:     i--;break;
	   case DOWN:   i++;break; 
	   case OK:     Opr_Menu_b(i);i=0;break;
	   case CANCEL: if(CurrtChainNum==0) break;	                
					CurrtChainNum-=2;
	                i=0;
					Dis_Fat_In_Clust_b(ClustChain[CurrtChainNum]);
					CurrtChainNum++;
					break;
	   case 0x0b:   return 0;          
	 }
	 if(i>=Currt_File) i=Currt_File-1;
	 if((i/4)==(Currt_File/4))
	 {
	  j=1;
	  LCD_Clear ();
	  while((j+(i/4)*4)<=Currt_File)
	    {
		 PrintfFat(j,2,(j-1)+(i/4)*4);
		 j++;
		}
	 }
	 else
	 {
//	  LCD_Clear ();
		for(j=1;j<=4;j++)

⌨️ 快捷键说明

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