📄 file.c
字号:
// 输 出: Null
// 功能描述:有NandFlash中载入字库
// 全局变量:aucHZK,aucEK
// 注 意: NandFlash中必须要有HZ267616.txt(16*16汉字库)和ASCI4096.txt(16*8字母库)
// 若没有,则可通过USB下载后,将系统重起
//------------------------------------------------------------------
static void LoadFont(void)
{
// INT8U aucHzName[32]={'H','Z','2','6','7','6','1','6','T','X','T'};
// INT8U aucEngName[32]={'A','S','C','I','4','0','9','6','T','X','T'};
// INT8U aucPyName[32] = {'P','Y','K','1','6','6','7','6','T','X','T'};
// FlashReadFile(aucHzName,aucHZK);
// FlashReadFile(aucEngName,aucEK);
// FlashReadFile(aucPyName,aucPYK);
}
//------------------------------------------------------------------
// 函数名:INT32U Dir(INT32U root_block_num, INT8U *file_count)
// 输 入: INT32U root_block_num 所要显示的目录所在的block号
// INT8U *file_count 当前目录文件个数
// 输 出: 1--成功
// 0--失败
// 功能描述: 显示root_block_num内的文件目录
// 全局变量: INT8U root_Buf[512][32]存放当前目录表的信息
// INT32U pre_root 上层目录的位置
// INT32U current_root 当前目录的位置
// DIR_Flash 每个数组元素存放一个文件的信息
//------------------------------------------------------------------
INT32U Dir(INT32U root_block_num, INT8U *file_count)
{
INT32U ulPageNum,Pointer,j,i,j_backup;
INT8U iInfNum,iNamePoint;
memset(root_buf, 0,512*32);
memset(DIR_Flash, 0,100*sizeof(STRU_LongDIR_INFO));
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
/*将Root information读到root_buf中*/
ReadPage(root_block_num,ulPageNum,Page_Buf);
for(Pointer=0;Pointer<512;Pointer++)
{
root_buf[ulPageNum*16+Pointer/32][Pointer%32]=Page_Buf[Pointer];
//root_buf[文件条序号][文件目录信息],每页16个32byte结构(即每页16条文件信息)
}
}
//--------------------------------------------------------------------
for ( iNamePoint=0,j = 0; j < 512&&iNamePoint<100; j++) // j 是当前的infomation号码
{
if ((root_buf[j][0]== 0)||(root_buf[j][0]== 0x05)||(root_buf[j][0]== 0xe5))
{
continue;
}
else if(root_buf[j][11]== 0x0f) //长文件名
{
iInfNum=0x0f&root_buf[j][0]; //长文件名所占信息条数
DIR_Flash[iNamePoint].ulUnitNo=j;
DIR_Flash[iNamePoint].ucUnitNum=iInfNum+1;
j_backup=j+iInfNum+1;
for(i=0;i<11;i++) //存储它的短文件名信息
{
DIR_Flash[iNamePoint].ucDirShortName[i]=root_buf[j_backup][i];
}
DIR_Flash[iNamePoint].ucDirAttr=root_buf[j_backup][11];
DIR_Flash[iNamePoint].ulDirFileSize=((INT32U)root_buf[j_backup][29]<<8)+(INT32U)root_buf[j_backup][28]+
((INT32U)root_buf[j_backup][31]<<24)+((INT32U)root_buf[j_backup][30]<<16);
DIR_Flash[iNamePoint].ulDirFstClus=((INT32U)root_buf[j_backup][27]<<8)+(INT32U)root_buf[j_backup][26];
j_backup--; //j_backup指向01条文件信息
for(Pointer=0;iInfNum>0;iInfNum--)
{
for(i=1;i<32;i++,Pointer++,j_backup--)
{
switch(i)
{
case 11: i=14;
break;
case 26: i=28;
break;
default: break;
}
DIR_Flash[iNamePoint].ucDirName[Pointer]=root_buf[j_backup][i];
}
}
iNamePoint++;
}
else //短文件名
{
DIR_Flash[iNamePoint].ulUnitNo=j;
DIR_Flash[iNamePoint].ucUnitNum=1;
for(i=0;i<11;i++) //存储它的短文件名信息
{
DIR_Flash[iNamePoint].ucDirShortName[i]=root_buf[j][i];
DIR_Flash[iNamePoint].ucDirName[i]=root_buf[j][i];
}
DIR_Flash[iNamePoint].ucDirAttr=root_buf[j][11];
DIR_Flash[iNamePoint].ulDirFileSize=((INT32U)root_buf[j][29]<<8)+(INT32U)root_buf[j][28]+
((INT32U)root_buf[j][31]<<24)+((INT32U)root_buf[j][30]<<16);
DIR_Flash[iNamePoint].ulDirFstClus=((INT32U)root_buf[j][27]<<8)+(INT32U)root_buf[j][26];
iNamePoint++;
}
}
//--------------------------------------------------------------------
*file_count=iNamePoint;
if(iNamePoint==100) return 0;
else return 1;
}
//------------------------------------------------------------------
// INT32U Dir_Path(INT8U *pathString, INT8U *file_count);
// 输 入: INT8U *pathString--路径,根目录为"..",例如INT8U *pathString="..\MUSIC\MP3"
// INT8U *file_count--文件个数
// INT8U ucDataNum--要求输出字符个数
// 输 出: 1--成功
// 0--失败
// 功能描述: 显示指定路径下的文件目录
// 全局变量: INT8U root_Buf[512][32]存放当前目录表的信息
// INT32U pre_root 上层目录的位置
// INT32U current_root 当前目录的位置
// DIR_Flash 每个数组元素存放一个文件的信息
//------------------------------------------------------------------
INT32U Dir_Path (INT8U *pathString, INT8U *file_count)
{
INT8U *pucCurDirString, ucCurDirStrlen; //current Directory name and name length
INT32U ulReturnVal;
while(*pathString!=0)
{
pucCurDirString=pathString;
ucCurDirStrlen=0;
while(*pathString!=47) // '/'
{
pathString++;
ucCurDirStrlen++;
if(ucCurDirStrlen>8)
{
Uart_Printf("directory is too long.\n");
return FALSE;
}
if((*pucCurDirString==46)&&(*(pucCurDirString+1)==46)) //'.'
Dir(Root_Cluster, file_count);
else
{
ulReturnVal=find_file(pucCurDirString, ucCurDirStrlen);
if(ulReturnVal==0xFFFF)
{
Uart_Printf("can't find the directory.\n");
return FALSE;
}
Dir(DIR_Flash[ulReturnVal].ulDirFstClus, file_count);
}
}
pathString++;
}
return OK;
}
//---------------------------------------------------------------------
// INT32U Dir_Ext(INT8U *pathString, INT8U *extName,INT8U *file_count);
// 输 入: INT8U *pathString--路径,根目录为"..",例如INT8U *pathString="..\MUSIC\MP3"
// INT8U *extName--文件扩展名,例如INT8U *extName="EXE"
// INT8U *file_count--指定扩展名文件的个数
// 输 出: 1--成功
// 0--失败
// 功能描述: 显示指定路径下的文件目录
// 全局变量: INT8U root_Buf[512][32]存放当前目录表的信息
// INT32U pre_root 上层目录的位置
// INT32U current_root 当前目录的位置
// DIR_Flash 每个数组元素存放一个文件的信息
//------------------------------------------------------------------
INT32U Dir_Ext(INT8U *pathString, INT8U *extName,INT8U *file_count)
{
INT32U ulReturnVal;
INT8U ucFileNum,ucPoint=0,i=0;
STRU_LongDIR_INFO DIR_File_Ext[100];
memset(DIR_File_Ext, 0, 100*sizeof(STRU_LongDIR_INFO));
ulReturnVal=Dir_Path(pathString, file_count);
if(ulReturnVal==FALSE) return FALSE;
ucFileNum=*file_count;
while(ucFileNum>ucPoint)
{
if((DIR_Flash[ucPoint].ucDirShortName[8]==*extName)&&
(DIR_Flash[ucPoint].ucDirShortName[9]==*(extName+1))&&
(DIR_Flash[ucPoint].ucDirShortName[10]==*(extName+2)))
{
memcpy(&(DIR_File_Ext[i]),&(DIR_Flash[ucPoint]),sizeof(STRU_LongDIR_INFO));
i++;
}
ucPoint++;
}
memcpy(DIR_Flash, DIR_File_Ext, 100*sizeof(STRU_LongDIR_INFO));
*file_count=i;
return 1;
}
//-----------------------------------------------------------------------------------
//INT32U FileSeek( INT8U *pucFileName,INT32U ulPosition,INT8U *pucOutPut, INT8U ucDataNum)
// 输 入: INT8U *pucFileName--文件名
// INT8U *pucOutPut--输出字符指针
// INT8U ucDataNum--要求输出字符个数
// 输 出: 1--成功
// 0--失败
// 功能描述:查找并读出指定文件的指定位置的字符
// 全局变量:DIR_Flash[100]
//---------------------------------------------------------------------------------
INT32U FileSeek( INT8U *pucFileName,INT32U ulPosition, INT8U *pucOutPut, INT16U usDataNum)
{
INT8U Pointer,i;
INT16U usDataBlock1,usDataBlock2;
INT32U ulClusterNum, ulRestNum,ulRestNum1;
INT32U ulReadBlockNo;
INT8U *pucBlockBuf;
INT32U ulBlockByteNum=16384; //512*32
for(Pointer=0;Pointer<100;Pointer++)
{
if(comp_filename(&(DIR_Flash[Pointer].ucDirShortName[0]),pucFileName)==0) break;
}
if(Pointer==100) return 0;
ulClusterNum=(ulPosition>>14)+1; //在第几个cluster(以一为开始)
ulRestNum=ulPosition%(ulBlockByteNum); //the position of the data in this cluster
pucBlockBuf = (INT8U*)malloc(ulBlockByteNum);
for(ulReadBlockNo=DIR_Flash[Pointer].ulDirFstClus;ulClusterNum>0;ulClusterNum--)
{
ReadFileOneBlock(pucBlockBuf, ulReadBlockNo);
ulReadBlockNo=next_block;
}
if(ulRestNum+(INT32U)usDataNum<ulBlockByteNum)
{
for(;usDataNum>0;usDataNum--)
{
*pucOutPut++=*(pucBlockBuf+ulRestNum);
ulRestNum++;
}
}
else
{
usDataBlock2=(INT16U)(ulRestNum+usDataNum-ulBlockByteNum); //the others block's data
usDataBlock1=usDataNum-usDataBlock2;
for(;usDataBlock1>0;usDataBlock1--)
{
*pucOutPut++=*(pucBlockBuf+ulRestNum);
ulRestNum++;
}
i=usDataBlock2>>14;
usDataBlock2=usDataBlock2%(ulBlockByteNum);
while(i>0)
{
ReadFileOneBlock(pucBlockBuf,ulReadBlockNo);
ulReadBlockNo=next_block;
i--;
for(usDataBlock1=ulBlockByteNum,ulRestNum=0;usDataBlock1>0;usDataBlock1--)
{
*pucOutPut++=*(pucBlockBuf+ulRestNum);
ulRestNum++;
}
}
if(usDataBlock2>0)
{
ReadFileOneBlock(pucBlockBuf,ulReadBlockNo);
for(ulRestNum=0;usDataBlock2>0;usDataBlock2--)
{
*pucOutPut++=*(pucBlockBuf+ulRestNum);
ulRestNum++;
}
}
}
free(pucBlockBuf);
return 1;
}
//-----------------------------------------------------------------------------------
//INT32U FileChang( INT8U *pucFileName,INT32U ulPosition,INT8U *pucInPut, INT8U ucDataNum)
// 输 入: INT8U *pucFileName--文件名
// INT8U *pucInPut--输入字符指针
// INT8U ucDataNum--要求修改字符个数
// 输 出: 1--成功
// 0--失败
// 功能描述:查找并修改指定文件的指定位置的字符
// 全局变量:DIR_Flash[100]
//---------------------------------------------------------------------------------
INT32U FileChang( INT8U *pucFileName,INT32U ulPosition, INT8U *pucInPut, INT8U ucDataNum)
{
INT8U ulPageNum,ucDataBlock1,ucDataBlock2;
INT32U Pointer,ulClusterNum, ulRestNum;
INT32U ulReadBlockNo;
INT8U *pucBlockBuf;
INT32U ulBlockByteNum=16384; //512*32
for(Pointer=0;Pointer<100;Pointer++)
{
if(comp_filename(&(DIR_Flash[Pointer].ucDirShortName[0]),pucFileName)==0) break;
}
if(Pointer==100) return 0;
ulClusterNum=(ulPosition>>14)+1; //在第几个cluster(以一为开始)
ulRestNum=ulPosition%(ulBlockByteNum);
pucBlockBuf = (INT8U*)malloc(ulBlockByteNum);
for(ulReadBlockNo=DIR_Flash[Pointer].ulDirFstClus;ulClusterNum>0;ulClusterNum--)
{
ReadFileOneBlock(pucBlockBuf, ulReadBlockNo);
ulReadBlockNo=next_block;
}
if(ulRestNum+(INT32U)ucDataNum<ulBlockByteNum)
{
for(;ucDataNum>0;ucDataNum--)
{
*(pucBlockBuf+ulRestNum)=*pucInPut++;
ulRestNum++;
}
Erase_Block(current_block);
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
for(Pointer=0;Pointer<512;Pointer++)
{
Page_Buf[Pointer]=*pucBlockBuf;
// *pucBlockBuf=0xff;
pucBlockBuf++;
}
WritePage(current_block,ulPageNum,Page_Buf);
}
}
else
{
ucDataBlock2=(INT8U)(ulRestNum+(INT32U)ucDataNum-ulBlockByteNum);
ucDataBlock1=ucDataNum-ucDataBlock2;
for(;ucDataBlock1>0;ucDataBlock1--)
{
*(pucBlockBuf+ulRestNum)=*pucInPut++;
ulRestNum++;
}
Erase_Block(current_block);
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
for(Pointer=0;Pointer<512;Pointer++)
{
Page_Buf[Pointer]=*pucBlockBuf;
// *pucBlockBuf=0xff;
pucBlockBuf++;
}
WritePage(current_block,ulPageNum,Page_Buf);
}
ReadFileOneBlock(pucBlockBuf,ulReadBlockNo);
for(ulRestNum=0;ucDataBlock2>0;ucDataBlock2--)
{
*(pucBlockBuf+ulRestNum)=*pucInPut++;
ulRestNum++;
}
Erase_Block(current_block);
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
for(Pointer=0;Pointer<512;Pointer++)
{
Page_Buf[Pointer]=*pucBlockBuf;
// *pucBlockBuf=0xff;
pucBlockBuf++;
}
WritePage(current_block,ulPageNum,Page_Buf);
}
}
free(pucBlockBuf);
return 1;
}
//-------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -