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

📄 play._c

📁 mega128+VS1003做的mp3的程序 可以用WINAVR编译
💻 _C
📖 第 1 页 / 共 2 页
字号:
       while((PIND & DREQ) == 0);       //加载数据
       {   mp3InData();	
           for(i=0;i<32;i++)
           {
               spiSend(0x00);//填充
               data_pointer++;
           }
		   mp3OutData();	
           if(data_pointer == 2047)break;
       }
   }//while(data_pointer<2048)
   SoftReset();			   //软件复位
   #endif
   KEYBUF_NULL;
   while(1)
          {
		  if(keybuf == K_ESC) break;
		  if(type == 1){
		  		  if(keybuf == K_RIFT) break;
		  		  if(keybuf == K_LIFT) break;
				  }
		  
		  mCmdParam.ReadX.mDataBuffer = &mp3buf[0];//指向文件数据缓冲区							    
 		  mCmdParam.Read.mSectorCount =1;  // 指定读取的扇区数
  		  mStopIfError(CH375FileReadX());			  	   //读文件
  		  ps = &mp3buf[0];	   //指向文件数据缓冲区 
  		  data_pointer=0;
   		  while(data_pointer<512)
          		{ 
          		while((PIND & DREQ) == 0); //等待VS1003空闲加载数据
		  		mp3InData();
		  		for(i=0;i<32;i++)
		    	   {
             	   spiSend(*ps++);
  		     	   data_pointer++;
   	        	   }
		  		mp3OutData();	
		 		if (data_pointer==512) break;       //如果现在的数据不够了,则跳出来
		 		}//while(data_pointer<512)
  		  if(mCmdParam.Read.mSectorCount<1 ) break; // 实际读出的扇区数较小则说明文件已经结束
		  ////////////
		  //输出方音时间
		  time_temp = mp3ReadReg(0x04);
		  if(time != time_temp) {time = time_temp;
		  		  		  		 play_record_tiem(time);
								} 
		  /////////////
         }//while(1)
  mStopIfError(CH375FileClose( ));//关闭文件
  
}
///////////////////
//调试录音
///////////////////
uchar	recordmStopIfError( uchar iError )
{
	if ( iError == ERR_SUCCESS ) return 1;  /* 操作成功 */
	  else {Print_str("Error code =");
	  	    Print_val(iError);
			Print_str("\r\n");
			return 0;	    
		   }	
}
void del_file(char *ps)
{
 strcpy( (char *)mCmdParam.Erase.mPathName, ps );  //将被删除的文件名,在根目录下
 CH375FileErase( );  //删除文件并关闭
}
#define SCI_HDAT0       0x08   
#define SCI_HDAT1       0x09   
extern unsigned char const record_now[];
extern struct time_now timebuf;
#include "../Ds1302/ds1302.h"
extern void Read_InfoDs1302buf(void); 
void RecordAdpcm1003(void) 
{ /* VS1003b/VS1023 */
  uint ii=0;
  uint w = 0, idx = 0;
  unsigned long int n;
  unsigned long int temp;
  uchar time1=0;
  uint time2=0;
  /* Check and locate free space on disk */
  make_newfile(); //创建文件
  show_clear();
  show_lcd(0, 0, 192, 2, &record_now[0],0);    
  show_play(&Filename[0],3,0);
  record_init();  //初始化录音器
  Print_str("进入录音状态\r\n"); 
  for (idx=0; idx < sizeof(header); idx++) 
   { /* Save header first */
    mp3buf[idx] = header[idx];
   }
/* Fix rate if needed */
/*mp3buf[24] = rate;*/
/*mp3buf[25] = rate>>8;*/
/* Record loop */
KEYBUF_NULL;
n=0;
while (1)
	  {
	   do {
		   w = mp3ReadReg(SCI_HDAT1);
		  } while (w < 256 || w > 896);
	   while (idx < 512) {
		    		  	   w = mp3ReadReg(SCI_HDAT0);
						   while ((idx & 255) == sizeof(header)+2 && (w & 0xFF))
						    {
							 do {
							    w = mp3ReadReg(SCI_HDAT1);
								} while (w < 256);
							 w = mp3ReadReg(SCI_HDAT0);
							 }
						   mp3buf[idx++] = w>>8;
						   mp3buf[idx++] = w&0xFF;
                         }//end while (idx < 512)
      idx = 0;
	  mCmdParam.WriteX.mSectorCount =1;  // 指定读取的扇区数
	  mCmdParam.WriteX.mDataBuffer = &mp3buf[0]; /* 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */
	  if(recordmStopIfError(CH375FileWriteX()) == 0) break;  /* 向文件写入数据 */
	  n += 1;
	  ////////////
	  //输出录音时间
	  if(++time1 == 8){time1=0;play_record_tiem(++time2);}
   	  /////////////
	  if(keybuf != K_ESC){KEYBUF_NULL;continue;}
	  break;
	 }
     close_make_file();
	 delay_ms(250);
	 //下面写入文件信息
	 strcpy( (char *)mCmdParam.Open.mPathName,&Filename[0]);
	 mStopIfError(CH375FileOpen( ));
	 mCmdParam.ReadX.mDataBuffer = &mp3buf[0];//指向文件数据缓冲区							    
 	 mCmdParam.Read.mSectorCount =1;  		  // 指定读取的扇区数
	 Print_str("读取文件第一个扇区\r\n");
	 mStopIfError(CH375FileReadX());			  	   		  //读文件第一个扇区
	 mStopIfError(CH375FileClose( ));//关闭文件
	 delay_ms(250);
	 
/* Fix WAV header information */
/* Then update FAT information */
/* Normal reset, restore default settings */
   n *= 2;
   temp = n*256+52;
   mp3buf[4] = (uchar)temp;
   temp >>= 8;
   mp3buf[5] = (uchar)temp;
   temp >>= 8;
   mp3buf[6] = (uchar)temp;
   temp >>= 8;
   mp3buf[7] = (uchar)temp;
   //采样平率8KHZ
   temp = 8000;
   mp3buf[24] = (uchar)temp;
   temp >>= 8;
   mp3buf[25] = (uchar)temp;
   temp >>= 8;
   mp3buf[26] = (uchar)temp;
   temp >>= 8;
   mp3buf[27] = (uchar)temp;
   temp = 8000*256;
   temp /= 505;
   mp3buf[28] = (uchar)temp;
   temp >>= 8;
   mp3buf[29] = (uchar)temp;
   temp >>= 8;
   mp3buf[30] = (uchar)temp;
   temp >>= 8;
   mp3buf[31] = (uchar)temp; 
   
   temp = n*505;
   mp3buf[48] = (uchar)temp;
   temp >>= 8;
   mp3buf[49] = (uchar)temp;
   temp >>= 8;
   mp3buf[50] = (uchar)temp;
   temp >>= 8;
   mp3buf[51] = (uchar)temp;
  
   temp = n * 256;
   mp3buf[56] = (uchar)temp;
   temp >>= 8;
   mp3buf[57] = (uchar)temp;
   temp >>= 8;
   mp3buf[58] = (uchar)temp;
   temp >>= 8;
   mp3buf[59] = (uchar)temp;
   strcpy( (char *)mCmdParam.Open.mPathName,&Filename[0]);
   mStopIfError(CH375FileOpen( ));
   mCmdParam.WriteX.mSectorCount =1;  // 指定读取的扇区数
   mCmdParam.WriteX.mDataBuffer = &mp3buf[0]; /* 如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */
   Print_str("新信息写入文件\r\n");
   mStopIfError(CH375FileWriteX());  /* 向文件写入数据 */
   //下面是在更新文件日期时间信息
   Read_InfoDs1302buf();
   time1 = timebuf.hour;
   time1 >>= 4;
   time1 *= 10;
   time1 += (timebuf.hour&0x0f);
   
   ii = timebuf.min;
   ii >>= 4;
   ii *= 10;
   ii += (timebuf.min&0x0f);
   
   w = timebuf.sec;
   w >>= 4;
   w *= 10;
   w += (timebuf.sec&0x0f);
   
   idx = timebuf.year;
   idx >>= 4;
   idx *= 10;
   idx += (timebuf.year&0x0f);
   idx += 2000;
   
   n = timebuf.month;
   n >>= 4;
   n *= 10;
   n += (timebuf.month&0x0f);
   
   temp = timebuf.date;
   temp >>= 4;
   temp *= 10;
   temp += (timebuf.date&0x0f);
   
   mCmdParam.Modify.mFileAttr = 0xff;  /* 输入参数: 新的文件属性,为0FFH则不修改 */
   mCmdParam.Modify.mFileTime = MAKE_FILE_TIME( time1, ii, w );  /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */
   mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( idx, n, temp );  /* 输入参数: 新的文件日期: 2004.05.18 */
   mCmdParam.Modify.mFileSize = 0xFFFFFFFF;  /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */
   mStopIfError(CH375FileModify( ));  /* 修改当前文件的信息,修改日期和长度 */
   Print_str("文件新日期时间信息写入完成\r\n");
   mStopIfError(CH375FileClose( ));//关闭文件
   Print_str("Record ok\r\n");
   SoftReset();
}

uchar test_file(uchar *s) //文件名过滤器
{
 uchar ii;
 while(ii != 30){//文件名不要超过30个字节
  if(*s++ != '.'){ii++; continue;}
  if((*s == 'W')|(*s == 'w')) return 1;
  if((*s == 'M')|(*s == 'm')) return 0;
  return 0;  
 }
 return 0;
}
/****************************************************************
*下面是随机播放文件的程序,一旦执行可以用退出键退出
****************************************************************/
void Play_audio(uchar *path)
{
 	uchar c;
	uint  i;
	uchar file=0;
 	 /*枚举根目寻下的MP3文件*/
	for ( c = 0; c < 255; c ++ )
	 {  /* 最多搜索前255个文件 */
				strcpy( mCmdParam.Open.mPathName,path);  /* 搜索根目录下文件名*/
				i = strlen( (char *)mCmdParam.Open.mPathName );  /* 计算文件名长度,以处理文件名结束符 */
				mCmdParam.Open.mPathName[ i ] =0xFF;  /* 将结束符替换为255说明序号在变量中 */
				CH375vFileSize=c;        /*指定搜索的序号,几乎没有上限*/
				i = CH375FileEnumer( );  /* 文件名中含有通配符*,则为搜索文件而不打开 */
				if ( i == ERR_MISS_FILE ) break;  /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
				if ( i != ERR_SUCCESS ) break; /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
				if(test_file((char *)mCmdParam.Open.mPathName) != 0){				
								if(CH375vFileSize!=0xFFFFFFFF)   /*播放枚举到的文件*/
								{ 			   
								 mp3_play((char *)mCmdParam.Open.mPathName,1);
								 file = 1;
								 if(keybuf == K_ESC)  break;
							    }
				}
 	 }//end for
	 if(file == 0){show_lcd(2, 0, 192, 4, &nofile[0],0);
 				   delay_1s();
				   delay_1s();
				  }
}
/****************************************************************
*下面是选择播放文件的程序,一旦执行可以用退出键退出
*只能查看前50个文件
****************************************************************/
void show_file_name(uchar point, uchar type)
{
  uchar ii;
  ii = 0;
  while(1){
            show_clear();
			show_lcd(0, 0, 192, 2, &tab[0],0);
			if(point > 0)
	        show_play(&filename[0][0],2,0);
			if(point > 1)
	 	    show_play(&filename[1][0],4,0);
			if(point > 2)
			show_play(&filename[2][0],6,0);
			switch(ii){
			 			   case 0: show_play(&filename[0][0],2,1);break;
						   case 1: show_play(&filename[1][0],4,1);break;
						   case 2: show_play(&filename[2][0],6,1);break;
			              }
            KEYBUF_NULL;
		    while(keybuf == NULL);
			if(keybuf == K_UP) {
			                     if(--ii == 255) break;
			                   }
		    if(keybuf == K_DOWN){if(++ii == point){
			                                       if(point == 3) break;
												   ii = 0;
					  	 				 	      }
			                    }		 
		   
			if(keybuf == K_ESC)  break;
			if(keybuf == K_ENTER) {
 								   if(type == 0) mp3_play(&filename[ii][0],0); 
 								       else {strcpy(&Filename[0],&filename[ii][0]);
									   		 break;
											} 
			                      }						  
         }
}		  
						
void Play_xuanzhe(uchar *path,uchar type)
{
    uchar point;
	uchar temp;
	uchar c;
	uint  i;
	uchar    file=0;
	point = 0;
 	 /*枚举根目寻下的MP3文件*/
	while(1){ 
	for ( c = 0; c < 255; c ++ )
	 {  /* 最多搜索前255个文件 */
				strcpy( mCmdParam.Open.mPathName,path );        /* 搜索根目录下文件名*/
				i = strlen( (char *)mCmdParam.Open.mPathName );  /* 计算文件名长度,以处理文件名结束符 */
				mCmdParam.Open.mPathName[ i ] =0xFF;  /* 将结束符替换为255说明序号在变量中 */
				CH375vFileSize=c;         	  		  /*指定搜索的序号,几乎没有上限*/
				i = CH375FileEnumer( ); 			  /* 文件名中含有通配符*,则为搜索文件而不打开 */
				if ( i == ERR_MISS_FILE ) break;  	  /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
				if ( i != ERR_SUCCESS ) break; 		  /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
				if(test_file((char *)mCmdParam.Open.mPathName) != 0){				
								if(CH375vFileSize!=0xFFFFFFFF)   /*播放枚举到的文件*/
								{
								 strcpy(&filename[point][0],(char *)mCmdParam.Open.mPathName);
								 point++;
								 file = 1;
								}
				                }
			    if(point != 3) continue;
				KEYBUF_NULL;	
				show_file_name(point,type);
				if(type != 0){
						      if(keybuf == K_ENTER) return;
							  if(keybuf == K_ESC) {Filename[0]= 0x00; return;}
				             }
				  else if(keybuf == K_ESC) return;
				point = 0;
				
 	 }//end for
    if((point != 0)&(point != 3)) 	{file = 1;
			  	 		   	         show_file_name(point, type);
									 point = 0;
			  	 		   	  		 if(type != 0){
						      		 		 	   if(keybuf == K_ENTER) return;
												   if(keybuf == K_ESC) {Filename[0]= 0x00; return;}
				                                  }
								         else if(keybuf == K_ESC) return;	
								    }
    if(file == 0){		  
			    show_lcd(2, 0, 192, 4, &nofile[0],0);
 				delay_1s();
				delay_1s();
				keybuf = K_ESC;
				break;
			   }
  }//while(1)											  
}
//磁盘文件系统检查
void test_file_system(void)
{	    uchar ii;
        Print_str("开始磁盘目录检查\r\n");
		strcpy((char *)mCmdParam.Create.mPathName,"\\RECORD\\TEST.TXT");  /* 新文件名,在根目录下的RECORD下 */
		ii = CH375FileCreate();
		if(ii != 0){
			  	    show_lcd(0, 0, 192, 8, &DIR[0],0);
					Print_val("磁盘下没有RECORD工作目录\r\n");
					while(1);  
			  	   }	
	    CH375FileClose( );//关闭文件			   				   	
		del_file("\\RECORD\\TEST.TXT");
		
		strcpy((char *)mCmdParam.Create.mPathName,"\\MUSIC\\TEST.TXT");  /* 新文件名,在根目录下的RECORD下 */
		ii = CH375FileCreate();
		if(ii != 0){
			  	    show_lcd(0, 0, 192, 8, &DIR[0],0);
					Print_val("磁盘下没有MUSIC工作目录\r\n");
					while(1);  
			  	   }	
	    CH375FileClose( );//关闭文件			   				   	
		del_file("\\MUSIC\\TEST.TXT");
		Print_val("磁盘工作目录检查完毕\r\n");
}	   

⌨️ 快捷键说明

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