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

📄 usbcontrol.c

📁 使用51单片机作为控制器
💻 C
📖 第 1 页 / 共 2 页
字号:
				   mDelay100mS( );
		   }
           while(CH375DiskStatus==DISK_DISCONNECT)
		   {
		   		if(i==1)
					printf( "Disc out\n" );
                mDelay100mS( );
		        mDelay100mS( );
				mDelay100mS( );
				i=0;
		   }
			if(CH375DiskStatus != DISK_DISCONNECT)
			{       					
					mDelay100mS( );  /* 延时100毫秒 */
					printf( "Continuing\n" );
			}
		strcpy( mCmdParam.Create.mPathName, cp);  /* 新文件名,在根目录下 */
		i = CH375FileCreate( );  /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
		mStopIfError( i );
		mCmdParam.Write.mSectorCount =c;  /* 写入所有扇区的数据 */
/*		current_buffer = & FILE_DATA_BUF[0];  如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */
		i = CH375FileWrite( );  /* 向文件写入数据 */
		mStopIfError( i );
		mCmdParam.Modify.mFileAttr = 0xff;  /* 输入参数: 新的文件属性,为0FFH则不修改 */
		mCmdParam.Modify.mFileTime = 0xffff;  /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */
		mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2006,5, 22);  /* 输入参数: 新的文件日期: 2004.05.18 */
		mCmdParam.Modify.mFileSize =size;  /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */
		i = CH375FileModify( );  /* 修改当前文件的信息,修改日期和长度 */
		mStopIfError( i );
		mCmdParam.Close.mUpdateLen = 0;  /* 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数 */
		i = CH375FileClose( );
		mStopIfError( i );
		printf( "Create a file\n" );
		}	
}

UINT8 file_amount;//文件数目统计,用于删除,复制后刷新
/////////////////////选择文件进行操作//////////////////////////////////////
//用于通过key_down,key_up增减选择文件,并对选中文件执行file_oper操作。
void sel_file(UINT8 code *dir,bit root_flag)
{
        UINT8 i;
	    UINT8 c=0,file_oper=1;//file_oper:文件操作选择,1为Copy a file,2为Del a file。可扩展功能,
		bit cancel,one_in;
		one_in=1;//第一次按key_enter标志,防止因未选中文件而按操作键而出错。
		while(1)
		{	
			if(key_enter&&one_in)
				{key_enter_elim();printf("Not sel a file!\n");}
	        if(key_enter&&!one_in)
			{	
				key_enter_elim();
				printf("Operation:\n");
				while(1)
				{
					if(key_down)
					{	
						key_down_elim();
						file_oper++;
						if(file_oper==5)
							file_oper=1;
						if(file_oper==1)
							printf("%d Copy a file\n",(unsigned int)file_oper);
						if(file_oper==2)
							printf("%d Del a file\n",(unsigned int)file_oper);
						if(file_oper==3)
							printf("%d Open with text\n",(unsigned int)file_oper);
						if(file_oper==4)
							printf("%d File attribute\n",(unsigned int)file_oper);
					}

					if(key_up)
					{	
						key_up_elim();
						file_oper--;
						if(file_oper==0)
							file_oper=4;
						if(file_oper==1)
							printf("%d Copy a file\n",(unsigned int)file_oper);
						if(file_oper==2)
							printf("%d Del a file\n",(unsigned int)file_oper);
						if(file_oper==3)
							printf("%d Open with text\n",(unsigned int)file_oper);
						if(file_oper==4)
							printf("%d File attribute\n",(unsigned int)file_oper);
					}

					if(key_enter)
					{   
						key_enter_elim();
						if(file_oper==2)
						{
							printf("Sure to del?\n");
							while(1)
							{
								if(key_esc)
								{key_esc_elim();printf("Cancel\n");cancel=1;break;};
								if(key_enter)
								{	
									key_enter_elim();
									cancel=0;
									del_file();
									file_amount=enumer_file(dir,0);//刷新文件数目。
									break;
								}
							}
							if(!cancel)
								break;
						}
						if(file_oper==1)
						{   
							if(root_flag)
								{copy_file(mCmdParam.Enumer.mPathName);cy_cancel=0;}//cy_cancel=0;完成取消功能后,进入正常状态,cy_cancel为零。
							else
								printf("Not the root dir\n");
						}

						if(file_oper==3)
							file_open_show();
						if(file_oper==4)
							file_attribute();


					}
					
					if(key_esc)
					{
						key_esc_elim();
						printf("Return to sel file\n");
						break;
					}
				}	   
			}


			if(key_down)
			{	
				key_down_elim();
				one_in=0;
				c++;
				i = mCopyCodeStringToIRAM( mCmdParam.Enumer.mPathName, dir);  //搜索文件名,*为通配符,适用于所有文件或者子目录 				
				if(c>file_amount)
					c=0;
				mCmdParam.Enumer.mPathName[ i ] = c;  // 根据字符串长度将结束符替换为搜索的序号,从0到255
				i=CH375FileEnumer( );				// 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 
								
				printf( "%d:%s\n", (unsigned int)c, mCmdParam.Enumer.mPathName); // 显示序号和搜索到的匹配文件名或者子目录名 		        
			}

			if(key_up)
			{	
				key_up_elim();
				one_in=0;
				c--;							
				i = mCopyCodeStringToIRAM( mCmdParam.Enumer.mPathName, dir);  //搜索文件名,*为通配符,适用于所有文件或者子目录 
				if(c==255)
					c=file_amount;
				mCmdParam.Enumer.mPathName[ i ] = c;  // 根据字符串长度将结束符替换为搜索的序号,从0到255
				i=CH375FileEnumer( ); 				// 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 
			    		
				printf( "%d:%s\n", (unsigned int)c,mCmdParam.Enumer.mPathName);// 显示序号和搜索到的匹配文件名或者子目录名 
		
			}
			if(key_esc)
			{   
				key_esc_elim();
			    mDelay100mS();mDelay100mS();mDelay100mS();
				printf("Back\n");
				break;
			}
		}
}
///////////////////////功能选择////////////////////////////////////////////////////////
UINT8 functionsel(void)
{   //function为主体功能选择,1:选择根目录。2选择AA目录,3:复制根目录全部文件到AA,4 剪切根目录全部文件到AA
							//5:删除根目录全部文件 6:删除AA目录全部文件 7:查询磁盘情况--可以增加扩展。
    UINT8 function=1;	bit cancel;
    printf("A Disc Operate\n");
	while(1)
    {	
		if(key_esc)
			{key_esc_elim();printf("Back\n");return(0);break;}//此时,break;可以省去。
		if(key_down)
	    {	
			key_down_elim();
			function++;
			if(function==8)
				function=1;
			if(function==1)
				printf("%d Sel root dir\n",(unsigned int)function);
			if(function==2)
				printf("%d Sel root AA\n",(unsigned int)function);
			if(function==3)
				printf("%d Copy all files to AA\n",(unsigned int)function);
			if(function==4)
				printf("%d Cut all files to AA\n",(unsigned int)function);
			if(function==5)
				printf("%d Del all files in root dir\n",(unsigned int)function);
			if(function==6)
				printf("%d Del all files in root AA\n",(unsigned int)function);
			if(function==7)
				printf("%d Inquire disc state\n",(unsigned int)function);
		}
	
		if(key_up)
		{	
			key_up_elim();
			function--;
			if(function==0)
				function=7;
			if(function==1)
				printf("%d Sel root dir\n",(unsigned int)function);
			if(function==2)
				printf("%d Sel root AA\n",(unsigned int)function);
			if(function==3)
				printf("%d Copy all files to AA\n",(unsigned int)function);
			if(function==4)
				printf("%d Cut all files to AA\n",(unsigned int)function);
			if(function==5)
				printf("%d Del all files in root dir\n",(unsigned int)function);
			if(function==6)
				printf("%d Del all files in root AA\n",(unsigned int)function);
			if(function==7)
				printf("%d Inquire disc state\n",(unsigned int)function);
		}

		if(key_enter)
		{   
			key_enter_elim();
			if(function==4||function==5||function==6)
			{
				printf("Sure to execute?\n");
				while(1)
				{
					if(key_esc)
						{key_esc_elim();printf("Cancel\n");cancel=1;break;};
					if(key_enter)
						{key_enter_elim();cancel=0;break;};
				}
				if(!cancel)
					{return(function);break;}
			}
			else
			{
				return(function);break;
			}
		}
	}
}

//////////////////主函数/////////////////////////////////////////////////////
void USBCont(void)
{
	UINT8 i,count=0;
	UINT8 c=0,fun_flag;
	LCD_init();
    LCD_clr();
	mInitSTDIO( );  // 为了让计算机通过串口监控演示过程	
	printf( "Start\n" );
	CH375_INT_FLAG = 0;  // 清中断标志 
	i = CH375LibInit( );  // 初始化CH375程序库和CH375芯片,操作成功返回0 
	mStopIfError( i );

	CH375_INT_EN = 1;  //允许CH375中断
	EA = 1;  // 初始化完成,开中断

	printf("Wait Udisk\n");
	while ( CH375DiskStatus != DISK_CONNECT );  // 等待U盘插入,单片机可以做其它事情 
	mDelay100mS( );  // 延时,可选操作,有的USB存储器需要几十毫秒的延时
	mDelay100mS( );
	
	for ( i = 0; i < 5; i ++ ) 	// 检查U盘是否准备好,有些U盘不需要这一步
	{  
		mDelay100mS( );
		printf( "Ready ?\n" );
		if ( CH375DiskReady( ) == ERR_SUCCESS ) break;  // 查询磁盘是否准备好 
	}
	 printf("Please sel_fun\n");
    
	while(1)
	{   
		if(key_enter)
		{  
			key_enter_elim();		
			fun_flag=functionsel();
			switch(fun_flag)
			{
				case 1:
				{	
					file_amount=enumer_file("\\*",1);
					if(file_amount==0)
						printf("NO operable file\n");
					else
						sel_file("\\*",1);
					break;
				}
				case 2:
				{
					file_amount=enumer_file("\\AA\\*",1);
					if(file_amount==1)
						printf("NO operable file\n");
					else
						sel_file("\\AA\\*",0);
					break;				
				}
				case 3:
				{	
					file_amount=enumer_file("\\*",0);
					if(file_amount==0)
						printf("NO operable file\n");
					else
					{
						copy_del_cut_enumer("\\*",1);
						if(!cy_cancel)
							printf("ALL have copyed\n");
						cy_cancel=0;//回到正常状态。
					}
					break;
				}
				case 4:
				{
					file_amount=enumer_file("\\*",0);
					if(file_amount==0)
						printf("NO operable file\n");
					else
					{
						copy_del_cut_enumer("\\*",3);
						if(!cy_cancel)
							printf("ALL have cutted\n");
						cy_cancel=0;//回到正常状态。
					}
					break;
				}
				case 5:
				{
					file_amount=enumer_file("\\*",0);
					if(file_amount==0)
						printf("NO operable file\n");
					else
						{copy_del_cut_enumer("\\*",2);printf("ALL have det\n");}
					break;
				}

				case 6:
				{	
					file_amount=enumer_file("\\AA\\*",0);
					if(file_amount==1)
						printf("NO operable file\n");
					else
						{copy_del_cut_enumer("\\AA\\*",2);printf("ALL have det\n");}
					break;
				}

				case 7:
				{
					query_disk();break;
				}
				default:
						break;

			}
		}
		if(key_up)//演示两U盘数据传送
		{	
			key_up_elim();
			printf("Disc Exchange\n");
			i= CH375FileOpen( );
            if ( i!=ERR_SUCCESS ) 
				printf("Not sel file\n");
			else 
				i = CH375FileClose();
			while(1)
			{
				if(key_enter)
					{key_enter_elim();file_charge();break;}
				if(key_esc)
					{key_esc_elim()printf("Back\n");break;}
			}
		}

		if(key_down)//演示数据采集
		{
			key_down_elim();
			printf("Sample Data\n");
			onetime=0;
			ES=1;
			while(1)
			{
				if(key_enter)
					{key_enter_elim();printf("Data Sampling...\n");i=56;}
				if(key_esc)
				{
					key_esc_elim();
					ES=0;
					if(i==56)
					{
						printf("Save data\n");
						save_data();
					}
					printf("Back\n");
					break;
				}  
	 		}
		}

		if(key_esc)
		{	
			key_esc_elim();
			printf( "Please take out\n" );
			while ( CH375DiskStatus != DISK_DISCONNECT ) i=55;// 等待U盘拔出,单片机可以做其它事情*/
			while(CH375DiskStatus==DISK_DISCONNECT)
		    {
		   		if(i==55)
					printf( "Disc out\nWait Udisk\n" );//这个循环里面只显示一次。
                mDelay100mS( );
		        mDelay100mS( );
				
				i=0;
		    }
			if(CH375DiskStatus != DISK_DISCONNECT)
			{       					
					mDelay100mS( );  /* 延时100毫秒 */
					mDelay100mS( );
					printf("Please sel_fun\n");
			}
		}	
	}	
}

⌨️ 快捷键说明

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