#include <string.h>
#include "znfat.h"
#include "sd.h"
//========================================================================================================
//--- 全局变量定义 ---
struct direntry temp_rec;
INT8 temp_dir_name[13];
UINT32 temp_dir_cluster;
UINT32 temp_last_cluster;
UINT8 znFAT_Buffer[512]; //--- 扇区数据读写缓冲区,由外部提供 ---
//========================================================================================================
//--- znFAT的存储设备底层驱动接口,读取存储设备的addr扇区的512个字节的数据放入buf数据缓冲区中 ---
UINT8 znFAT_ReadSector(UINT32 addr,UINT8 *buf)
{
switch(Dev_No) //--- 由Dev_No来决定所使用的存储设备驱动 ---
{
case SDCARD:
return SD_ReadSingleBlock(addr,buf);
break;
}
return 0;
}
//========================================================================================================
//--- 小端转大端,即LittleEndian车BigEndian ---
UINT32 LE2BE(UINT8 *dat,UINT8 len)
{
UINT32 temp = 0;
UINT32 fact = 1;
UINT8 i = 0;
for(i=0;i<len;i++)
{
temp += dat[i] * fact; //--- 将各字节乘以相应的权值后累加 ---
fact *= 256; //--- 更新权值 ---
}
return temp;
}
//========================================================================================================
//--- 将小字字符转为大写 ---
INT8 L2U(INT8 c)
{
if(c>='a' && c<='z') return c+'A'-'a';
else return c;
}
//========================================================================================================
//--- 寻找启动扇区所有位置 ---
unsigned long FindFAT_BootParameterBlock(unsigned long Capacity)
{
unsigned long i = 0,j = 0;
while(i < Capacity)
{
if(0 == SD_ReadSingleBlock(i / sizeof(znFAT_Buffer),znFAT_Buffer))
{
if((0xEB == znFAT_Buffer[0]) && (0x90 == znFAT_Buffer[2]))
{
j = i;
i = Capacity;
}
else
{
j = i;
i += sizeof(znFAT_Buffer);
}
}
}
return(j);
}
//========================================================================================================
//--- 得到DBR所在的扇区号(如果没有MBR,则DBR就在0扇区) ---
UINT16 znFAT_Find_DBR(void)
{
unsigned long temp;
temp = FindFAT_BootParameterBlock(SD_GetCapacity());
return(temp / sizeof(znFAT_Buffer));
}
//========================================================================================================
//--- 读取FSInfo获取最近的一个可用空闲簇 ---
UINT32 Search_Last_Usable_Cluster(void)
{
znFAT_ReadSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
return LE2BE(((struct FSInfo *)znFAT_Buffer)->Last_Cluster,4);
}
//========================================================================================================
//--- znFAT文件系统初始化 ---
void znFAT_Init(void)
{
struct znFAT_BPB *bpb;
bpb=(struct znFAT_BPB *)(znFAT_Buffer); //--- 将数据缓冲区指针转为struct znFAT_BPB 型指针 ---
pArg->DEV_No = Dev_No; //--- 装入设备号 ---
pArg->BPB_Sector_No = znFAT_Find_DBR(); //--- znFAT_FindBPB()可以返回BPB所在的扇区号 ---
znFAT_ReadSector(pArg->BPB_Sector_No,znFAT_Buffer);
pArg->FATsectors = LE2BE((bpb->BPB_FATSz32) ,4); //--- 装入FAT表占用的扇区数到FATsectors中 ---
pArg->FirstDirClust = LE2BE((bpb->BPB_RootClus) ,4); //--- 装入根目录簇号到FirstDirClust中 ---
pArg->BytesPerSector = LE2BE((bpb->BPB_BytesPerSec),2); //--- 装入每扇区字节数到BytesPerSector中 ---
pArg->SectorsPerClust = LE2BE((bpb->BPB_SecPerClus) ,1);//--- 装入每簇扇区数到SectorsPerClust中 ---
//--- 装入第一个FAT表扇区号到FirstFATSector中 ---
pArg->FirstFATSector = LE2BE((bpb->BPB_RsvdSecCnt) ,2) + pArg->BPB_Sector_No;
//--- 装入第一个目录扇区到FirstDirSector中 ---
pArg->FirstDirSector = (pArg->FirstFATSector)+(bpb->BPB_NumFATs[0])*(pArg->FATsectors);
pArg->Total_Size = LE2BE((bpb->BPB_TotSec32),4)*pArg->BytesPerSector; //--- 磁盘的总容量,单位是字节 ---
temp_last_cluster=Search_Last_Usable_Cluster();
}
//========================================================================================================
//--- 获得下一个簇的簇号 ---
#ifdef ZNFAT_GETNEXTCLUSTER
UINT32 znFAT_GetNextCluster(UINT32 LastCluster)
{
UINT32 temp;
struct znFAT_FAT *pFAT;
struct znFAT_FAT_Item *pFAT_Item;
temp=((LastCluster/128)+pArg->FirstFATSector);
znFAT_ReadSector(temp,znFAT_Buffer);
pFAT=(struct znFAT_FAT *)znFAT_Buffer;
pFAT_Item=&((pFAT->Items)[LastCluster%128]);
return LE2BE((UINT8 *)pFAT_Item,4);
}
#endif
//========================================================================================================
//--- 比较目录名 ---
#ifdef COMPARE_DIR_NAME
UINT8 Compare_Dir_Name(CONST INT8 *a,CONST INT8 *b)
{
UINT8 i;
for(i=0;i<8;i++)
{
if(a[i]!=b[i]) return 0;
}
return 1;
}
#endif
//========================================================================================================
//--- 文件名匹配(支持带*?通配符的文件名的匹配) ---
#ifdef FILENAMEMATCH
UINT8 FilenameMatch(INT8 *pat,INT8 *name)
{
UINT8 match,ndone;
INT8 *cpp,*cpn;
cpp = pat;
cpn = name;
match = 1;
ndone = 1;
while(ndone)
{
switch (*cpp)
{
case '*':
cpp ++;
cpn = strchr(cpn,*cpp);
if(cpn == NULL)
{
cpn = name;
while(*cpn)cpn++;
}
break;
case '?':
cpp ++;
cpn ++;
break;
case 0:
if(*cpn != 0)
match = 0;
ndone = 0;
break;
default:
if((*cpp) == (*cpn))
{
cpp ++;
cpn ++;
}
else
{
match = 0;
ndone = 0;
}
break;
}
}
return(match);
}
#endif
//========================================================================================================
//--- znFAT的文件目录项的文件名字段(8个字节),转为普通的文件名 ---
#ifdef ZNFAT_TOFILENAME
void znFAT_toFileName(CONST INT8 *dName,INT8 *pName)
{
UINT8 i = 0;
for(i=0;i<8;i++)pName[i] = dName[i];
pName[8]='.';
for(i=9;i<12;i++)pName[i] = dName[i-1];
i--;
while(pName[i] == 0x20) pName[i--] = 0;
pName[i + 1] = 0;
i = 7;
while(pName[i --] == 0x20);
i += 2;
strcpy(pName+i,pName+8);
}
#endif
//========================================================================================================
//--- 将字符串中的小写字符都转为大写字符 ---
#ifdef STR2UP
void Str2Up(INT8 *str)
{
UINT8 len = strlen(str),i;
for(i=0;i<len;i++)
{
str[i]=L2U(str[i]);
}
}
#endif
//========================================================================================================
//--- 进入一个目录 ---
#ifdef ZNFAT_ENTER_DIR
UINT32 znFAT_Enter_Dir(CONST INT8 *path)
{
UINT32 Cur_Clust,sec_temp,iSec,iDir,Old_Clust;
UINT8 i = 1,counter = 0,flag = 0;
struct direntry *pDir;
INT8 name[20];
Cur_Clust = pArg->FirstDirClust;
if(path[1] == 0 && path[0] == '\\')return Cur_Clust;
else
{
while(path[i]!=0)
{
if(path[i] == '\\')
{
for(;counter<8;counter++)name[counter] = ' ';
name[counter] = 0;
counter = 0;
do
{
sec_temp = (SOC(Cur_Clust));
for(iSec=sec_temp;iSec<sec_temp+pArg->SectorsPerClust;iSec++)
{
znFAT_ReadSector(iSec,znFAT_Buffer);
for(iDir=0;iDir<pArg->BytesPerSe
没有合适的资源?快使用搜索试试~ 我知道了~
MCS-51单片机C语言编程100例.rar

共1606个文件
obj:158个
c:156个
lst:156个

需积分: 49 2.2k 浏览量
2020-02-27
10:33:20
上传
评论 3
收藏 4.7MB RAR 举报
MCS-51单片机C语言编程100例配套C程序源代码 主要以STC15F2K60S2为主讲解STC单片机的编程及应用,C程序+仿真程序,MDK编程环境,方便大家使用和学习。
资源推荐
资源详情
资源评论





收起资源包目录





































































































共 1606 条
- 1
- 2
- 3
- 4
- 5
- 6
- 17
资源评论

wenroudelang8888
- 粉丝: 34
- 资源: 41

上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
