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