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

📄 radio.c

📁 我个人编写的车载dvd上的程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		else
			DispBuff[2][9]='0'+j;
#endif		

	}
#ifdef SINO_MOS
     //  PrintLine(str);
#else
	Display(DISP_REFRESH2);
#endif
}

#endif
/*********************************************
	Function:		RadioSeek
	Description:	
	Write/Modify:	Perry.Liang
	Time:		2006-1-24- 15:38:27
*********************************************/
void RadioSeek(void)
{
	switch(Radio.SeekMode)
	{
		case RADIO_SEEK_IDLE:
			
			break;
		case RADIO_SEEK_INIT:
			Radio.SeekMode=RADIO_SEEK_CHANGE_FRE;
			break;
			
		case RADIO_SEEK_CHANGE_FRE:
			RadioSetFreq(Radio.ReqFreq);
			if(FreqInFM(Radio.Freq))
			{
				//Wait10us(60);//wait for SMeter stable
				Wait10us(200);
				if(GetSMeter()>DB10)
				{
					RadioWaitTimer=6;//wait for SSTOP in FM
					Radio.SeekMode=RADIO_SEEK_WAIT;
				}
				else
				{
					Radio.SeekMode=RADIO_SEEK_IDLE;
				}
				
			}
			else
			{
    				RadioWaitTimer=6;
    				Radio.SeekMode=RADIO_SEEK_AMFSU_WAIT;
			}
			break;
			
		case RADIO_SEEK_AMFSU_WAIT:
			if(RadioWaitTimer>0)break;
			if(GetSMeter()>30)
			{
				RadioWaitTimer=12;//wait for SSTOP in AM
				Radio.SeekMode=RADIO_SEEK_WAIT;
			}
			else
			{
				Radio.SeekMode=RADIO_SEEK_IDLE;
			}
			break;

		case RADIO_SEEK_WAIT:
			if(RadioWaitTimer>0)break;
			/*if(FreqInFM(Radio.Freq))
			{
				if (CheckIFC(50,1000))
					Radio.F_GoodStation=1;
			}
			else*/
			{
				if (CheckIFC(50,1000))
				{
					Radio.F_GoodStation=1;

				}
			}
   			Radio.SeekMode=RADIO_SEEK_IDLE;
			break;
			
		case RADIO_SEEK_CHECK:
			
			break;
		case RADIO_SEEK_GOOD_STATION:

			break;
		case RADIO_SEEK_BAD_STATION:
			
			break;
		
	}
	
}

/*********************************************
	Function:		RadioWork
	Description:	
	Write/Modify:	Perry.Liang
	Time:		2006-1-24- 15:38:25
*********************************************/
void RadioWork(void)
{
	unsigned char i,j;
	
	switch(Radio.WorkMode)
	{
		case RADIO_WORK_IDLE:
			if(System.DispMode.Current!=DISPMODE_RADIO)
				break;
				
			if(F_HalfSecondOut)
			{
				Radio.Smeter=GetSMeter();
				/*AniBuff[23]=Radio.Smeter/100+'0';
				i=Radio.Smeter%100;
				AniBuff[24]=i/10+'0';
				AniBuff[25]=i%10+'0';

				Radio.F_TunerDispReq=1;*/
			}
			break;
		case RADIO_WORK_SEEKREQ:
			//Radio.Band[Radio.CurrentBand].CurrentMem=0;
			Radio.F_TunerDispReq=1;
			Radio.WorkMode=RADIO_WORK_SEEKWAIT;
			Radio.BackupFreq=Radio.Freq;
			SeekOn();
			RadioMute(SOFTON);
			Radio.SeekMode=RADIO_SEEK_IDLE;
			//break;//!!!!!!!!
		case RADIO_WORK_SEEKWAIT:
			if(Radio.SeekMode!=RADIO_SEEK_IDLE)break;
			if(Radio.F_GoodStation)
			{
				Radio.F_GoodStation=0;
		
				if((FreqInFM(Radio.Freq)&&!FreqInJapanFM(Radio.Freq)&&!FreqInWBFM(Radio.Freq))&&(RDS.F_AFEnable||RDS.F_TAEnable||RDS.F_PTYEnable||RDS.F_PISeek))
				{
					if(FreqInNormalFM(Radio.Freq))
					{
					
						if(Radio.Freq%10==0)
						{
							Radio.WorkMode=RADIO_WORK_SEEKWAITRDS;
							RadioWorkTimer10ms=25;
						}
						else
							Radio.WorkMode=RADIO_WORK_SEEKNEXT;
					}
					else
						Radio.WorkMode=RADIO_WORK_SEEKNEXT;
				}
				else
					Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
			
				break;
			}
		case RADIO_WORK_SEEKNEXT:
			Radio.ReqFreq=RadioFreqCal(Radio.SeekStep);
			//debug("AUTO SEEK FREQ:              ",Radio.ReqFreq);
			Radio.SeekMode=RADIO_SEEK_INIT;
			Radio.WorkMode=RADIO_WORK_SEEKWAIT;
			if(!Radio.F_Scan)
			{
				if((Radio.BackupFreq==Radio.ReqFreq)
					||(Radio.BackupFreq==Radio.ReqFreq+5 && Radio.Direction==1)
					||(Radio.BackupFreq==Radio.ReqFreq-5 && Radio.Direction==-1))
				{
					Radio.SeekMode=RADIO_SEEK_IDLE;
					Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
				
					RadioSetFreq(Radio.BackupFreq);
					if(RDS.F_PTYEnable)
					{
					F_NoPTY=1;
					PTYSelectTimer=50;
					System.DispMode.Requst=DISPMODE_RDS;
					RDSDispMode=RDSDISP_PTYSELECT;
					}
				}
			}
			else
			{
				if((Radio.ScanBackupFreq==Radio.ReqFreq)
					||(Radio.ScanBackupFreq==Radio.ReqFreq+5 && Radio.Direction==1)
					||(Radio.ScanBackupFreq==Radio.ReqFreq-5 && Radio.Direction==-1))
				{
					Radio.SeekMode=RADIO_SEEK_IDLE;
					Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
					RadioSetFreq(Radio.ScanBackupFreq);
					if(RDS.F_PTYEnable)
					{
					F_NoPTY=1;
					PTYSelectTimer=50;
					System.DispMode.Requst=DISPMODE_RDS;
					RDSDispMode=RDSDISP_PTYSELECT;
					}
					Radio.F_Scan=0;
				}
			}
				

			//Radio.F_TunerDispReq=1;
			break;
		case RADIO_WORK_SEEKWAITRDS:
			if(RDS.F_RDSStation)
			{
				Radio.WorkMode=RADIO_WORK_SEEKWAITPI;
				RadioWorkTimer10ms=100;
				//Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
				break;
			}
			if(RadioWorkTimer10ms==0)
			{
	#ifdef TunerSeekOK
                            Radio.WorkMode  = RADIO_WORK_SEEKOKWAIT;
	#else
				Radio.WorkMode=RADIO_WORK_SEEKNEXT;
	#endif
			}
			break;
		case RADIO_WORK_SEEKWAITPI:
			if(RDS.F_GetNewPI)
			{

				if(RDS.F_TAEnable)
				{
					Radio.WorkMode=RADIO_WORK_SEEKWAITTP;
					RadioWorkTimer10ms=9;
				}
				else if(RDS.F_PTYEnable)
				{
					Radio.WorkMode=RADIO_WORK_SEEKWAITPTY;
					PTYSelectTimer=100;
					RadioWorkTimer10ms=9;
				}
				else if(RDS.F_PISeek)
				{
					if(((RDS.PI==RDS.PIBackup&&RDS.F_REGEnable)
						||((RDS.PI&0x00FF)==(RDS.PIBackup&0x00FF)&&!RDS.F_REGEnable))
						&& RDS.PI!=0)
					{
						Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
						RDS.F_PISeek=0;
					}
					else
					{
						Radio.WorkMode=RADIO_WORK_SEEKNEXT;
					}
				}
				else
					Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
				break;
			}
			if(RadioWorkTimer10ms==0)
			{
				Radio.WorkMode=RADIO_WORK_SEEKNEXT;
			}
			break;
		case RADIO_WORK_SEEKWAITTP:
			if(RDS.F_GetNewTP&&RDS.TP)
			{
				Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
				break;
			}
			if(RadioWorkTimer10ms==0)
			{
				Radio.WorkMode=RADIO_WORK_SEEKNEXT;
			}
			break;
		case RADIO_WORK_SEEKWAITPTY:
			if(RDS.F_GetNewPTY&&(RDS.PTY==PTYSelectType))
			{
				Radio.WorkMode=RADIO_WORK_SEEKOKWAIT;
				PTYSelectTimer=1;
				break;
			}
			if(RadioWorkTimer10ms==0)
			{
				Radio.WorkMode=RADIO_WORK_SEEKNEXT;
			}
			break;
		case RADIO_WORK_SEEKOKWAIT:
			RadioSeekMuteTimer=5;
			Radio.WorkMode=RADIO_WORK_SEEKOK;
			break;
		case RADIO_WORK_SEEKOK:
			if(RadioSeekMuteTimer>0)break;
			RDS.F_PISeek=0;
			Radio.WorkMode=RADIO_WORK_IDLE;
			SeekOff();
			RadioMute(SOFTOFF);
			debug_val("Get Real Freq:         ",Radio.ReqFreq);
			Radio.F_TunerDispReq=1;
			if(Radio.F_Scan)
			{
				Radio.WorkMode=RADIO_WORK_SCANWAIT;
				RadioWorkTimer=50;
			}
			break;
		case RADIO_WORK_SCANWAIT:
			if(RadioWorkTimer>0)break;
			Radio.WorkMode=RADIO_WORK_SEEKREQ;
			break;
		case RADIO_WORK_SEEKBREAK:
			RDS.F_PISeek=0;
			Radio.F_GoodStation=0;
			Radio.SeekMode=RADIO_SEEK_IDLE;
			Radio.WorkMode=RADIO_WORK_IDLE;
			SeekOff();
			RadioMute(SOFTOFF);
			Radio.F_TunerDispReq=1;
			break;

		case RADIO_WORK_PSREQ://display the each preset memory frequency during 5 seconds
			Radio.WorkMode=RADIO_WORK_PSWAIT;
			if(FreqInFM(Radio.Freq))
			{
				Radio.FMBand[FmIdx].CurrentMem=0;
			}
			else
			{
				Radio.AMBand[AmIdx].CurrentMem=0;
			}
			RadioWorkTimer=0;
			break;
		case RADIO_WORK_PSWAIT:
			if(RadioWorkTimer>0)break;
			RadioWorkTimer=50;
			if(FreqInFM(Radio.Freq))
			{
				if(Radio.FMBand[FmIdx].CurrentMem==6)
				{
					Radio.FMBand[FmIdx].CurrentMem=1;
					Radio.WorkMode=RADIO_WORK_PSEND;
				}
				else
					Radio.FMBand[FmIdx].CurrentMem++;
			}
			else
			{
				if(Radio.AMBand[AmIdx].CurrentMem==6)
				{
					Radio.AMBand[AmIdx].CurrentMem=1;
					Radio.WorkMode=RADIO_WORK_PSEND;
				}
				else
					Radio.AMBand[AmIdx].CurrentMem++;
			}
			BreakAFCheck();
			RadioMute(SOFTON);
			if(FreqInFM(Radio.Freq))
			{
				RadioSetFreq(Radio.FMBand[FmIdx].MemFreq[Radio.FMBand[FmIdx].CurrentMem-1]);
			}
			else
			{
				RadioSetFreq(Radio.AMBand[AmIdx].MemFreq[Radio.AMBand[AmIdx].CurrentMem-1]);
			}
			RadioMute(SOFTOFF);
			System.DispMode.Requst=DISPMODE_RADIO;
			RDSDispMode=RDSDISP_IDLE;
			break;
		case RADIO_WORK_PSEND:
			RadioWorkTimer=0;
			Radio.WorkMode=RADIO_WORK_IDLE;
			break;
		case RADIO_WORK_ASPSBREAK:
			Radio.SeekMode=RADIO_SEEK_IDLE;
			Radio.WorkMode=RADIO_WORK_IDLE;
			SeekOff();
			RadioMute(SOFTOFF);
			RadioWorkTimer=0;
			Radio.F_TunerDispReq=1;
			break;

		case RADIO_WORK_ASREQ:
			if(FreqInFM(Radio.Freq)&&Radio.Area==AREA_OIRT)
				Radio.BackupFreq=Area[AREA_OIRT].FMMinFreqOirt;
			else
				Radio.BackupFreq=Radio.MinFreq;
			Radio.ReqFreq=Radio.BackupFreq;
			RadioSetFreq(Radio.ReqFreq);
		 	Radio.Direction=1;
			if(FreqInFM(Radio.Freq))
			{
				for(i=0;i<6;i++)
				{
					Radio.FMBand[FmIdx].MemFreq[i]=Radio.BackupFreq;
					Radio.FMBand[FmIdx].MemSmeter[i]=0;
					Radio.FMBand[FmIdx].PI[i]=0;
					Radio.FMBand[FmIdx].MemAFNum[i]=1;
					for(j=0;j<8;j++)
						Radio.FMBand[FmIdx].MemAFList[i][j]=0xFF;
				}
			}
			else
			{
				for(i=0;i<6;i++)
				{
					Radio.AMBand[AmIdx].MemFreq[i]=Radio.BackupFreq;
					Radio.AMBand[AmIdx].MemSmeter[i]=0;
					//Radio.AMBand[FmIdx].PI[i]=0;
					//Radio.AMBand[FmIdx].MemAFNum[i]=1;
					//for(j=0;j<8;j++)
						//Radio.FMBand[FmIdx].MemAFList[i][j]=0xFF;
				}
			}
			SeekOn();
			RadioMute(SOFTON);
			Radio.WorkMode=RADIO_WORK_ASWAIT;
			TempPresetNum=0;
			Radio.F_TunerDispReq=1;
			break;
		case RADIO_WORK_ASWAIT:
			if(Radio.SeekMode!=RADIO_SEEK_IDLE)break;
			if(Radio.F_GoodStation)
			{
				Radio.F_GoodStation=0;
				if((FreqInFM(Radio.Freq)&&!FreqInJapanFM(Radio.Freq)&&!FreqInWBFM(Radio.Freq))&&(RDS.F_AFEnable||RDS.F_TAEnable))
				{
					Radio.WorkMode=RADIO_WORK_ASWAITRDS;
					RadioWorkTimer10ms=25;
					break;
				}
				else
					PresetOrder();
			}
		case RADIO_WORK_ASNEXT:
			Radio.ReqFreq=RadioFreqCal(Radio.SeekStep);
			Radio.SeekMode=RADIO_SEEK_INIT;
			Radio.WorkMode=RADIO_WORK_ASWAIT;
			if(Radio.ReqFreq==Radio.BackupFreq)
			{
				Radio.SeekMode=RADIO_SEEK_IDLE;
				Radio.WorkMode=RADIO_WORK_ASEND;
			}
			break;

		case RADIO_WORK_ASWAITRDS:
			if(RDS.F_RDSStation)
			{
				Radio.WorkMode=RADIO_WORK_ASWAITPI;
				RadioWorkTimer10ms=100;
				break;
			}
			if(RadioWorkTimer10ms==0)
				Radio.WorkMode=RADIO_WORK_ASNEXT;
			break;

		case RADIO_WORK_ASWAITPI:
			if(RDS.F_GetNewPI&&RDS.PI!=0)
			{
				if(FreqInFM(Radio.Freq))
				{
					for(i=0,j=0;i<TempPresetNum;i++)
					{
						if(RDS.PI==Radio.FMBand[FmIdx].PI[i])
						{
							j=1;
							break;
						}
					}
				}
				if(j)
				{
					Radio.WorkMode=RADIO_WORK_ASNEXT;
				}
				else
				{
					Radio.WorkMode=RADIO_WORK_ASWAITAFLIST;
					RadioWorkTimer10ms=250;
				}
				break;
			}
			if(RadioWorkTimer10ms==0)
				Radio.WorkMode=RADIO_WORK_ASNEXT;
			break;
			
		case RADIO_WORK_ASWAITAFLIST:
			if(RDS.F_GetAFList)
			{
				PresetOrder();
				Radio.WorkMode=RADIO_WORK_ASNEXT;
				break;
			}
			if(RadioWorkTimer10ms==0)
				Radio.WorkMode=RADIO_WORK_ASNEXT;
			break;
			
		case RADIO_WORK_ASEND:
			//for(i=0;i<TempPresetNum;i++)
			//	Radio.Band[Radio.CurrentBand].MemFreq[i]=TempPreset[i].Freq;
			SeekOff();
			RadioMute(SOFTOFF);
			Radio.WorkMode=RADIO_WORK_PSREQ;
			break;
			
	}
	
}

/*********************************************
	Function:		RadioSetFreq
	Description:	
	Write/Modify:	Perry.Liang
	Time:		2006-1-24- 15:38:24
*********************************************/
void RadioSetFreq(unsigned int setfreq)
{
	volatile unsigned int pc;
	volatile unsigned char i,start,end;
 debug_val("Set Freq:",setfreq);
#if TDA7540_TUNER
if(!Radio.F_TDA7541)
{
	start=39;
	end=0;
	
	if(Radio.F_ForceSetBuff)
	{
		for(i=0;i<40;i++)
			Radio.TunerBuff[i]=EepromBuff[i];

		// seek off
		Radio.TunerBuff[0] &= 0x7F;

		// Disable local mode
		Radio.TunerBuff[7] &= 0x7F;

	       //Enable AFS PIN and AFS influence on stereodecoder mute
		Radio.TunerBuff[31] &= y11110011;
		Pin_AFS=1;

		start=0;
		end=39;
	}

	//PLL counter
	if(FreqInJapanFM(setfreq))
	{
		pc=(setfreq-1070)/5-32;

⌨️ 快捷键说明

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