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

📄 user.c

📁 嵌入式系统开发MP3一般用户所需的操作函数 很好的代码.
💻 C
字号:
#include "..\userdefine.h"
#include "user.h"
#include "userinit.h"
#include "main.h"


data	bit	gb_Openfile=0;		// For Open file Flag behind the UI-State transition
data	bit	gb_UIPostError=0;	// The Error flag of UI post-processor for Audio Engine, such as Open file fail, initial fail etc.
data	bit	gc_CardInsert;
data	U8	gc_DOS_ErrorStatus;
xdata	U8	gc_fileend;

extern	data	bit	gb_Frequency_Song;	// 0=Show Frequency    1=Show Song Number/EQ
extern	data	bit	gb_SelectEQ;		// 1=Show EQ
extern	data	bit	gb_SelectVol;		// 1=Show Vol
extern	data	bit	gb_LED_LCM;
extern	data	bit	gb_CHChg;
extern	data	U8	gc_FileSkipNumber;
extern	data	U8	gc_maxtimes;
extern	data	U16	gw_SongNumber;
extern	data	U16	gw_SongNumberSD;
extern	data	U16	gw_ShowTimer;
extern	data	U16	gw_ChangeFrequencyTimer;
extern	data	U16	gw_DispSongNum;
extern	data	U8	gc_xxx;
extern	xdata	U8	gc_FileLongName[];

void	Audio_CoDec(void);
void	SD_InsertState_Detect(void);
void	UI_PreProcessor_scan_key(void);
void	X_RandomGetFileIndex(void);
void	Playing_To_Stop(void);

extern	void	I2CByteWrite(U8 adr,U8 bytedata);
extern	void	VOL_UP(void);
extern	void	VOL_DOWN(void);
extern	void	FM_FREQ_CHG(U8 tc_UP_DOWN, U8 offset);
extern	void	ClearIRBuffer(void);
extern	void	Frequency_Disp(void);
extern	U8		Dos_GetFileLongName(U8 tc_FileHandle,U8 *tpc_LongName);

void UI_PreProcessor_scan_key(void)
{
	gc_EVENT=gc_KeyValue;
	if (gc_KeyValue)
	{			
		gc_KeyValue = 0;
	}
	if ((gc_LongKeyDelay < (MAX_REPEATKEYDELAY - 3)) && (gc_EVENT == LONG_KEY_PLAY_EVENT))
	{
		gc_EVENT = 0;
	}
}


void UI_VolumeUpDown(bit tbt_UpDown)
{
	U8	tc_maxvol;

	tc_maxvol=63;

	if(tbt_UpDown)
	{
		if(gc_DSP_Volume<tc_maxvol)
		{
			gc_DSP_Volume+=3;
		}
	}
	else
	{
		if(gc_DSP_Volume>=3) 
		{
			gc_DSP_Volume-=3;
		}
	}

	if(gc_SystemStateMode==SYSTEM_STATE1_PLAYING)//dsLONG_KEY_PLAY_EVENT
	{
		System_SetVolume(gc_DSP_Volume);
	}
}



void UI_FFFR(bit XFFFR)//go the next or ahead file,File_Close(NULL, K_DOS_ReadFile, 0);
{                            //->Search_File(GS_SearchMode,gc_UIMode,0);
                            //if state_waitidle,after search file ,then show the related informations
	switch(gc_SystemStateMode)
	{
		case SYSTEM_STATE0_IDLE:
			if(gw_FileIndex[0]==0)
				return;//if no this line,error will happen
			break;
		case SYSTEM_STATE1_PLAYING:
			gb_Openfile = 1; // Make Openfile post-processor activity
			break;
		case STATE_PLAY_PAUSE:
			gc_SystemStateMode = SYSTEM_STATE0_IDLE; //return to IDLE State
			break;
	}

	if(gc_FileSkipNumber==200)
	{	
		gc_FileSkipNumber=100;
	    System_NextOrPrev(XFFFR, 1, 0);
		gc_FileSkipNumber=100;
	    System_NextOrPrev(XFFFR, 1, 0);
	}
	else
	{
		System_NextOrPrev(XFFFR, 1, 0);
	}
	gw_ShowTimer=3000;
	gb_Frequency_Song=1;	// 0=Show Frequency    1=Show Song Number/EQ
	gb_SelectVol=0;			// 1=Show Vol
	gb_SelectEQ=0;
}


void UI_Processorstate_transition(void) using 0
{
	switch(gc_SystemStateMode)
	{
		case SYSTEM_STATE0_IDLE:   //State IDLE on--
			gs_System_State.w_BitRate = 0;
			if(gc_EVENT)
			{				
				switch(gc_EVENT)
				{
					case SHORT_KEY_PLAY_EVENT://for play MP3 or DVR
						if(gw_FileTotalNumber[0]==0) 
						{
							break;//no file, don't play
						}
						gc_SystemStateMode=SYSTEM_STATE1_PLAYING;
						gb_Openfile = 1; // Make Openfile post-processor activity
						break;

					case LONG_KEY_FF_EVENT:
						if(gw_ChangeFrequencyTimer!=0)
						{
							gw_ChangeFrequencyTimer=3000;
							FM_FREQ_CHG(1,1);
						}
						break;
					case LONG_KEY_FR_EVENT:
						if(gw_ChangeFrequencyTimer!=0)
						{
							gw_ChangeFrequencyTimer=3000;
							FM_FREQ_CHG(0,1);
						}
						break;
					case SHORT_KEY_FF_EVENT:
						if(gw_ChangeFrequencyTimer!=0)
						{
							gw_ChangeFrequencyTimer=3000;
							FM_FREQ_CHG(1,1);
						}
						break;
					case SHORT_KEY_FR_EVENT:
						if(gw_ChangeFrequencyTimer!=0)
						{
							gw_ChangeFrequencyTimer=3000;
							FM_FREQ_CHG(0,1);
						}
						break;

					case SHORT_KEY_MODE_EVENT:		// CH
					case LONG_KEY_MODE_EVENT:
						gw_ChangeFrequencyTimer=3000;
						gb_Frequency_Song=0;
						ClearIRBuffer();
						gb_CHChg=1;
						break;

					case SHORT_KEY_VOLUP_EVENT:		// CH +
					case LONG_KEY_VOLUP_EVENT:
						FM_FREQ_CHG(1,1);
						break;

	                case SHORT_KEY_VOLDOWN_EVENT:	// CH -
					case LONG_KEY_VOLDOWN_EVENT:
						FM_FREQ_CHG(0,1);
						break;

					default:
						break;
				}
			}

			gc_EVENT=0;
			break;

		case SYSTEM_STATE1_PLAYING:
			switch(gc_EVENT)
			{//PLAY event
				case SHORT_KEY_PLAY_EVENT://PAUSE/PLAY	
					gc_SystemStateMode=STATE_PLAY_PAUSE;
					System_Pause();
					break;
				case LONG_KEY_PLAY_EVENT:	// Change play mode(Sequential/Random)
					gc_PlaySequenceMode++;
					if(gc_PlaySequenceMode==4)
					{
						gc_PlaySequenceMode=1;
					}

					if(gb_LED_LCM==1)
					{
						gw_ShowTimer=3000;
					}
					I2CByteWrite(3,gc_PlaySequenceMode);
					break;
				case LONG_KEY_FF_EVENT:
					if(gw_ChangeFrequencyTimer!=0)
					{
						gw_ChangeFrequencyTimer=3000;
						FM_FREQ_CHG(1,1);
					}
					else
					{
						VOL_UP();
					}
					break;
				case LONG_KEY_FR_EVENT:
					if(gw_ChangeFrequencyTimer!=0)
					{
						gw_ChangeFrequencyTimer=3000;
						FM_FREQ_CHG(0,1);
					}
					else
					{
						VOL_DOWN();
					}
					break;
				case SHORT_KEY_FF_EVENT:
					if(gw_ChangeFrequencyTimer!=0)
					{
						gw_ChangeFrequencyTimer=3000;
						FM_FREQ_CHG(1,1);
					}
					else
					{
						gc_FileSkipNumber=0;
						if((gc_PlaySequenceMode == 0x02)||(gc_PlaySequenceMode == 0x01))
						{
							UI_FFFR(0);
						}
						else	// Random play
						{
							gb_Openfile = 1;
							X_RandomGetFileIndex();
							gw_ShowTimer=3000;
							gb_Frequency_Song=1;	// 0=Show Frequency    1=Show Song Number/EQ
							gb_SelectVol=0;			// 1=Show Vol
							gb_SelectEQ=0;
						}
					}
					break;
				case SHORT_KEY_FR_EVENT:
					if(gw_ChangeFrequencyTimer!=0)
					{
						gw_ChangeFrequencyTimer=3000;
						FM_FREQ_CHG(0,1);
					}
					else
					{
						gc_FileSkipNumber=0;
						if((gc_PlaySequenceMode == 0x02)||(gc_PlaySequenceMode == 0x01))
						{
							UI_FFFR(1);
						}
						else
						{
							gb_Openfile = 1;
							X_RandomGetFileIndex();
							gw_ShowTimer=3000;
							gb_Frequency_Song=1;	// 0=Show Frequency    1=Show Song Number/EQ
							gb_SelectVol=0;			// 1=Show Vol
							gb_SelectEQ=0;
						}
					}
					break;
				case SHORT_KEY_MODE_EVENT:		// CH
				case LONG_KEY_MODE_EVENT:
					if((XBYTE[0xB409]&0x92)==0x82)
					{
						FM_FREQ_CHG(1,1);
					}
					else
					{
						gw_ChangeFrequencyTimer=3000;
						gb_Frequency_Song=0;
						gb_CHChg=1;
					}

					if(gb_LED_LCM==1)
					{					
						Frequency_Disp();
					}
					break;
				case SHORT_KEY_VOLUP_EVENT:		// CH +
				case LONG_KEY_VOLUP_EVENT:
					FM_FREQ_CHG(1,1);
					break;
                case SHORT_KEY_VOLDOWN_EVENT:	// CH -
				case LONG_KEY_VOLDOWN_EVENT:
					FM_FREQ_CHG(0,1);
					break;
				case SHORT_KEY_STOP_EVENT:		// STOP
				case LONG_KEY_STOP_EVENT:
					Playing_To_Stop();
					break;
				default:
					break;
			}

			if(gc_SystemStateMode==SYSTEM_STATE1_PLAYING)
			{
                if(gc_fileend==0)
				{
					Audio_CoDec();
				}
			}			
			gc_EVENT=0;
			break;

		case STATE_PLAY_PAUSE:
			switch(gc_EVENT)
			{//PAUSE event
				case SHORT_KEY_PLAY_EVENT:
					//==return to PLAY state==//
					gb_PlayPause = 0;
                	System_SetEQ(gc_PlayEQMode);//lyh add
                	System_SetVolume(gc_DSP_Volume);//lyh add
                    (0);
					gc_SystemStateMode=SYSTEM_STATE1_PLAYING;		// recovery previous State
					break;
			}

			gc_EVENT=0;
			break;

		default://state default
			break;
	}
}


void UI_EventPostDpc(void) using 0
{
	U8	sts;

	// -- Open file post processor for record or play procedure trigger
	if(gb_Openfile)
	{
		gb_Openfile = 0;	//reset flag

		if (gc_SystemStateMode==SYSTEM_STATE1_PLAYING)
		{//SYSTEM_STATE1_PLAYING
			if(gw_FileTotalNumber[0])	 // There are mp3 and DVR's files are existed!
		    {
				System_Stop();
				System_SetEQ(gc_PlayEQMode);//lyh add
                System_SetVolume(gc_DSP_Volume);//lyh add

				sts = (0);		//lyh add

				if(sts)
				{
                    System_Stop();
					gb_UIPostError = 1;
					return;			 // Open file error !!At here ,the process error!!!
				}
				gc_fileend=0;//gb_Openfile->gc_fileend
                gb_PlayPause = 0;
			}
			else
			{
				gc_SystemStateMode=SYSTEM_STATE0_IDLE;
				return;
			}
		}
		G_Currtotalsecond=0;     
        USER_DelayDTms(10);				// Delay 10mS for de-bounce
	}
}


void Audio_CoDec(void)
{
	if(gb_UIPostError)  // UI post-processor error happen !!
	{
		// reset the state to IDLE state --
		gb_UIPostError=0;     // reset the error flag
		if(gc_SystemStateMode==SYSTEM_STATE1_PLAYING)
		{
			if(gc_PlaySequenceMode == 0x01)
			{//repeat one
				//==initialize parameters==//
				gc_SystemStateMode=SYSTEM_STATE0_IDLE;
			}
			else
			{ 	
				//repeat all and no repeat
				if (gw_FileIndex[0]==gw_FileTotalNumber[0])   
				{
					gc_PeriphStep = PERIPH_IDLE; 
					gbt_FindFlag = 0;
					gc_SystemStateMode=SYSTEM_STATE0_IDLE;//error happern,goto idle state						
				}
				else
				{
					gb_Openfile = 1; // Make Openfile post-processor activity					
				}
				DOS_Search_File(0x01,0,0x10); 
			}
		}

		return;
	}

	if(gc_SystemStateMode==SYSTEM_STATE1_PLAYING)
	{
	 	// 1         in  the normal state
		if(!gc_fileend)
		{//A            
		    if(gb_PlayPause)
			{
				gc_SystemStateMode=STATE_PLAY_PAUSE;
			}

			gc_fileend = CODEC_MCU_TO_DSP();
		}
		else
		{//End of File for play		
			{//wait DSP decode end			
				if(gc_PlaySequenceMode == 0x03) // Random play
				{
					gb_Openfile = 1; // Make Openfile post-processor activity
					X_RandomGetFileIndex();
				}
				else if(gc_PlaySequenceMode == 0x02) // Repeat All
				{
					if (gw_FileIndex[0]==gw_FileTotalNumber[0])
			    	{
						if(gc_PlaySequenceMode == 0x02)
					    {
							gb_Openfile = 1; // Make Openfile post-processor activity
							System_NextOrPrev(0, 1, 0);
					    }
					 	else    // Mode=0 , Single play,  stop play right now!
					    {
						  gc_SystemStateMode=SYSTEM_STATE0_IDLE;
						  System_Stop();//must call system_stop() here
						  DOS_Search_File(0x12,1,0x10);
					    }
					}
				    else
					{
						gb_Openfile = 1; // Make Openfile post-processor activity
						System_NextOrPrev(0, 1, 0);
					}
				}
				else	// Repeat 1
				{
					gb_Openfile = 1;
					System_NextOrPrev(0, 1, 0);
					System_NextOrPrev(1, 1, 0);
				}
			}
		}
	}
}


void X_RandomGetFileIndex(void)
{
	U16 Num;
	
	if(gw_FileTotalNumber[0]==1)
	{
		return;
	}
	else if(gw_FileTotalNumber[0]==2)
	{
		System_NextOrPrev(0,1,0);
		return;
	}

	Num=(((TH0<<8)+TL0)%gw_FileTotalNumber[0])+1;

	if(gw_FileIndex[0]==Num)	// Same song number, play next one
	{
		Num=1;
	}
	else
	{
		if (gw_FileIndex[0] > Num)
		{
			Num=gw_FileIndex[0]-Num;
		}
		else
		{
			Num=gw_FileTotalNumber[0]+gw_FileIndex[0]-Num;
		}
	}
	gc_FileSkipNumber=Num;
	System_NextOrPrev(1,1,0);
}


void UI_host_decet(void)
{
	U8 tc_HostInsert,tc_DoInitialize; 
	tc_HostInsert = 0;	
	tc_DoInitialize = 0;

    if((gc_CurrentCard == CURRENT_MEDIA_HOST)&&(gb_HostConnect == 0))
 	{//if data read write timeout occur
		System_Stop();
		gc_SystemStateMode = SYSTEM_STATE0_IDLE;
		Host_Remove();	
		gc_CurrentCard = 0;
	}

	if(gc_SystemStateMode == SYSTEM_STATE0_IDLE)
	{		
		tc_HostInsert = Host_DetectDevice();

		if(!tc_HostInsert)
		{	
			//host insert
			if (!(gc_CurrentExistMedia & 0x20))
			{
				//HOST does not exist last time 	
		  		gc_DOS_ErrorStatus = Host_Initial();
		  		if(!gc_DOS_ErrorStatus)
				{
					//initial successfully
					gc_CurrentExistMedia |= 0x20;
					gc_CurrentCard = CURRENT_MEDIA_HOST;
					tc_DoInitialize = 1;
				}
				else
				{
					Host_Remove();	//initial fail
					tc_HostInsert=1; // 20080620
				}		  
			} 
		}
		else
		{//host be out
			if((gc_CurrentExistMedia & 0x20)==0x20)
			{//host exists last time
				gc_CurrentExistMedia &= 0xDF;  
				gc_DOS_ErrorStatus = SD_STORAGE_Initialize();
				if(gc_DOS_ErrorStatus==0)
				{
					tc_DoInitialize = 1;  
				}
			} 		
			tc_HostInsert=1; // 20080620
		}

		if (tc_DoInitialize)
		{
			gc_KeyValue=3;	// maxliao 20070719

			gs_File_FCB[0].dw_FDB_StartCluster = gdw_DOS_RootDirClus;
			gbt_FindFlag = 0;//?璶材

⌨️ 快捷键说明

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