#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个
5星 · 超过95%的资源 需积分: 49 36 下载量 163 浏览量
2020-02-27
10:33:20
上传
评论 4
收藏 4.7MB RAR 举报
温馨提示
MCS-51单片机C语言编程100例配套C程序源代码 主要以STC15F2K60S2为主讲解STC单片机的编程及应用,C程序+仿真程序,MDK编程环境,方便大家使用和学习。
资源推荐
资源详情
资源评论
收起资源包目录
MCS-51单片机C语言编程100例.rar (1606个子文件)
44444-55 0B
76 0B
STARTUP.A51 6KB
STARTUP.A51 6KB
ShiLi1_01.uvgui.Administrator 88KB
ShiLi1_02.uvgui.Administrator 88KB
ShiLi1_04.uvgui.Administrator 88KB
ShiLi1_03.uvgui.Administrator 88KB
ShiLi1_06.uvgui.Administrator 88KB
ShiLi1_05.uvgui.Administrator 88KB
ShiLi3_24T.uvgui.Administrator 69KB
ShiLi3_24R.uvgui.Administrator 69KB
ShiLi3_14.uvgui.Administrator 69KB
ShiLi3_22.uvgui.Administrator 69KB
ShiLi3_17.uvgui.Administrator 69KB
ShiLi3_21.uvgui.Administrator 69KB
ShiLi3_09.uvgui.Administrator 69KB
ShiLi3_16.uvgui.Administrator 69KB
ShiLi2_26.uvgui.Administrator 69KB
ShiLi2_10.uvgui.Administrator 69KB
ShiLi3_08.uvgui.Administrator 69KB
ShiLi2_06.uvgui.Administrator 69KB
ShiLi2_24.uvgui.Administrator 69KB
ShiLi3_13.uvgui.Administrator 69KB
ShiLi3_25.uvgui.Administrator 69KB
ShiLi3_10.uvgui.Administrator 69KB
ShiLi3_03.uvgui.Administrator 69KB
ShiLi2_09.uvgui.Administrator 69KB
ShiLi3_12.uvgui.Administrator 69KB
ShiLi2_28.uvgui.Administrator 69KB
ShiLi2_16.uvgui.Administrator 69KB
ShiLi2_33.uvgui.Administrator 69KB
ShiLi2_08.uvgui.Administrator 69KB
ShiLi2_07.uvgui.Administrator 69KB
ShiLi3_04.uvgui.Administrator 69KB
ShiLi3_23.uvgui.Administrator 69KB
ShiLi3_11.uvgui.Administrator 69KB
ShiLi3_02.uvgui.Administrator 69KB
ShiLi3_06.uvgui.Administrator 69KB
ShiLi3_18.uvgui.Administrator 69KB
ShiLi3_07.uvgui.Administrator 69KB
ShiLi2_11.uvgui.Administrator 69KB
ShiLi2_22.uvgui.Administrator 69KB
ShiLi3_15.uvgui.Administrator 69KB
ShiLi2_03.uvgui.Administrator 69KB
ShiLi3_19.uvgui.Administrator 69KB
ShiLi2_02.uvgui.Administrator 69KB
ShiLi2_27.uvgui.Administrator 69KB
ShiLi2_12.uvgui.Administrator 69KB
ShiLi1_39.uvgui.Administrator 69KB
ShiLi1_31.uvgui.Administrator 69KB
ShiLi2_17.uvgui.Administrator 69KB
ShiLi2_21.uvgui.Administrator 69KB
ShiLi1_18.uvgui.Administrator 69KB
ShiLi2_13.uvgui.Administrator 69KB
ShiLi1_32.uvgui.Administrator 69KB
ShiLi1_29.uvgui.Administrator 69KB
ShiLi1_16.uvgui.Administrator 69KB
ShiLi1_33.uvgui.Administrator 69KB
ShiLi3_01.uvgui.Administrator 69KB
ShiLi3_05.uvgui.Administrator 69KB
ShiLi2_20.uvgui.Administrator 69KB
ShiLi2_04.uvgui.Administrator 69KB
ShiLi1_40.uvgui.Administrator 69KB
ShiLi1_34.uvgui.Administrator 69KB
ShiLi2_01.uvgui.Administrator 69KB
ShiLi2_35.uvgui.Administrator 69KB
ShiLi2_05.uvgui.Administrator 69KB
ShiLi1_35.uvgui.Administrator 69KB
ShiLi1_22.uvgui.Administrator 69KB
ShiLi1_19.uvgui.Administrator 69KB
ShiLi1_17.uvgui.Administrator 69KB
ShiLi1_20.uvgui.Administrator 69KB
ShiLi1_26.uvgui.Administrator 69KB
ShiLi1_23.uvgui.Administrator 69KB
ShiLi1_30.uvgui.Administrator 69KB
ShiLi1_37.uvgui.Administrator 69KB
ShiLi3_20.uvgui.Administrator 69KB
ShiLi2_25.uvgui.Administrator 69KB
ShiLi2_34.uvgui.Administrator 69KB
ShiLi2_18.uvgui.Administrator 69KB
ShiLi2_23.uvgui.Administrator 69KB
ShiLi2_30.uvgui.Administrator 69KB
ShiLi1_36.uvgui.Administrator 69KB
ShiLi2_32.uvgui.Administrator 69KB
ShiLi2_14.uvgui.Administrator 69KB
ShiLi2_15.uvgui.Administrator 69KB
ShiLi1_21.uvgui.Administrator 69KB
ShiLi1_28.uvgui.Administrator 69KB
ShiLi1_25.uvgui.Administrator 69KB
ShiLi2_29.uvgui.Administrator 69KB
ShiLi1_27.uvgui.Administrator 69KB
ShiLi2_19.uvgui.Administrator 69KB
ShiLi1_38.uvgui.Administrator 69KB
ShiLi1_24.uvgui.Administrator 69KB
ShiLi2_31.uvgui.Administrator 69KB
ShiLi1_07.uvgui.Administrator 69KB
ShiLi1_08.uvgui.Administrator 69KB
ShiLi1_12.uvgui.Administrator 69KB
ShiLi1_15.uvgui.Administrator 69KB
共 1606 条
- 1
- 2
- 3
- 4
- 5
- 6
- 17
资源评论
- 是因为太久2023-07-26这个文件不仅收录了大量实用的编程例子,而且语言简洁明了,易于理解和实践。
- 思想假2023-07-26这个文件提供了丰富的MCS-51单片机C语言编程示例,对于初学者而言非常友好。
- 阿葱的葱白2023-07-26经过学习这个文件中的例子,我对MCS-51单片机C语言编程有了更深入的理解,感觉受益匪浅。
- Period熹微2023-07-26这个文件的编程例子覆盖了各种应用场景,能够帮助程序员快速掌握MCS-51单片机C语言的编程技巧。
- 爱吃番茄great2023-07-26对于想要深入学习MCS-51单片机C语言编程的人来说,这个文件是一个不可或缺的参考资料。
wenroudelang8888
- 粉丝: 55
- 资源: 42
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功