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

📄 main.c

📁 单片机+ST013A+CH375读写U盘播放MP3
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <iom32v.h>
  
#pragma interrupt_handler Timer:11 Timer:12 
 
#include "E:\CountWork\AVRMp3Oka\AVRMp3Ok\Lcd\LCD.H"      //  
#include "E:\CountWork\AVRMp3Oka\AVRMp3Ok\Usb\ch375x.h"   //  CH375  AVR 外部程序
#include "E:\CountWork\AVRMp3Oka\AVRMp3Ok\STA013\Sta013.h"//

#include "main.h"
#include "Ch375HFD.h"
#include <string.h>
//#define NO_USB 1

#define LED_Low()  {PORTB|=8;}
#define LED_Hig()  {PORTB&=0xf7;}

#define Light_On() {PORTB&=0xbf;}
#define Light_Off(){PORTB|=0x40;}

#define SoundRst_Low() {PORTA&=0xf7;}
#define SoundRst_Hig() {PORTA|=0x08;}
#define SoundDat_Low() {PORTB&=0xfd;}
#define SoundDat_Hig() {PORTB|=0x02;}
#define SoundClk_Low() {PORTB&=0xfe;}
#define SoundClk_Hig() {PORTB|=0x01;}

#define DC_Hig()       {PORTB|=0x80;}
#define DC_Low()       {PORTB&=0x7f;}
#define DCTest         PINB&0x80

#define DCCLow   183

#define DCCMid   193
  
#define DCCHig   225


void KeyDo(void);
void KeySz(void);
void LrdDo(void);

void	mDelaymS( UINT8 ms )
{
	UINT16	i;
	while ( ms -- ) for ( i = 2600; i != 0; i -- );
}





void Timer(void)
{     
     //if(!F_Sound){
     TCNT0=0;
	 
	 if(!F_DC)//
	 {
	     if(DCTest){DC_Low();}
		 else      {DC_Hig();}
		 if(F_InDc<60)
		 {
		    if(++F_InDc>=60)
		    {
		       F_InDc=61;			  
			   Data[0+3]=Data[1+3]=Data[2+3]=0xdd;
			   LcdFlash1();
		    }
		 }
	 }
	 else{DC_Hig();}
	 
     if((++LightTime)>=100)
	 {
	     //SREG=0x00;
		 //TIMSK=0;
		 Light_Off();
		 LightTime=101;		 
	 }
			
		 }		 
	 }*/
}
void LightOn(void)
{
     TCCR0=5;
	 SREG=0x80;
	 TIMSK=1;     //TIMER0 Int
	 Light_On();
	 TCNT0=0;	
	 LightTime=0; 
}



//**************************************************毫秒

//**************************************************
//**************************************************
void	mStopIfError( unsigned char iError )      /* 检查操作状态,如果错误则显示错误代码并停机 */
{
	if ( iError == ERR_SUCCESS )//=0
	{	    
	    return;  /* 操作成功 */
	}
	while ( 1 )
	{
		LcdON();           /* LED闪烁 */
		mDelaymS( 100 );
		LcdOn();
		Data[0]=0xff;
		Data[1]=0xef;
		Data[2]=0xff;
		LcdSetNoub();
		LcdFlash();
		mDelaymS( 100 );
		LcdOff();		
		mDelaymS( 100 );
	}
}
//**************************************************
//**************************************************
//列举文件
/*
    
	
	 
		 

*/
//****************************************************************************
unsigned char ListFile(unsigned char c)			//列出本目录下第N个文件
{
	unsigned char i;	
	if(F_AB)
	{
	     PATH[0]='/';		 
		 
	     for(i=0;i<6;i++){PATH[i+1] = (ListPath[i]&0x0f)|0x30;}
		 
		 PATH[7]='/'; //kinderpower
		 PATH[8] ='K';
		 PATH[9] ='P';
		 PATH[10]='/';
		 
		 for(i=0;i<6;i++){PATH[i+11] = (ListPath[i]&0x0f)|0x30;}		 
		 PATH[17]='.';		 
		 for(i=0;i<3;i++){PATH[i+18] = (ListPath[i+6]&0x0f)|0x30;}		 	 
		 for(i=21;i<30;i++){PATH[i]=0;}
	}
	else
	{
	     PATH[0]='/';
		 for(i=0;i<6;i++){PATH[i+1] = (ListPath[i]&0x0f)|0x30;}		 
		 PATH[7]='/';
		 
		 for(i=0;i<6;i++){PATH[i+8] = (ListPath[i]&0x0f)|0x30;}
		 PATH[14]='.';		 
		 for(i=0;i<3;i++){PATH[i+15] = (ListPath[i+6]&0x0f)|0x30;}		 	 
		 for(i=18;i<30;i++){PATH[i]=0;}
	}	
	if(c)
	{
         if(F_AB){for(i=10;i<40;i++){PATH[i]=0;}}//kp                                                             			
	     else    {for(i=7 ;i<40;i++){PATH[i]=0;}}
	}    
	
	for(i=0;i<30;i++){mCmdParam.Open.mPathName[i]=PATH[i];}	
		
	//strcpy( (char *)mCmdParam.Open.mPathName, "/001005/001005.001");/* 搜索文件名,*为通配符,适用于所有文件或者子目录 */	
	i = CH375FileOpen( );  /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */
	//if (i==ERR_FOUND_NAME)    /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
	//if(c){if(i==ERR_OPEN_DIR)return(ERR_SUCCESS);}
	
	if     (i==ERR_SUCCESS||i==ERR_FOUND_NAME)  { return(ERR_SUCCESS);}
	else if(i==ERR_OPEN_DIR)                    { return(ERR_SUCCESS);}	
	else {  /* 出错 */	return i;}	
}
//******************************************************************************
//按键处理
//******************************************************************************

//*************************************************************************************
extern const unsigned char Mp3[];
//解码程序
unsigned char  mDecoder(void)
{
	UINT8 i;
	UINT32 File_mSectorCount;
	unsigned char Staty;	
	File_mSectorCount=0;
	CH375vFileSize=CH375vFileSize+511;
	STA013StopDec();
	
	
	
	
	STARTMP3:
	mCmdParam.Read.mSectorCount = FILE_BUF_SIZE/512;
	mCmdParam.ReadX.mDataBuffer=FILE_DATA_BUF;	   //选择缓冲区0
	i = CH375FileReadX( );          /* 从文件读取尾部零头数据,如果原尾部没有零头数据,那么什么也读不到,返回时mCmdParam.Read.mSectorCount为实际读出扇区数 */
	if(i!=ERR_SUCCESS)return i;		//出错则反回
	mCmdParam.Read.mSectorCount = FILE_BUF_SIZE/512;
	mCmdParam.ReadX.mDataBuffer=FILE_DATA_BUF1;	   //选择缓冲区1
	i = CH375FileReadX( );          /* 从文件读取尾部零头数据,如果原尾部没有零头数据,那么什么也读不到,返回时mCmdParam.Read.mSectorCount为实际读出扇区数 */
	if(i!=ERR_SUCCESS)return i;		//出错则反回
	File_mSectorCount+=2;
	//************************
	
	pBuf=0;  
	F_DEC=0;
	F_Read=0;	
	
	LcdSetPlay(1);
	LcdFlash();
	F_Staty=0;
	STA013StarDec();
			
	while(1)
	{
	     i=DataStrBit();//RAM 中 MP3流 输出		 
	     if(i==0||i==2)	
		 {		     
		     KeyRead();
			 if(F_Lrd){F_Lrd=0;LrdDo();}
		     if(F_Key)
		     {			     
			     LightOn();
				 F_InDc=0;
		         if     (KeyBuf==0x21)//OK
				 {				     
				     if     (KeyDownNoub==1){F_Rep=0;return (0);}
					 else if(KeyDownNoub==2){F_Rep=0;return (0);}
					 else if(KeyDownNoub==3){F_Rep=0;return (0);}
					 else if(KeyDownNoub==6){F_Rep=0;return (0);}
				 }
				 else if(KeyBuf==0x16)//PUSH
				 {
				      F_Key=0;
					  if(Staty==2)
					  {
					      STA013ResumeDec();
						  Staty=0;
						  LcdSetPlay(1); 
					  }
					  else
					  {
					      Staty=2;
						  STA013PauseDec();
						  LcdSetPlay(2); 						  
					  }
					  LcdFlash();	
				 }
				 else if(KeyBuf==0x13)//>>
				 {
				      F_Key=0;
				      STA013PauseDec();
					  LcdSetPlay(4);
					  LcdFlash();
					  if((CH375vCurrentOffset+1024*200)>=CH375vFileSize)
					  {
					      STA013StopDec();
						  F_Staty=1;  
					      return(0);					  
					  }
					  else
					  {
					      File_mSectorCount +=200;
					      mCmdParam.Locate.mSectorOffset = File_mSectorCount;//以扇区为单位,如果原文件是3字节,则从512字节开始添加
		                  i = CH375FileLocate( );						  
					  }	
					  mDelaymS( 50 );					  
					  LcdSetPlay(1);
					  LcdFlash();
				      goto STARTMP3;		  				  					  
				 }
				 else if(KeyBuf==3)//上
				 {
				      STA013StopDec();
					  F_Rep=0;
				      return(0);
				 }
				 else if(KeyBuf==0x22)//重复
				 {
				      STA013StopDec();
				      return(0);
				 }
				 else if(KeyBuf==0x24)//下
				 {
				      STA013StopDec();
					  F_Rep=0;
				      return(0);
				 }
				 else if(KeyBuf==0x7)//<<
				 {
				      F_Key=0;
					  STA013PauseDec();
					  if(File_mSectorCount >= 250){File_mSectorCount-=250;}
					  else                        {File_mSectorCount=0;}					  
					  
					  LcdSetPlay(3);
					  LcdFlash();					  
					  mCmdParam.Locate.mSectorOffset = File_mSectorCount;//以扇区为单位,如果原文件是3字节,则从512字节开始添加
		              i = CH375FileLocate( );
						   
					  mDelaymS( 50 );					       
					  LcdSetPlay(1);
					  LcdFlash();	
					  goto STARTMP3;
				 }
				 else if(KeyBuf==0x23)//X
				 {
				     F_Key=0;
	                 KeyDownNoub=0;
		             Data[0]=0xff;Data[1]=0xff;
		             Data[2] =CourntPath[6]<<4;
		             Data[2]|=CourntPath[7];
		             LcdFlash(); 
				 }
				 else if(KeyBuf==0x19)//手动
	             {
	                 F_Key=0;
		             LcdSetHand(0);
		             F_Sys&=0xfe;
		             WriteSys();
		             LcdFlash();
		             F_Auto=0;
	             }
	             else if(KeyBuf==0x10)//自动
	             {
	                 F_Key=0;
		             LcdSetHand(1);
		             F_Sys|=0x01;
		             WriteSys();	
		             LcdFlash();
		             F_Auto=1;	  
	             }
	             else if(KeyBuf==0x2)//A
	             {
	                 STA013StopDec();
				     return(0);
	             }
	             else if(KeyBuf==0x5)//B
	             {
	                 STA013StopDec();
				     return(0); 
	             }	
				 else if(KeyBuf==1)//VOL+
				 {
				     F_Key=0;
					 VOL-=2;
					 if(VOL>0x20){VOL=0;}
					 STA013VOL();					 
				 }
				 else if(KeyBuf==4)//VOL-
				 {
				     F_Key=0;
					 VOL+=2;
					 if(VOL>0x20){VOL=0x20;}
					 STA013VOL();
				 }			 
				 else{KeySz();}		
				 F_Key=0;		 
		     }
			  
		 //----------------------------------------------------- 
		 if(F_Read)   //数据更新请求
		 {        
		     Read:
			 if(F_DEC)
			 {
			      F_Read=0;		
			      mCmdParam.Read.mSectorCount = FILE_BUF_SIZE/512;
	              mCmdParam.ReadX.mDataBuffer=FILE_DATA_BUF;	   //选择缓冲区0
	              i = CH375FileReadX( );            /* 从文件读取尾部零头数据,如果原尾部没有零头数据,那么什么也读不到,返回时mCmdParam.Read.mSectorCount为实际读出扇区数 */
	              if(i!=ERR_SUCCESS)return i;		//出错则反回	
				  File_mSectorCount++;			  	    	 
			 }
			 else
			 {
			      F_Read=0;		
			      mCmdParam.Read.mSectorCount = FILE_BUF_SIZE/512;
	              mCmdParam.ReadX.mDataBuffer=FILE_DATA_BUF1;	   //选择缓冲区0
	              i = CH375FileReadX( );          /* 从文件读取尾部零头数据,如果原尾部没有零头数据,那么什么也读不到,返回时mCmdParam.Read.mSectorCount为实际读出扇区数 */
	              if(i!=ERR_SUCCESS)return i;		//出错则反回
				  File_mSectorCount++;					  		 	  		 
			 }
			 if(mCmdParam.Read.mSectorCount ==0){F_Key=0;F_Staty=1;STA013StopDec(); return 0;}	   //读到文件最后,没有数据
			 if(F_Read){goto Read;}		       
		 }
		 //-----------------------------------------------------  
		 }
	}
	return (0);	
}
//******************************************************************************
//******************************************************************************
void main(void)
{
	UINT8	i, c,k;
	
	USB_WATI:
	mDelaymS(100);	
	DDRB|=0xc8;      //背光灯端口输出	
	
	//**************************************************
	KeyInit();       //按键初始化
	ReadSys();
	Light_On();      //打开背光
	//----------------------------------------
	PowOnTime++;	
	//if(PowOnTime<200){WriteSys();}//----------上电次数限定
	//else{for(;;){}}
	//----------------------------------------
	if(F_Sys&0xf0){F_Sys=0;WriteSys();}
	if(F_Sys&2){LED_Low();}
	else       {LED_Hig();}
	//********************************上电延时
	LcdON();	
	Data[0]=0x00;Data[1]=0;Data[2]=0;	
	mDelaymS(100 );  /* 延时100毫秒 */
	LcdOn();
	LcdSetNoub();	
	LcdFlash();
	mDelaymS(100 );  /* 延时100毫秒 */
	mDelaymS(100 );  /* 延时100毫秒 */
	mDelaymS(100 );  /* 延时100毫秒 */
	//*************************************************电池检测1	
	DC_Hig();        //关闭充电
	mDelaymS(10 );
	i=TestPow();
	if(i<=DCCMid)//如小于可靠工作电压
	{
	   F_DC=1;           //充电标志
	   DC_Low();         //打开充电
	   mDelaymS(10 );
	   i=TestPow();
	   if(i<=DCCMid)
	   {
	      Data[0]=0x1f;Data[1]=0xff;Data[2]=0xff;
		  LcdFlash();
		  mDelaymS(100);
		  Light_Off();     //关闭背光
		  for(;;)
		  {
		     i=TestPow();
		     LcdFlash();	  
	         if(i<(DCCMid+5)){}//等待电压升高
			 else{goto RunInit;}
		  }
	   }
	   else{DC_Hig();}
	}
	else{F_DC=1;}	
	
	RunInit:
	//********************************Sta013
	LcdON();
	VOL=0;           //音量设置最大
	Mp3Start=0;
	i=STA013Init();	
	mStopIfError(i);	
	Data[0]=0xff;
	//Data[0]=i;		
	LcdFlash();	
	//********************************		
	//********************************CH375
	CH375_PORT_INIT();//初试化CH375接口	
	mDelaymS(100);  /* 延时100毫秒 */
	mDelaymS(100);  /* 延时100毫秒 */
	mDelaymS(100);  /* 延时100毫秒 */
		
	i=CH375LibInit( );/* 初始化CH375程序库和CH375芯片,操作成功返回0 */	
		
	mStopIfError( i );
	Data[1]=0xff;	
	LcdFlash();	
	//*************************调试MP3 解码器
	//STA013StarDec();
	//for(;;){StrBitFlash();}
	//*************************
/* 其它电路初始化 */
        
        while (1)
	 	{		    
			CH375DiskConnect();  /* 查询U盘是插入 */
			if( CH375DiskStatus >= DISK_CONNECT ) break;	//ru如果有盘插入则向下执行
			mDelaymS(100);       /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
			i=CH375LibInit( );
			mDelaymS(100); 
			mDelaymS(100); 
		}		
		mDelaymS(100);
		mDelaymS(100);
		mDelaymS(100);		
		
/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
		for (i=0;i<5;i++)/* 有的U盘总是返回未准备好,不过可以被忽略 */
	 	{
  	    	mDelaymS(100);			
			if ( CH375DiskReady( ) == ERR_SUCCESS ) break;  /* 查询磁盘是否准备好 */
			
		}	
	    Data[2]=0xff;	
	    LcdSetPlay(0);
		
		for(i=100;i!=0;i--){KeyRead();}		
		
		ReadSet();
		CourntPath[6]=CourntPath[7]=0;
		Data[0] =CourntPath[0]<<4;
		Data[0]|=CourntPath[1];
		Data[1] =CourntPath[2]<<4;
		Data[1]|=CourntPath[3];
		Data[2] =CourntPath[4]<<4;
		Data[2]|=CourntPath[5];					
		LcdFlash();
		
		F_Staty=0;//上电 MP3还未开起过
		F_Key=0;
		F_Lrd=0;
		
		if(F_Sys&1){LcdSetHand(1);F_Auto=1;}
		else       {LcdSetHand(0);F_Auto=0;}
		if(F_Sys&2){LcdSetAB(1);LED_Low();F_AB=1;}
		else       {LcdSetAB(0);LED_Hig();F_AB=0;} 
		LcdFlash();
		LightOn();
		///**********************************************************U盘调试
		//strcpy( (char *)mCmdParam.Create.mPathName, "\\NEWFILE.TXT" );  /* 新文件名,在根目录下 */
		//i = CH375FileCreate( );  /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
		//mStopIfError( i );
		//i = CH375FileClose( );
		//mStopIfError( i );
		///**********************************************************
		//SoundData=0x0e;		
		//SoundV();
		//for(;;){}
//******************************************************************************
//******************************************************************************		
for(;;)
{	    
        CH375DiskConnect();  /* 查询U盘是插入 */
		if( CH375DiskStatus == DISK_DISCONNECT ) goto USB_WATI;	
		//-----------------------------------------------------电池检测2		
		if(DCTest)
		{
		   TIMSK=0;
		   i=TestPow();
		   TIMSK=1;
		   if(i<=DCCMid)//如小于可靠工作电压
	       {
		       if(F_DC)
			   {
			       Data[0+3]=Data[1+3]=Data[2+3]=0xdd;
			       LcdFlash1();
			   }
	           F_DC=0;           //充电标志
	           DC_Low();         //打开充电
	           mDelaymS(2);
			   TIMSK=0;
			   i=TestPow();
	           if(i<=DCCLow)
			   {
			      TIMSK=0;			      
				  SREG=0;				  
				  Light_Off();
				  Data[0]=0x1f;Data[1]=0xff;Data[2]=0xff;
				  LcdFlash();			  
			      goto USB_WATI;				  
			   }
			   TIMSK=1;
	       }

⌨️ 快捷键说明

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