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