⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text1.c

📁 使用51单片机作为控制器
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <at89x52.h>
#include <stdio.h>
#include <string.h>
#include "LCD_FUN.H"
#include "DS1302_18B20.H"
#include "FileOperMenu.h"
#define LIB_CFG_DISK_IO			2		// 磁盘读写的数据的复制方式,1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制" 
#define LIB_CFG_FILE_IO			2		// 文件读写的数据的复制方式,0为"外部子程序",1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制" 
#define LIB_CFG_INT_EN			1		// CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" 

#define CH375_CMD_PORT_ADDR		0x8FFF	// CH375命令端口的I/O地址 
#define CH375_DAT_PORT_ADDR		0x8EFF	// CH375数据端口的I/O地址 

// 62256提供的32KB的RAM分为两部分: 0000H-7DFFH为文件读写缓冲区, 7E00H-7FFFH为磁盘数据缓冲区 
#define	DISK_BASE_BUF_ADDR		0x7800	// 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE 
#define FILE_DATA_BUF_ADDR		0x0000	// 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度 
// 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以外部RAM剩余长度为32256字节 
#define FILE_DATA_BUF_LEN		0x7800	// 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 

#define CH375_INT_NO			0		// CH375中断号, CH375的中断线INT#引脚连接单片机的INT0引脚 
#define CH375_INT_FLAG			IE0		// IE0,CH375中断标志 
#define CH375_INT_EN			EX0		// EX0,CH375中断允许 
#include "CH375HF4.H"
void	mDelay100mS( )
{
	UINT8	i, j, c;
	for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3;
}
///////// 将程序空间的字符串复制到内部RAM中,返回字符串长度 ////////
UINT8	mCopyCodeStringToIRAM( UINT8 *iDestination, UINT8 *iSource )
{
	UINT8	i = 0;
	while ( *iDestination = *iSource ) 
	{
		iDestination ++;
		iSource ++;
		i ++;
	}
	return( i );
}


///////// 检查操作状态,如果错误则显示错误代码并停机 /////////
void	mStopIfError( UINT8 iError )
{
	if ( iError == ERR_SUCCESS ) return;  // 操作成功
	LCD_clr();
	LCD_set_XY(12,2);
	printf( "Error:%#02X", (UINT16)iError );  // 显示错误	
}
#include "meun.h"
/////////////////////////////定时器0,用于定时刷新屏幕///////////////////////////////////
void InitTimer0(void)
{
    TMOD=TMOD&0xF0;
    TMOD=TMOD|0x01;    //模式1(16位定时器),仅受TR0控制
	TL0 =-65530%256;
	TH0 =-65530/256;
    ET0=1;       //允许T0中断
    TR0=0; 
}
void Time0(void) interrupt 1 using 3
{
	flash=1;
}
////////////////////////////////////////////////////////////////////////////////////////
void USB_Attribute(void)
{
	UINT16 i;
	LCD_set_RC(0,0);
	LCD_putc(91,0);LCD_putc(92,0);LCD_putc(20,0);LCD_putc(93,0);
	LCD_set_RC(1,2);
	LCD_putc(94,0);LCD_putc(95,0);LCD_putc(96,0);//显示 -正在查询,请稍后...
	printf("...");
	i=CH375DiskQuery();
	mStopIfError( i );
	LCD_clr();
	LCD_set_RC(0,0);
	LCD_putc(97,0);LCD_putc(98,0);LCD_putc(28,0);//显示 -总容量
	LCD_set_RC(1,0);
	LCD_putc(99,0);LCD_putc(101,0);LCD_putc(28,0);//显示 -可用量
	LCD_set_RC(2,0);
	LCD_putc(88,0);LCD_putc(89,0);LCD_putc(100,0);LCD_putc(102,0);//显示 -文件系统
	LCD_set_RC(3,5);
	LCD_putc(103,0);LCD_putc(104,0);//显示 -退出
	LCD_set_XY(48,3);
	switch(mCmdParam.Query.mDiskFat)
	{
		case DISK_FAT12:
			printf("FAT12");	
			break;
		case DISK_FAT16:
			printf("FAT16");
			break;
		case DISK_FAT32:
			printf("FAT32");
			break;
		default:
			printf("Unknow");
			break;
	}
    i=((UINT32)mCmdParam.Query.mTotalSector*10)/2048;
	LCD_set_XY(36,0);
    printf(":%3d.%dM",i/10,i%10);
    LCD_set_XY(36,2);
    i=((UINT32)mCmdParam.Query.mFreeSector*10)/2048;
    printf(":%3d.%dM",i/10,i%10);
}
uchar code USBTab[][7]={
{55,56,57,58,59,60,0}, //优盘未插入
{42,14,15,61,56,57,0},//检测到优盘
{56,57,62,63,64,65,0}, //优盘连接断开
};
UINT8 FileMaxNum;
UINT8 FileNameBuf[MAX_PATH_LEN];//路径长度为40
UINT8 FilePathBuf[MAX_PATH_LEN];
UINT8 FilePastBuf[MAX_PATH_LEN];//用于粘贴
//UINT8 FileSavePath[20];
UINT8 FileWhere;
UINT8 FileSel;
UINT8 FileLay;
UINT8 FilePlace[20];
UINT8 FileSaveSel[20];
UINT8 CanPast=0;                   //可以粘贴标志,1为可以粘贴。
//-------------------FilePathBuf处理函数,将*号前面数据取出-----------------------
void	File_CopyPath( UINT8 *iDestination, UINT8 *iSource )
{
	while (*iSource!='*') 
	{
		*iDestination = *iSource;
		iDestination ++;
		iSource ++;
	}
	*iDestination='\0';
}
//---------------文件处理函数----------------------------------------------------
UINT8 *File_NameInPath(UINT8 *p) //找出所在目录的文件名或者文件夹,所在路径保存在FileSavePath[20]中。
{
	UINT8 i=0,PathPlac=0;
    UINT8 *ptr;
    ptr=p;
	while (FileNameBuf[i]=*ptr)
	{	//FileSavePath[i]=*ptr;
        i++;
		if(*ptr=='\\') //找出最后的//所在位置。
	   		PathPlac=i;
		ptr++;
	}
    //FileSavePath[PathPlac]='\0';
    return (p+PathPlac); 	
}
//---------------取出文件后缀名扩展名称----------------------
UINT8 *File_NameType(UINT8 *ptr)
{	
	UINT8 i;
	for(i=strlen(ptr);i>0;i--)
	{
		if(*(ptr+i-1)=='.')
			return ptr+i;
	}
	return 0;
}
//---------------FilePathBuf向上一级--------------------------
void File_UpPath(void)
{
	UINT8 i=0,PathPlac=0;
	while (FilePathBuf[i])
       i++;
    FilePathBuf[i-2]='\0';
	i=0;
	while (FilePathBuf[i])
	{
		if(FilePathBuf[i]=='\\')
	   		PathPlac=i;
       	i++;
	}
    FilePathBuf[PathPlac+1]='*';	
	FilePathBuf[PathPlac+2]='\0';	
}
UINT8* File_SelName(UINT8 *Path,UINT8 SelNum)//SelNum必须少于FileMaxNum,从零开始。
{
	UINT8 i;
	i = mCopyCodeStringToIRAM( mCmdParam.Enumer.mPathName, Path);
    mCmdParam.Enumer.mPathName[ i ] =SelNum;
    i=CH375FileEnumer();
	mStopIfError( i );
    return File_NameInPath(mCmdParam.Enumer.mPathName);
}
////////////////////////删除文件 /////////////////////////////////////////////
void File_Del(UINT8 *p)
{
	UINT8 i;
	mCopyCodeStringToIRAM( mCmdParam.Open.mPathName,p); 
	i = CH375FileErase();
	mStopIfError(i);
}
//////////////////枚举文件///////////////////////
UINT8 File_Enumer(UINT8 *path,bit type)//0为刷新文件数目;1为枚举文件;返回为文件数目-1(含0开始)
//void File_Enumer(void)
{
	UINT8 i;
	UINT16 j;
	if(type)
		printf("Enumer files:");
	for ( j = 0; j < 255; j ++ )  //最多搜索前255个文件
	{ 
		i = mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, path);  //搜索文件名,*为通配符,适用于所有文件或者子目录 
		mCmdParam.Open.mPathName[ i ] = j;  // 根据字符串长度将结束符替换为搜索的序号,从0到255
		i = CH375FileOpen(); 				// 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 
		if ( i == ERR_MISS_FILE ) {return(j-1);break;} 	// 再也搜索不到匹配的文件,已经没有匹配的文件名 
		if ( i == ERR_FOUND_NAME ) 			// 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 
		{   
		   if(type)
				printf( "%03d:%s", (unsigned int)j, mCmdParam.Open.mPathName );// 显示序号和搜索到的匹配文件名或者子目录名 
			continue;  //继续搜索下一个匹配的文件名,下次搜索时序号会加1 
		}
		else // 出错 
		{  			
			mStopIfError( i );
			break;
		}
	}	
}
/* 新建目录并打开,如果目录已经存在则直接打开 */
/* 输入参数:   目录名在mCmdParam.Create.mPathName中,与文件名规则相同 */
/* 返回状态码: ERR_SUCCESS = 打开目录成功或者创建目录成功,
               ERR_FOUND_NAME = 已经存在同名文件,
               ERR_MISS_DIR = 路径名无效或者上级目录不存在,
               其它状态码参考CH375HF?.H */
UINT8	CreateDirectory( void )
{
	UINT8	i, j;
	UINT32	UpDirCluster;
	PUINT8X	DirXramBuf;
	UINT8 code *DirConstData;
	j = 0xFF;
	for ( i = 0; i != sizeof( mCmdParam.Create.mPathName ); i ++ ) {  /* 检查目录路径 */
		if ( mCmdParam.Create.mPathName[ i ] == 0 ) break;
		if ( mCmdParam.Create.mPathName[ i ] == PATH_SEPAR_CHAR1 || mCmdParam.Create.mPathName[ i ] == PATH_SEPAR_CHAR2 ) j = i;  /* 记录上级目录 */
	}
	i = ERR_SUCCESS;
	if ( j == 0 || j == 2 && mCmdParam.Create.mPathName[1] == ':' ) UpDirCluster = 0;  /* 在根目录下创建子目录 */
	else {
		if ( j != 0xFF ) {  /* 对于绝对路径应该获取上级目录的起始簇号 */
			mCmdParam.Create.mPathName[ j ] = 0;
			i = CH375FileOpen( );  /* 打开上级目录 */
			if ( i == ERR_SUCCESS ) i = ERR_MISS_DIR;  /* 是文件而非目录 */
			else if ( i == ERR_OPEN_DIR ) i = ERR_SUCCESS;  /* 成功打开上级目录 */
			mCmdParam.Create.mPathName[ j ] = PATH_SEPAR_CHAR1;  /* 恢复目录分隔符 */
		}
		UpDirCluster = CH375vStartCluster;  /* 保存上级目录的起始簇号 */
	}
	if ( i == ERR_SUCCESS ) {  /* 成功获取上级目录的起始簇号 */
		i = CH375FileOpen( );  /* 打开本级子目录 */
		if ( i == ERR_SUCCESS ) i =  ERR_SUCCESS;  /* 是文件而非目录 */
		else if ( i == ERR_OPEN_DIR ) i =ERR_FOUND_NAME;  /* 目录已经存在 */
		else if ( i == ERR_MISS_FILE ) {  /* 目录不存在,可以新建 */
			i = CH375FileCreate( );  /* 以创建文件的方法创建目录 */
			if ( i == ERR_SUCCESS ) {
//				if ( &FILE_DATA_BUF[0] == &DISK_BASE_BUF[0] ) CH375DirtyBuffer( );  /* 如果FILE_DATA_BUF与DISK_BASE_BUF合用则必须清除磁盘缓冲区 */
				DirXramBuf = &FILE_DATA_BUF[0];  /* 文件数据缓冲区 */
				DirConstData = ".          \x10\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x21\x30\x0\x0\x0\x0\x0\x0..         \x10\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x21\x30\x0\x0\x0\x0\x0\x0";
				for ( i = 0x40; i != 0; i -- ) {  /* 目录的保留单元,分别指向自身和上级目录 */
					*DirXramBuf = *DirConstData;
					DirXramBuf ++;
					DirConstData ++;
				}
				FILE_DATA_BUF[0x1A] = ( (PUINT8I)&CH375vStartCluster )[3];  /* 自身的起始簇号 */
				FILE_DATA_BUF[0x1B] = ( (PUINT8I)&CH375vStartCluster )[2];
				FILE_DATA_BUF[0x14] = ( (PUINT8I)&CH375vStartCluster )[1];
				FILE_DATA_BUF[0x15] = ( (PUINT8I)&CH375vStartCluster )[0];
//				FILE_DATA_BUF[0x1A] = ( (PUINT8I)&CH375vStartCluster )[0];  /* 对于小端Little-Endian系统,请用这4行代替前面4行 */
//				FILE_DATA_BUF[0x1B] = ( (PUINT8I)&CH375vStartCluster )[1];
//				FILE_DATA_BUF[0x14] = ( (PUINT8I)&CH375vStartCluster )[2];
//				FILE_DATA_BUF[0x15] = ( (PUINT8I)&CH375vStartCluster )[3];
				FILE_DATA_BUF[0x20+0x1A] = ( (PUINT8I)&UpDirCluster )[3];  /* 上级目录的起始簇号 */
				FILE_DATA_BUF[0x20+0x1B] = ( (PUINT8I)&UpDirCluster )[2];
				FILE_DATA_BUF[0x20+0x14] = ( (PUINT8I)&UpDirCluster )[1];
				FILE_DATA_BUF[0x20+0x15] = ( (PUINT8I)&UpDirCluster )[0];
//				FILE_DATA_BUF[0x20+0x1A] = ( (PUINT8I)&UpDirCluster )[0];  /* 对于小端Little-Endian系统,请用这4行代替前面4行 */
//				FILE_DATA_BUF[0x20+0x1B] = ( (PUINT8I)&UpDirCluster )[1];
//				FILE_DATA_BUF[0x20+0x14] = ( (PUINT8I)&UpDirCluster )[2];
//				FILE_DATA_BUF[0x20+0x15] = ( (PUINT8I)&UpDirCluster )[3];
				for ( i = 0xE0; i != 0; i -- ) {  /* 清空目录区剩余部分 */
					*DirXramBuf = 0;
					DirXramBuf ++;
				}
				for ( i = 0xE0; i != 0; i -- ) {  /* 清空目录区剩余部分 */
					*DirXramBuf = 0;
					DirXramBuf ++;
				}
				mCmdParam.Write.mSectorCount = 1;
				i = CH375FileWrite( );  /* 写目录的第一个扇区 */
				if ( i == ERR_SUCCESS ) {
					DirXramBuf = &FILE_DATA_BUF[0];
					for ( i = 0x40; i != 0; i -- ) {  /* 清空目录区 */
						*DirXramBuf = 0;
						DirXramBuf ++;
					}
					for ( j = 1; j != CH375vSecPerClus; j ++ ) {
//						if ( &FILE_DATA_BUF[0] == &DISK_BASE_BUF[0] ) CH375DirtyBuffer( );  /* 如果FILE_DATA_BUF与DISK_BASE_BUF合用则必须清除磁盘缓冲区 */
						mCmdParam.Write.mSectorCount = 1;
						i = CH375FileWrite( );  /* 清空目录的剩余扇区 */
						if ( i != ERR_SUCCESS ) break;
					}
					if ( j == CH375vSecPerClus ) {  /* 成功清空目录 */
						mCmdParam.Modify.mFileSize = 0;  /* 目录的长度总是0 */
						mCmdParam.Modify.mFileDate = 0xFFFF;
						mCmdParam.Modify.mFileTime = 0xFFFF;
						mCmdParam.Modify.mFileAttr = 0x10;  /* 置目录属性 */
						i = CH375FileModify( );  /* 将文件信息修改为目录 */
					}
				}
			}
		}
	}
	return( i );
}
////////////////////复制文件//////////////////////
bit cy_cancel=0;
void File_Copy(UINT8 *des,UINT8 *sou)
{      
        UINT8 i;
        UINT16 m,n, c,SecCount ; 
        UINT32 NewSize;		
		mCopyCodeStringToIRAM(mCmdParam.Open.mPathName,sou);  /* 文件名,该文件在C51子目录下 */
		i = CH375FileOpen( );/* 打开文件 */
		if ( i ==ERR_SUCCESS ) 
		{  
		   LCD_set_XY(6,0);
		   printf( "Paste now...");
           LCD_set_RC(3,5);
	       LCD_putc(82,0);LCD_putc(83,0);//显示 -资料
	       if ( CH375vFileSize > FILE_DATA_BUF_LEN )
	       {  /* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */
		    	c=FILE_DATA_BUF_LEN / 512;  /* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */
           }
           else
           {
                c=(CH375vFileSize+511)/ 512;
   		   }   
                SecCount =(CH375vFileSize+511)/ 512; 
				m=1;
                NewSize=(UINT32)CH375vFileSize;
             //	printf( "cha xun:%d,%d,%ld\n ",SecCount ,c,(UINT32)CH375vFileSize);
    	    for(n=c;n<=SecCount;m++)
			{
				n=c*m;
				mCmdParam.Locate.mSectorOffset = 0x00000000;
				mCmdParam.Locate.mSectorOffset =(n-c);
				//printf("指针移动%d\n",n-c);
				i = CH375FileLocate( );
				mCmdParam.Read.mSectorCount =c;
			    
			    CH375vFileSize += 511;  /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */
				i = CH375FileRead( );  /* 从文件读取数据 */
				CH375vFileSize -= 511;  /* 恢复原文件长度 */
				mStopIfError( i );
                //printf( "读%d个扇区\n",c);
		   		i = CH375FileClose( );  /* 关闭文件 */
				mStopIfError( i );				

				strcpy( mCmdParam.Create.mPathName, des );
				if(n==c)
				{	
					i = CH375FileCreate( );
					if(n==0)
						break;//空文件的时候只新建一个空文件
				}
				else
				{	i = CH375FileOpen( );}
				mCmdParam.Locate.mSectorOffset =0xffffffff;
				i = CH375FileLocate( );
				mCmdParam.Write.mSectorCount =c;
				//printf("写入%d个扇区\n",c);
				CH375FileWrite(); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -