Example #1
0
//得到指定编号文件的文件名 编号:0~dfnum+foldernum-1
//index:文件编号(包含了文件夹)
//*ftpt:类型表.
//num:类型数
//返回值:该文件的文件名.
u8* pfnmg_get_ifname(u16 index)
{
	FILINFO finfo;
	u16 i=0;
	u8 t,ftype;
	u8 res;
	u8 tlfname[100];//100个字节用于存放长文件名
	u8 *plfname;

	plfname=pfnmg_get_pname();//得到当前路径名    
	res=f_opendir(&dir,(const TCHAR*)plfname);//打开当前目录
    finfo.lfsize=0;//不使用长文件名 
	if(res==FR_OK)
	{
		if(index<pfnmg.foldernum)//是文件夹区
		{
			for(i=0;i<index+1;)
			{	 
				if(i==index)//已经等于当前要找的文件了.使用长文件名.
				{
					finfo.lfname=(TCHAR*)tlfname;		//长文件名缓存
					finfo.lfsize=sizeof(tlfname);		//缓存大小
				}
				res=f_readdir(&dir,&finfo);	//读取一个文件的信息
		    	if(res!=FR_OK||finfo.fname[0]==0)break;//出错,或者已经读完了
				if(finfo.fattrib&AM_DIR)
				{
					if(finfo.fname[0]=='.'&&finfo.fname[1]=='\0')continue;//不计算"."文件夹
					i++;
				}										    
			}   
		}else //在有效文件区
		{
			index-=pfnmg.foldernum;//实际文件的偏移
			for(i=0;i<index+1;)
			{	 
				if(i==index)//已经等于当前要找的文件了.使用长文件名.
				{
					finfo.lfname=(TCHAR*)tlfname;		//长文件名缓存
					finfo.lfsize=sizeof(tlfname);		//缓存大小
				}
				res=f_readdir(&dir,&finfo);	//读取一个文件的信息
		    	if(res!=FR_OK||finfo.fname[0]==0)break;//出错,或者已经读完了
				ftype=f_typetell((u8*)finfo.fname);//得到文件类型
				for(t=0;t<pfnmg.fttblsize;t++)if(pfnmg.fttbl[t]==ftype)break;
				if(t!=pfnmg.fttblsize)i++;//找到一个符合条件的.
 				   									    
			}
		}
		if(res==FR_OK&&finfo.fname[0]!=0)//成功读取了.
		{				    
			f_stradd(pfnmg.plfname,"/");
			if(*finfo.lfname)f_stradd(pfnmg.plfname,(u8*)finfo.lfname);	//存在长文件名
			else f_stradd(pfnmg.plfname,(u8*)finfo.fname);			   	//拷贝短文件名
			if(finfo.fattrib&AM_DIR)pfnmg.cftp=T_FOLDER;		  		//是个文件夹.	 
			else pfnmg.cftp=f_typetell((u8*)finfo.fname);		  		//目标文件
		}  
	}
 	return pfnmg_get_lfname();//返回得到的文件名.	
}   
//得到path路径下,目标文件的总个数
//path:路径		    
//返回值:总有效文件数
u16 pic_get_tnum(u8 *path)
{	  
	u8 res;
	u16 rval=0;
 	DIR tdir;	 		//临时目录
	FILINFO tfileinfo;	//临时文件信息	
	u8 *fn;	 			 			   			     
    res=f_opendir(&tdir,(const TCHAR*)path); 	//打开目录
  	tfileinfo.lfsize=_MAX_LFN*2+1;				//长文件名最大长度
	tfileinfo.lfname=mymalloc(tfileinfo.lfsize);//为长文件缓存区分配内存
	if(res==FR_OK&&tfileinfo.lfname!=NULL)
	{
		while(1)//查询总的有效文件数
		{
	        res=f_readdir(&tdir,&tfileinfo);       		//读取目录下的一个文件
	        if(res!=FR_OK||tfileinfo.fname[0]==0)break;	//错误了/到末尾了,退出		  
     		fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);			 
			res=f_typetell(fn);	
			if((res&0XF0)==0X50)//取高四位,看看是不是图片文件	
			{
				rval++;//有效文件数增加1
			}	    
		}  
	} 
	return rval;
}
//得到path路径下,目标文件的总个数
//path:路径		    
//返回值:总有效文件数
u16 MP3_getMp3FileNum(u8 *path)
{	  
	u8 res;
	u16 rval=0;
 	DIR tdir;	 		//临时目录
	FILINFO tfileinfo;	//临时文件信息		
	u8 *fn; 			 			   			     
    res=f_opendir(&tdir,(const TCHAR*)path); 	//打开目录
  	tfileinfo.lfsize=_MAX_LFN*2+1;				//长文件名最大长度
	tfileinfo.lfname=malloc(tfileinfo.lfsize);//为长文件缓存区分配内存
	if(res==FR_OK&&tfileinfo.lfname!=NULL)
	{
		while(1)//查询总的有效文件数
		{
	        res=f_readdir(&tdir,&tfileinfo);       		//读取目录下的一个文件
	        if(res != FR_OK || tfileinfo.fname[0] == 0) break;	//错误了/到末尾了,退出		  
     		fn = (u8*)(*tfileinfo.lfname ? tfileinfo.lfname : tfileinfo.fname);	
            printf("歌曲名字: %s\r\n", fn);                   //显示歌曲名字
			res=f_typetell(fn);	
			if((res&0XF0)==0X40)//取高四位,看看是不是音乐文件	
			{
				rval++;//有效文件数增加1
			}	    
		}  
	} 
	free(tfileinfo.lfname);
    //printf("目录%s下总共有%d首歌曲.\r\n",path, rval); //显示总歌曲数
	return rval;
}
Example #4
0
//智能画图
//FileName:要显示的图片文件  BMP/JPG/JPEG
//(sx,sy) :开始显示的坐标点
//(ex,ey) :结束显示的坐标点
//图片在开始和结束的坐标点范围内显示
BOOL AI_LoadPicFile(u8 *filename,u16 sx,u16 sy,u16 ex,u16 ey)
{//	FIL* f_bmp;
  
	int	funcret;//返回值	
	//得到显示方框大小	
	u8 fileTpe;  
	int index;
    for( index=0;index<1024;index++)
		  iclip[index]=0;

	if(ey>sy)PICINFO.S_Height=ey-sy;
	else PICINFO.S_Height=sy-ey;	 
	if(ex>sx)PICINFO.S_Width=ex-sx;
	else PICINFO.S_Width=sx-ex;
	//显示区域无效
	if(PICINFO.S_Height==0||PICINFO.S_Width==0)
	{
		PICINFO.S_Height=LCD_H;
		PICINFO.S_Width=LCD_W;
		return FALSE;   
	}
	//影响速度
	//SD_Init();//初始化SD卡,在意外拔出之后可以正常使用
	//显示的开始坐标点
	PICINFO.S_YOFF=sy;
	PICINFO.S_XOFF=sx;

	fileTpe=f_typetell((u8*)filename);	//得到文件的类型
	if(fileTpe==T_BMP)//得到一个BMP图像
	{
		funcret=BmpDecode(filename); //得到一个BMP图像
		return funcret;    		  
	}
	else if(fileTpe==T_JPG||fileTpe==T_JPEG)//得到JPG/JPEG图片
	{   
    	funcret=f_open(f_jpeg,(const TCHAR*)filename,FA_READ);//打开文件
		if(funcret==FR_OK){	 	 
			f_read(f_jpeg,jpg_buffer,1024,(UINT*)&br);
			InitTable();
			if((funcret=InitTag())!=FUNC_OK)return FALSE;
			if((SampRate_Y_H==0)||(SampRate_Y_V==0))return FALSE ;
			AI_Drow_Init();
			funcret=Decode(); 
		}
		f_close(f_jpeg);
	}else return FALSE;  //非图片格式!!!
	if(funcret==FUNC_OK)return TRUE;//解码成功
	else return FALSE;   //解码失败	
}
Example #5
0
//播放某个音频文件
u8 audio_play_song(u8* fname)
{
	u8 res;  
	res=f_typetell(fname); 
	switch(res)
	{
		case T_WAV:
			res=wav_play_song(fname);
			break;
		default://其他文件,自动跳转到下一曲
			printf("can't play:%s\r\n",fname);
			res=KEY0_PRES;
			break;
	}
	return res;
}
/*******************************************************************************
函数名:MP3_getMp3FileName
描述  :获取指定路径和索引MP3的歌曲名称。
参数  :path:指定路径,如:"0:/MUSIC", index: 指定索引值,其最大值为该目录下mp3文件总数
       ,pMp3FileName:保存mp3名称空间首地址。
返回值:0:失败,1:成功
*******************************************************************************/
u8 MP3_getMp3FileName(u8 *path, u8 index, u8 *pMp3FileName)
{	  
	u8 res = 0;
	u16 rval=0;
 	DIR tdir;	 		//临时目录
	FILINFO tfileinfo;	//临时文件信息		
	u8 *fn;
    
    res=f_opendir(&tdir,(const TCHAR*)path); 	//打开目录
  	tfileinfo.lfsize=_MAX_LFN*2+1;				//长文件名最大长度
	tfileinfo.lfname=malloc(tfileinfo.lfsize);//为长文件缓存区分配内存
    
	if (res == FR_OK && tfileinfo.lfname != NULL)
	{
		while(1)//查询总的有效文件数
		{
	        res=f_readdir(&tdir,&tfileinfo);       		//读取目录下的一个文件
	        if(res!=FR_OK||tfileinfo.fname[0]==0)break;	//错误了/到末尾了,退出		  
     		fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);	
            
			res=f_typetell(fn);	
			if((res&0XF0)==0X40)//取高四位,看看是不是音乐文件	
			{
				rval++;//有效文件数增加1
                if (rval == (index + 1))
                {

                    if (strlen(fn) < _MAX_LFN)
                    {
                      sprintf(pMp3FileName, "%s\0", fn);
//                      memcpy(pMp3FileName, fn, strlen(fn));
                      res = 1;
                     //printf("目录%s下第%d歌曲名为: %s\r\n",path,index, fn); //显示歌曲名字    
                    }
                    else
                    {
                        printf("FileName's space not enough !!!\r\n");
                        res = 0;
                    }
                    break;
                }
			}	    
		}  
	} 
	free(tfileinfo.lfname);
	return res;
}
Example #7
0
//得到指定目录下的指定类型文件的个数
u16 f_getfilenum(u8* path,u8 ftype)
{
	u8 res;
	u8 type;
	u16 fnum=0;
	FILINFO finfo;
	res=f_opendir(&dir,(const TCHAR*)path);//打开SD卡上的PICTURE文件夹.
    finfo.lfsize=0;//不使用长文件名 
	if(res==FR_OK)
	{
		while(1)
		{	 
			res=f_readdir(&dir,&finfo);	//读取一个文件的信息
	    	if(res!=FR_OK||finfo.fname[0]==0)break;//出错,或者已经读完了
			type=f_typetell((u8*)finfo.fname);//得到文件类型	 
			if(type==ftype)fnum++;//此类型文件个数增加1.
		}
	}
    return fnum;
}			
 int main(void)
 { 
	u8 res;
 	DIR picdir;	 		//图片目录
	FILINFO picfileinfo;//文件信息
	u8 *fn;   			//长文件名
	u8 *pname;			//带路径的文件名
	u16 totpicnum; 		//图片文件总数
	u16 curindex;		//图片当前索引
	u8 key;				//键值
	u8 pause=0;			//暂停标记
	u8 t;
	u16 temp;
	u16 *picindextbl;	//图片索引表 		  	    
	delay_init();	    	 //延时函数初始化
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	uart_init(9600);	 	//串口初始化为9600			 
	LCD_Init();			//初始化液晶 
	LED_Init();         //LED初始化	 
	KEY_Init();			//按键初始化	  													    
	usmart_dev.init(72);//usmart初始化	
 	mem_init();			//初始化内部内存池	
 	exfuns_init();		//为fatfs相关变量申请内存  
  	f_mount(fs[0],"0:",1);	//挂载SD卡 
 	f_mount(fs[1],"1:",1); 	//挂载FLASH.	  
	POINT_COLOR=RED;      
 	while(font_init()) 	//检查字库
	{	    
		LCD_ShowString(60,50,200,16,16,"Font Error!");
		delay_ms(200);				  
		LCD_Fill(60,50,240,66,WHITE);//清除显示	     
		delay_ms(200);				  
	}  	 
 	Show_Str(60,50,200,16,"Mini STM32开发板",16,0);				    	 
	Show_Str(60,70,200,16,"图片显示程序",16,0);				    	 
	Show_Str(60,90,200,16,"KEY0:NEXT KEY1:PREV",16,0);				    	 
	Show_Str(60,110,200,16,"WK_UP:PAUSE",16,0);				    	 
	Show_Str(60,130,200,16,"正点原子@ALIENTEK",16,0);				    	 
	Show_Str(60,150,200,16,"2014年3月14日",16,0);
 	while(f_opendir(&picdir,"0:/PICTURE"))//打开图片文件夹
 	{	    
		Show_Str(60,170,240,16,"PICTURE文件夹错误!",16,0);
		delay_ms(200);				  
		LCD_Fill(60,170,240,186,WHITE);//清除显示	     
		delay_ms(200);				  
	}  
	totpicnum=pic_get_tnum("0:/PICTURE"); //得到总有效文件数
  	while(totpicnum==NULL)//图片文件为0		
 	{	    
		Show_Str(60,170,240,16,"没有图片文件!",16,0);
		delay_ms(200);				  
		LCD_Fill(60,170,240,186,WHITE);//清除显示	     
		delay_ms(200);				  
	}
  	picfileinfo.lfsize=_MAX_LFN*2+1;						//长文件名最大长度
	picfileinfo.lfname=mymalloc(picfileinfo.lfsize);	//为长文件缓存区分配内存
 	pname=mymalloc(picfileinfo.lfsize);				//为带路径的文件名分配内存
 	picindextbl=mymalloc(2*totpicnum);				//申请2*totpicnum个字节的内存,用于存放图片索引
 	while(picfileinfo.lfname==NULL||pname==NULL||picindextbl==NULL)//内存分配出错
 	{	    
		Show_Str(60,170,240,16,"内存分配失败!",16,0);
		delay_ms(200);				  
		LCD_Fill(60,170,240,186,WHITE);//清除显示	     
		delay_ms(200);				  
	}  	
	//记录索引
    res=f_opendir(&picdir,"0:/PICTURE"); //打开目录
	if(res==FR_OK)
	{
		curindex=0;//当前索引为0
		while(1)//全部查询一遍
		{
			temp=picdir.index;								//记录当前index
	        res=f_readdir(&picdir,&picfileinfo);       		//读取目录下的一个文件
	        if(res!=FR_OK||picfileinfo.fname[0]==0)break;	//错误了/到末尾了,退出		  
     		fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);			 
			res=f_typetell(fn);	
			if((res&0XF0)==0X50)//取高四位,看看是不是图片文件	
			{
				picindextbl[curindex]=temp;//记录索引
				curindex++;
			}	    
		} 
	}   
	Show_Str(60,170,240,16,"开始显示...",16,0); 
	delay_ms(1500);
	piclib_init();										//初始化画图	   	   
	curindex=0;											//从0开始显示
   	res=f_opendir(&picdir,(const TCHAR*)"0:/PICTURE"); 	//打开目录
	while(res==FR_OK)//打开成功
	{	
		dir_sdi(&picdir,picindextbl[curindex]);			//改变当前目录索引	   
        res=f_readdir(&picdir,&picfileinfo);       		//读取目录下的一个文件
        if(res!=FR_OK||picfileinfo.fname[0]==0)break;	//错误了/到末尾了,退出
     	fn=(u8*)(*picfileinfo.lfname?picfileinfo.lfname:picfileinfo.fname);			 
		strcpy((char*)pname,"0:/PICTURE/");				//复制路径(目录)
		strcat((char*)pname,(const char*)fn);  			//将文件名接在后面
 		LCD_Clear(BLACK);
 		ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);//显示图片    
		Show_Str(2,2,240,16,pname,16,1); 				//显示图片名字
		t=0;
		while(1) 
		{
			key=KEY_Scan(0);		//扫描按键
			if(t>250)key=1;			//模拟一次按下KEY0    
			if((t%20)==0)LED0=!LED0;//LED0闪烁,提示程序正在运行.
			if(key==KEY1_PRES)		//上一张
			{
				if(curindex)curindex--;
				else curindex=totpicnum-1;
				break;
			}else if(key==KEY0_PRES)//下一张
			{
				curindex++;		   	
				if(curindex>=totpicnum)curindex=0;//到末尾的时候,自动从头开始
				break;
			}else if(key==WKUP_PRES)
			{
				pause=!pause;
				LED1=!pause; 	//暂停的时候LED1亮.  
			}
			if(pause==0)t++;
			delay_ms(10); 
		}					    
		res=0;  
	} 											  
	myfree(picfileinfo.lfname);	//释放内存			    
	myfree(pname);				//释放内存			    
	myfree(picindextbl);		//释放内存			    
}
Example #9
0
//播放音乐
void audio_play(void)
{
	u8 res;
 	DIR wavdir;	 		//目录
	FILINFO wavfileinfo;//文件信息
	u8 *fn;   			//长文件名
	u8 *pname;			//带路径的文件名
	u16 totwavnum; 		//音乐文件总数
	u16 curindex;		//图片当前索引
	u8 key;				//键值		  
 	u16 temp;
	u16 *wavindextbl;	//音乐索引表
	
	WM8978_ADDA_Cfg(1,0);	//开启DAC
	WM8978_Input_Cfg(0,0,0);//关闭输入通道
	WM8978_Output_Cfg(1,0);	//开启DAC输出   
	
 	while(f_opendir(&wavdir,"0:/MUSIC"))//打开音乐文件夹
 	{	    
		Show_Str(60,190,240,16,"MUSIC文件夹错误!",16,0);
		delay_ms(200);				  
		LCD_Fill(60,190,240,206,WHITE);//清除显示	     
		delay_ms(200);				  
	} 									  
	totwavnum=audio_get_tnum("0:/MUSIC"); //得到总有效文件数
  	while(totwavnum==NULL)//音乐文件总数为0		
 	{	    
		Show_Str(60,190,240,16,"没有音乐文件!",16,0);
		delay_ms(200);				  
		LCD_Fill(60,190,240,146,WHITE);//清除显示	     
		delay_ms(200);				  
	}										   
  	wavfileinfo.lfsize=_MAX_LFN*2+1;						//长文件名最大长度
	wavfileinfo.lfname=mymalloc(SRAMIN,wavfileinfo.lfsize);	//为长文件缓存区分配内存
 	pname=mymalloc(SRAMIN,wavfileinfo.lfsize);				//为带路径的文件名分配内存
 	wavindextbl=mymalloc(SRAMIN,2*totwavnum);				//申请2*totwavnum个字节的内存,用于存放音乐文件索引
 	while(wavfileinfo.lfname==NULL||pname==NULL||wavindextbl==NULL)//内存分配出错
 	{	    
		Show_Str(60,190,240,16,"内存分配失败!",16,0);
		delay_ms(200);				  
		LCD_Fill(60,190,240,146,WHITE);//清除显示	     
		delay_ms(200);				  
	}  	 
 	//记录索引
    res=f_opendir(&wavdir,"0:/MUSIC"); //打开目录
	if(res==FR_OK)
	{
		curindex=0;//当前索引为0
		while(1)//全部查询一遍
		{
			temp=wavdir.index;								//记录当前index
	        res=f_readdir(&wavdir,&wavfileinfo);       		//读取目录下的一个文件
	        if(res!=FR_OK||wavfileinfo.fname[0]==0)break;	//错误了/到末尾了,退出		  
     		fn=(u8*)(*wavfileinfo.lfname?wavfileinfo.lfname:wavfileinfo.fname);			 
			res=f_typetell(fn);	
			if((res&0XF0)==0X40)//取高四位,看看是不是音乐文件	
			{
				wavindextbl[curindex]=temp;//记录索引
				curindex++;
			}	    
		} 
	}   
   	curindex=0;											//从0开始显示
   	res=f_opendir(&wavdir,(const TCHAR*)"0:/MUSIC"); 	//打开目录
	while(res==FR_OK)//打开成功
	{	
		dir_sdi(&wavdir,wavindextbl[curindex]);			//改变当前目录索引	   
        res=f_readdir(&wavdir,&wavfileinfo);       		//读取目录下的一个文件
        if(res!=FR_OK||wavfileinfo.fname[0]==0)break;	//错误了/到末尾了,退出
     	fn=(u8*)(*wavfileinfo.lfname?wavfileinfo.lfname:wavfileinfo.fname);			 
		strcpy((char*)pname,"0:/MUSIC/");				//复制路径(目录)
		strcat((char*)pname,(const char*)fn);  			//将文件名接在后面
 		LCD_Fill(60,190,240,190+16,WHITE);				//清除之前的显示
		Show_Str(60,190,240-60,16,fn,16,0);				//显示歌曲名字 
		audio_index_show(curindex+1,totwavnum);
		key=audio_play_song(pname); 			 		//播放这个音频文件
		if(key==KEY2_PRES)		//上一曲
		{
			if(curindex)curindex--;
			else curindex=totwavnum-1;
 		}else if(key==KEY0_PRES)//下一曲
		{
			curindex++;		   	
			if(curindex>=totwavnum)curindex=0;//到末尾的时候,自动从头开始
 		}else break;	//产生了错误 	 
	} 											  
	myfree(SRAMIN,wavfileinfo.lfname);	//释放内存			    
	myfree(SRAMIN,pname);				//释放内存			    
	myfree(SRAMIN,wavindextbl);			//释放内存	 
} 
//图片浏览
u8 picviewer_play(void)
{				 	 
	DIR picdir;			//picdir专用	  
	FILINFO picinfo;   		   
	u8 rval=0;			//返回值	  
	u8 *pname=0;
	u8 *fn=0;
	u8 picsta=0;		//ebook状态
						//0,属于文件浏览状态    
						//1,顺序播放图片
						//2,暂停状态    
	
	u16 curindex=0;	//当前浏览的图片文件的索引号
	u8  endecode=0;	//使能解码
	u8 key; 
	u16 dtime=0;	//延时时间
	u8 keyup=1;		//松开标记
	u8 pictype=0;	//图片类型 

   	_filelistbox_obj * flistbox; 
	_filelistbox_list * filelistx; 	//文件
 	_btn_obj* rbtn;		//返回按钮控件

	app_filebrower((u8*)APP_MFUNS_CAPTION_TBL[1][gui_phy.language],0X07);//选择目标文件,并得到目标数量
   	flistbox=filelistbox_creat(0,gui_phy.tbheight,lcddev.width,lcddev.height-gui_phy.tbheight*2,1,gui_phy.listfsize);//创建一个filelistbox
 	if(flistbox==NULL)rval=1;							//申请内存失败.
	else  
	{
		flistbox->fliter=FLBOX_FLT_PICTURE;				//图片文件
		filelistbox_add_disk(flistbox);					//添加磁盘路径
 		filelistbox_draw_listbox(flistbox);
	} 	  
	//为长文件名申请缓存区
 	picinfo.lfsize = _MAX_LFN * 2 + 1;
	picinfo.lfname = gui_memin_malloc(picinfo.lfsize);
	if(picinfo.lfname==NULL)rval=1;//申请内存失败 
   	else gui_memset((u8*)picinfo.lfname,0,picinfo.lfsize);
 	rbtn=btn_creat(lcddev.width-2*gui_phy.tbfsize-8-1,lcddev.height-gui_phy.tbheight,2*gui_phy.tbfsize+8,gui_phy.tbheight-1,0,0x03);//创建文字按钮
 	if(rbtn==NULL)rval=1;	//没有足够内存够分配
	else
	{																				
	 	rbtn->caption=(u8*)GUI_BACK_CAPTION_TBL[gui_phy.language];//返回 
	 	rbtn->font=gui_phy.tbfsize;//设置新的字体大小	 	 
		rbtn->bcfdcolor=WHITE;	//按下时的颜色
		rbtn->bcfucolor=WHITE;	//松开时的颜色
		btn_draw(rbtn);//画按钮
	}
	LED1=1;//关闭LED1
	while(rval==0)//主循环
	{
		tp_dev.scan(0);    
		in_obj.get_key(&tp_dev,IN_TYPE_TOUCH);	//得到按键键值   
		delay_ms(5);
		if(system_task_return)break;			//TPAD返回   	
		if(picsta==0)
		{
			filelistbox_check(flistbox,&in_obj);	//扫描文件
	 		if(flistbox->dbclick==0X81)				//双击文件了
			{	
				curindex=flistbox->selindex-flistbox->foldercnt;//得到当前图片索引号
				picsta=1;	//图片播放状态		 
				endecode=1;	//第一张图片自动播放 
				LCD_Clear(0x0);//黑屏 	 
			}
		}
		key=btn_check(rbtn,&in_obj);
  		if(key&&((rbtn->sta&0X80)==0))
		{		  
			if(flistbox->dbclick!=0X81)//在文件浏览的时候按了返回按钮,则返回上一层目录
			{
				filelistx=filelist_search(flistbox->list,flistbox->selindex);//得到此时选中的list的信息
				if(filelistx->type==FICO_DISK)//已经不能再往上了,则退出图片浏览
				{				 
					break;
				}else filelistbox_back(flistbox);//退回上一层目录	 
			} 
		} 
		if(endecode)
		{
     		rval=f_opendir(&picdir,(const TCHAR*)flistbox->path); //打开选中的目录
			if(rval)break;	 			   
			ff_enter(picdir.fs);//进入fatfs,防止被打断.
			dir_sdi(&picdir,flistbox->findextbl[curindex]);
			ff_leave(picdir.fs);//退出fatfs,继续运行os等
	 		rval=f_readdir(&picdir,&picinfo);//读取文件信息
			if(rval)break;//打开成功    
			fn=(u8*)(*picinfo.lfname?picinfo.lfname:picinfo.fname);
			pname=gui_memin_malloc(strlen((const char*)fn)+strlen((const char*)flistbox->path)+2);//申请内存
			if(pname==NULL)break;	//申请失败
			pname=gui_path_name(pname,flistbox->path,fn);	//文件名加入路径 
			pictype=f_typetell(pname); 
			if(pictype==T_GIF)gui_show_string(fn,5,5,lcddev.width-5,gui_phy.tbfsize,gui_phy.tbfsize,RED);	//显示GIF名字
			ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);			//播放这个图片
			if(pictype!=T_GIF)gui_show_string(fn,5,5,lcddev.width-5,gui_phy.tbfsize,gui_phy.tbfsize,RED);	//显示图片名字						  
 			gui_memin_free(pname);			//释放内存 
			pname=NULL;
			endecode=0;		    
		}
		keyup=0;
		dtime=0;
		while(picsta)//按键扫描循环
		{     
			key=pic_tp_scan();   
			dtime++;
			if(dtime>400&&(picsta==1))key=3;//顺序播放状态下时间溢出,自动播放下一张图片    
			if(key)//有按键按下
			{ 
				dtime=0;
				if(keyup)
				{   
					keyup=0;
					if(key==1)//上一幅图片
					{
						if(curindex)curindex--;
						else curindex=flistbox->filecnt-1;
						endecode=1;
						LCD_Clear(0x0);//黑屏 	 
						break;
					}else if(key==2)//在暂停和非暂停之间切换
					{ 
						if(picsta==1)
						{
							picsta=2;
							LED1=0;	 	//表示暂停
						}else 
						{
							picsta=1;
							LED1=1;	   	//暂停结束
						} 
					}else if(key==3)
					{
						if(systemset.picmode==0)//顺序播放
						{
							if(curindex<(flistbox->filecnt-1))curindex++;
							else curindex=0;
						}else	//随机播放
						{   
							curindex=app_get_rand(flistbox->filecnt);//随机得到下一张图片的编号   	 
						}
						endecode=1;
						LCD_Clear(0x0);//黑屏 	 
						break;	 
					}  
				}
			}else keyup=1;//标记按键松开
			delay_ms(10);  
			if(system_task_return)picsta=0;//TPAD返回
			if(picsta==0)//回到文件浏览状态之前的处理
			{
				LED1=1;	   				//关闭LED1
				flistbox->dbclick=0;	//设置非文件浏览状态
				app_filebrower((u8*)APP_MFUNS_CAPTION_TBL[1][gui_phy.language],0X07);//选择目标文件,并得到目标数量
 				btn_draw(rbtn);			//画按钮
				filelistbox_rebuild_filelist(flistbox);//重建flistbox
 				system_task_return=0;	//还不能退出图片浏览
				break;
			}
		}
	}	
	LED1=1;//关闭LED1
	filelistbox_delete(flistbox);	//删除filelist 	  
	btn_delete(rbtn);				//删除按钮	 	  
 	gui_memin_free(pname);			//释放内存		  
 	gui_memin_free(picinfo.lfname);
 	return rval; 
}
//播放音乐
void mp3_play(void)
{
	u8 res;
 	DIR mp3dir;	 		//目录
	FILINFO mp3fileinfo;//文件信息
	u8 *fn;   			//长文件名
	u8 *pname;			//带路径的文件名
	u16 totmp3num; 		//音乐文件总数
	u16 curindex;		//当前索引
	u8 key;					//键值		  
 	u16 temp;
	u16 *mp3indextbl;	//音乐索引表 
    
 	while(f_opendir(&mp3dir,"0:/MUSIC"))//打开音乐文件夹
 	{	    
        printf("MUSIC文件夹错误!\r\n");
		mico_thread_msleep(200);				  
	} 									  
	totmp3num=mp3_get_tnum("0:/MUSIC"); //得到总有效文件数
  	while(totmp3num==NULL)//音乐文件总数为0		
 	{	    
        printf("没有音乐文件!\r\n");
		mico_thread_msleep(200);				  
	}
    
  	mp3fileinfo.lfsize = _MAX_LFN*2+1;				//长文件名最大长度
	mp3fileinfo.lfname = malloc(mp3fileinfo.lfsize);//为长文件缓存区分配内存
 	pname = malloc(mp3fileinfo.lfsize);				//为带路径的文件名分配内存
 	mp3indextbl = malloc(2*totmp3num);				//申请2*totmp3num个字节的内存,用于存放音乐文件索引
 	while(mp3fileinfo.lfname==NULL||pname==NULL||mp3indextbl==NULL)//内存分配出错
 	{	    
        printf("内存分配失败!\r\n");
		mico_thread_msleep(200);			  
	}  	
    

	//记录索引
    res=f_opendir(&mp3dir,"0:/MUSIC"); //打开目录
	if(res==FR_OK)
	{
		curindex=0;//当前索引为0
		while(1)//全部查询一遍
		{
			temp=mp3dir.index;								//记录当前index
	        res=f_readdir(&mp3dir,&mp3fileinfo);       		//读取目录下的一个文件
	        if(res!=FR_OK||mp3fileinfo.fname[0]==0)break;	//错误了/到末尾了,退出		  
     		fn=(u8*)(*mp3fileinfo.lfname?mp3fileinfo.lfname:mp3fileinfo.fname);			 
			res=f_typetell(fn);	
			if((res&0XF0)==0X40)//取高四位,看看是不是音乐文件	
			{
				mp3indextbl[curindex]=temp;//记录索引
				curindex++;
			}	    
		} 
	}   
    
   	curindex=0;											//从0开始显示
   	res=f_opendir(&mp3dir,(const TCHAR*)"0:/MUSIC"); 	//打开目录
	while(res==FR_OK)//打开成功
	{	
		dir_sdi(&mp3dir,mp3indextbl[curindex]);			//改变当前目录索引	   
        res=f_readdir(&mp3dir,&mp3fileinfo);       		//读取目录下的一个文件
        if(res!=FR_OK||mp3fileinfo.fname[0]==0)break;	//错误了/到末尾了,退出
     	fn=(u8*)(*mp3fileinfo.lfname?mp3fileinfo.lfname:mp3fileinfo.fname);			 
		strcpy((char*)pname,"0:/MUSIC/");				//复制路径(目录)
		strcat((char*)pname,(const char*)fn);  	    //将文件名接在后面
        printf("歌曲名字: %s\r\n", fn);                   //显示歌曲名字
		mp3_index_show(curindex+1,totmp3num);
		key=MP3_playSong(pname); 				 		//播放这个MP3    
        
         if(key==KEY0_PRES)//下一曲
		{
			curindex++;		   	
			if(curindex>=totmp3num)curindex=0;//到末尾的时候,自动从头开始
 		}else break;	//产生了错误 	 
	} 											  
	free(mp3fileinfo.lfname);	//释放内存			    
	free(pname);				//释放内存			    
	free(mp3indextbl);			//释放内存	 
}