?? sd_file.c
字號:
#include"lpc214x.h"
#include "PCF8833.h"
#include "head.h"
//INT8U file_name[12];
INT8U file_list[2048]; //每個目錄支持64個文件項,如需增加可加大緩存
INT8U page[130];
//以下均為扇區(qū)數(shù)
INT32U drive_size=0;
INT32U folder_father=0;
INT32U folder_current=0;
INT32U root_add=0;
INT32U file_add=0;
INT32U file_len=0;
INT16U file_num=0; //整個SD卡中卡中的文件號數(shù)
INT8U file_att=0; //文件屬性,判斷是否為文件夾
INT16U page_num=0;
INT32U byte_num=0;
INT8U page_byte[1024];
INT8U page_att=0; //文章特征位,判斷是否結(jié)束,或則是否到第一頁
INT8U botten=0; //按鍵標志位
INT32U BOOT_dispose(INT8U *Buffer)
{
INT32U sector_hidden=0; //此處必須清0,否則導致根目錄的讀取錯誤
INT32U sector_Reserved=0;
INT32U fat_size=0;
INT32U a=0;
/* //此處為讀取扇區(qū)大小,因為扇區(qū)均為512字節(jié),所以此處不讀取
INT16U sector_size=0;
a=*(Buffer+0x0c);
a=a<<8;
a=a|*(Buffer+0x0b);
sector_size=a;
*/
a=*(Buffer+0x1f)<<24;
sector_hidden|=a;
a=*(Buffer+0x1e)<<16;
sector_hidden|=a;
a=*(Buffer+0x1d)<<8;
sector_hidden|=a;
a=*(Buffer+0x1c);
sector_hidden|=a;
a=*(Buffer+0x0f)<<8;
sector_Reserved|=a;
a=*(Buffer+0x0e);
sector_Reserved|=a;
a=*(Buffer+0x23)<<24;
drive_size|=a;
a=*(Buffer+0x22)<<16;
drive_size|=a;
a=*(Buffer+0x21)<<8;
drive_size|=a;
a=*(Buffer+0x20);
drive_size|=a;
a=*(Buffer+0x27)<<24;
fat_size|=a;
a=*(Buffer+0x26)<<16;
fat_size|=a;
a=*(Buffer+0x25)<<8;
fat_size|=a;
a=*(Buffer+0x24);
fat_size|=a;
root_add=(sector_hidden+sector_Reserved+fat_size*2);
return(root_add);
}
dispose(INT16U i,INT8U *Buffer)
{
if(*(Buffer+i)==0x2E) //子文件夾目錄
return(3);
if(*(Buffer+i)==0) //目錄結(jié)束
return(2);
if(*(Buffer+i+11)==0x0f) //長文件名
return(1);
if(*(Buffer+i)==0xe5) //此文件已被刪
return(1);
return(0); //短文件文件
}
INT16U SD_List(INT32U add0,INT8U *Buffer)
{
INT8U response,a,a1,b,c;
INT16U i,num;
INT32U add=0;
// INT8U LIST[16];
num=0; //FILE——LIST的序號,每32個字節(jié)做為一個單位來存儲文件信息
a1=1;
// y=0;
c=0;
file_num=0;
PCF8833CLR();
folder_father=root_add; //先定義父文件為根目錄,使整個程序一致性
folder_current=root_add;
while(a1)
{
SD_READ(Buffer,512,add0);
a=1;
i=0;
while(a)
{
// j=0;
response=dispose(i,Buffer);
if(response==0)
{
for(b=0;b<32;b++) //讀取有用的文件信息以待讀取文件時用
{
file_list[num]=*(Buffer+i);
num++;
i++;
}
file_num+=1;
if(i==512)
{
add0+=1;
a=0;
}
}
if(response==1)
{
i=i+0x20;
if(i==512)
{
add0+=1;
a=0;
i=0;
}
}
if(response==2)
{
a=0;
a1=0;
}
if(response==3)
{
if(c==0)
{
folder_current=0;
add=*(Buffer+i+21);
add=add<<24;
folder_current|=add;
add=*(Buffer+i+20);
add=add<<16;
folder_current|=add;
add=*(Buffer+i+27);
add=add<<8;
folder_current|=add;
add=*(Buffer+i+26);
add=add<<0;
folder_current|=add;
if(folder_current==0) folder_current=2;
folder_current=(folder_current-2)*8+root_add;
}
else
{
folder_father=0; //為了消除原來已定義的根目錄的影響
add=*(Buffer+i+21);
add=add<<24;
folder_father|=add;
add=*(Buffer+i+20);
add=add<<16;
folder_father|=add;
add=*(Buffer+i+27);
add=add<<8;
folder_father|=add;
add=*(Buffer+i+26);
add=add<<0;
folder_father|=add;
if(folder_father==0) folder_father=2;
folder_father=(folder_father-2)*8+root_add;
}
c++;
i=i+0x20;
}
}
}
LIST_dispose(0);
return(file_num);
}
file_info_dispose(INT8U *buffer)
{
INT32U a;
/* INT8U i,b;
for(b=0;b<12;b++) //得到文件的名稱,因為后面程序沒有用到名稱,所以先刪除
{
file_name[b]=0;
}
for(b=0;b<8;b++)
{
if(*(buffer+b)!=0x20)
{
file_name[i]=*(buffer+b);
}
else
{
b=7;
file_name[i]='.';
}
i++;
}
for(b=8;b<11;b++)
{
file_name[i]=*(buffer+b);
i++;
}
*/
file_att=*(buffer+0xb); //得到文件的屬性
a=0;
file_add=0;
a=*(buffer+21);
a=a<<24;
file_add|=a;
a=0;
a=*(buffer+20);
a=a<<16;
file_add|=a;
a=*(buffer+27);
a=a<<8;
file_add|=a;
a=*(buffer+26);
file_add|=a;
file_add=(file_add-2)*8+root_add; //將地址從簇號轉(zhuǎn)換為扇區(qū)號;
file_len=0;
a=*(buffer+31);
a=a<<24;
file_len|=a;
a=*(buffer+30);
a=a<<16;
file_len|=a;
a=*(buffer+29);
a=a<<8;
file_len|=a;
a=*(buffer+28);
file_len|=a; //得到文件的長度
}
INT8U byte_count(unsigned char *c) //默認X=Y=0
{
INT8U i,j,i0,j0;
INT8U n=0;
INT8U y=0;
i=j=i0=j0=0;
while(*c)
{
if((*c&0x80)!=0)
{
if((i*16+j*8)>112)
{
i0=i0+i; j0=j0+j;
i=0;
j=0;
y=y+16;
if(y==128)
{
n=2*i0+j0;
return(n);
}
}
i=i+1;
c=c+2;
}
else
{
if((i*16+j*8)>120)
{
i0=i0+i; j0=j0+j;
i=0;
j=0;
y=y+16;
if(y==128)
{
n=2*i0+j0;
return(n);
}
}
j=j+1;
c=c+1;
}
}
i0=i0+i; j0=j0+j;
n=2*i0+j0;
page_att=4; //此處表明文章結(jié)束
return(n); //此處說明顯示結(jié)束
}
text_key_dispose(INT8U key,INT8U *Buffer)
{
INT16U i,j;
INT8U direction,n;
INT8U n0=0;
INT32U file_add0;
direction=1;
switch(key)
{
case 2: if(page_att==2) direction=0; //向前翻頁
else direction=2;
if(botten==1) //表明剛從向后按鍵返回至向前翻頁
{
n=page_byte[page_num]; //加入此段代碼是為了消除向后翻頁和向前翻頁的指向不同
byte_num-=n; //向后翻頁byte_num指向的是后一頁的開始
//向前翻頁byte_num指向的是前一頁的最后(本頁的開始)
}
botten=2; //向前翻頁
break;
case 5: if(page_att==1) direction=0; //向后翻頁
else direction=1;
botten=1; //表明為向后翻頁
break;
case 3: SD_List(folder_father,Buffer);
return(0);
case 6: SD_List(root_add,Buffer);
return(0);
default:
direction=0;
break;
}
switch(direction)
{
case 0: break;
case 1:
page_num+=1;
i=byte_num/512;
j=byte_num%512;
file_add0=file_add+i; //得到扇區(qū)地址
SD_READ(Buffer,512,file_add0);
for(i=0;i<130;i++)
{
if((i+j)==512)
{
file_add0+=1;
SD_READ(Buffer,512,file_add0);
j=0;
n0=0;
}
page[i]=*(Buffer+j+n0);
n0++;
}
n=byte_count(page);
page_byte[page_num]=n;
byte_num+=n;
if(page_att==4) page_att=1; //表示已為最后一頁
else
{
page_att=0; //一般頁面
for(i=n;i<130;i++)
{
page[i]=0;
}
}
PCF8833CLR();
PutGBstring(0,0,page,0xf800,0xffff);
break;
case 2:
page_num-=1;
if(page_num==1) page_att=2; //表示為第一頁
else page_att=0; //一般頁面
n=page_byte[page_num];
byte_num-=n;
i=byte_num/512;
j=byte_num%512;
file_add0=file_add+i; //得到扇區(qū)地址
SD_READ(Buffer,512,file_add0);
for(i=0;i<n;i++)
{
if((i+j)==512)
{
file_add0+=1;
SD_READ(Buffer,512,file_add0);
j=0;
n0=0;
}
page[i]=*(Buffer+j+n0);
n0++;
}
for(i=n;i<130;i++) page[i]=0;
PCF8833CLR();
PutGBstring(0,0,page,0xf800,0xffff);
if(page_num==1)
{
page_att=2; //表示為第一頁
byte_num+=n;
}
else page_att=0; //一般頁面
break;
}
return(1);
}
read_content(INT8U *Buffer)
{
INT8U key,a;
if(folder_father==root_add) ; //如果是根目錄地址,則說明當前目錄為0,不需要轉(zhuǎn)化
folder_father=folder_current; //把原來的當前文件夾的當前目錄轉(zhuǎn)化為根目錄
a=1;
key=5;
while(a)
{
a=text_key_dispose(key,Buffer);
key=key_scan();
}
}
INT16U read_file(INT16U file_id,INT8U *Buffer)
{
INT8U file_info[32];
INT16U i=0;
INT8U b;
i=file_id*32;
for(b=0;b<32;b++)
{
file_info[b]=file_list[i];
i++;
}
file_info_dispose(file_info);
PCF8833CLR();
if(file_att==0x20)
read_content(Buffer);
else
file_num=SD_List(file_add,Buffer);
return(file_num);
}
void LIST_dispose(INT16U file_id)
{
INT8U y=0;
INT8U i,j;
INT8U name_list[14];
for(i=0;i<12;i++)
name_list[i]=0;
if(file_id<8)
{
if(file_num<8)
{
for(j=0;j<file_num;j++)
{
for(i=0;i<15;i++)
name_list[i]=0;
for(i=0;i<12;i++)
{
name_list[i]=file_list[32*j+i];
}
PutGBstring(0,16*j,name_list,0xf800,0xffff);
}
}
else
for(j=0;j<8;j++)
{
for(i=0;i<15;i++)
name_list[i]=0;
for(i=0;i<12;i++)
{
name_list[i]=file_list[32*j+i];
}
PutGBstring(0,16*j,name_list,0xf800,0xffff);
}
y=file_id*16;
PutGBstring(120,y,"*",0xf800,0xffe0);
}
else
{
PCF8833CLR();
for(j=(file_id-7);j<=file_id;j++)
{
for(i=0;i<12;i++)
{
// for(i=0;i<15;i++)
// name_list[i]=0;
name_list[i]=file_list[32*j+i];
}
PutGBstring(0,y,name_list,0xf800,0xffff);
y+=16;
}
PutGBstring(120,112,"*",0xf800,0xffe0);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -