📄 radio.c
字号:
/*********************************************************
Project: ST FST(TDA7540)
File name: radio.c
Description:
Write/Modify: Perry Liang
Time: 2006-1-24- 15:35:37
*********************************************************/
#include "public.h"
#define M_RadioNewKey { if(F_InTASwitch||F_InEONTASwitch)break;\
BreakAFCheck();\
if(System.DispMode.Current==DISPMODE_RDS)\
{\
System.DispMode.Requst=DISPMODE_RADIO;\
RDSDispMode=RDSDISP_IDLE;\
}\
if(RDSDispTimer>1)RDSDispTimer=0;\
if(AFTAShowTimer>1)AFTAShowTimer=1;}
typedef struct Band_conststuct {
unsigned int BandFreq;
unsigned int MemFreq[6];
unsigned char CurrentMem;
} BandConstStuct;
typedef struct Area_stuct {
BandConstStuct Band[5];
unsigned char FMStep;
unsigned char FMSeekStep;
unsigned int FMMaxFreq;
unsigned int FMMinFreq;
unsigned char FMStepOirt;
unsigned int FMMaxFreqOirt;
unsigned int FMMinFreqOirt;
unsigned char AMStepMW;
unsigned int AMMaxFreqMW;
unsigned int AMMinFreqMW;
unsigned char AMStepLW;
unsigned int AMMaxFreqLW;
unsigned int AMMinFreqLW;
} AreaStuct;
static const AreaStuct Area[]=
{
// USA
8750,8750,9010,9810,10610,10790,8750,0,
8750,8750,9670,10490,10690,10790,8750,0,
8750,8750,8750,8750,8750,8750,8750,0,
530,530,600,1000,1600,1720,530,0,
530,530,600,1000,1600,1720,530,0,
20,20,10790,8750,
0,0,0,
10,1720,530,
0,0,0,
// LATIN
8750,8750,9010,9810,10610,10800,8750,0,
8750,8750,8750,8750,8750,8750,8750,0,
8750,8750,8750,8750,8750,8750,8750,0,
520,520,600,1000,1400,1620,520,0,
520,520,520,520,520,520,520,0,
10,10,10800,8750,
0,0,0,
10,1620,520,
0,0,0,
// EUROPE
8750,8750,9010,9810,10610,10800,9120,0,
//8750,8750,8750,8750,8750,8750,8750,0,
8780,8780,9180,9390,9710,10300,10430,0,
8750,8750,8750,8750,8750,8750,8750,0,
522,522,603,999,1404,1620,522,0,
//144,144,166,218,272,290,144,0,
144,144,171,216,270,288,144,0,
//5,10,10800,8750,
5,5,10800,8750,
0,0,0,
9,1620,522,
// 1,290,144,
9,288,144,
// OIRT
6500,6500,8750,9000,9800,10600,10800,0,
6500,6500,8750,9000,9800,10600,10800,0,
6500,6500,8750,9000,9800,10600,10800,0,
531,531,603,999,1404,1620,531,0,
//144,144,166,218,272,290,144,0,
144,144,171,216,270,288,144,0,
5,10,10800,8750,
3,7400,6500,
9,1620,522,
// 1,290,144,
9,288,144,
};
static const unsigned char TunerDefaultSetting[]=
{
0xd1,0x60,0x08,0x80,0x1a,0x98,0x8f,0x00,0x61,0xd0,
0x20,0x4a,0x93,0x35,0x25,0x20,0x00,0xc0,0x36,0xc6,
0x00,0x07,0x04,0x60,0x46,0x9e,0xe7,0x79,0x7c,0xdc,
0x14,0x7d,0x79,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,
0xaf,0x94,0x8d,0x48,0x48,0x48,0xa6,0x9d,0x92,0x90,
};
/*********************************************
Function: CheckIFC
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:39:26
*********************************************/
unsigned char CheckIFC(unsigned int times,unsigned int all)
{
unsigned int i,j;
for(i=0,j=0;i<all;i++)
{
if(!Pin_SSTOP)
{
j++;
if(j>=times)return(0);
}
}
return(1);
}
/*********************************************
Function: GetSMeter
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:39:21
*********************************************/
unsigned char GetSMeter (void)
{
unsigned int inttemp;
unsigned char temp;
unsigned char i,max,min;
//F_ADDisable=1;
inttemp=0;
for (i=0,max=0,min=255;i<5;i++)
{
temp=(GetADValue(AD_FSU)>>1);
inttemp+=(int)temp;
if(temp<min)min=temp;
if(temp>max)max=temp;
}
//F_ADDisable=0;
temp = (inttemp-min-max)/3;
return(temp);
}
/*********************************************
Function: LoadArea
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:56
*********************************************/
void LoadArea(void)
{
unsigned char i,j;
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
Radio.Band[i].MemFreq[j]=Area[Radio.Area].Band[i].MemFreq[j];
Radio.Band[i].BandFreq=Area[Radio.Area].Band[i].BandFreq;
Radio.Band[i].CurrentMem=Area[Radio.Area].Band[i].CurrentMem;
}
Radio.MaxFreq=Area[Radio.Area].FMMaxFreq;
Radio.MinFreq=Area[Radio.Area].FMMinFreq;
Radio.Step=Area[Radio.Area].FMStep;
Radio.SeekStep=Area[Radio.Area].FMSeekStep;
Radio.CurrentBand=0;
}
/*********************************************
Function: ChangeTV2
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:55
*********************************************/
signed char ChangeTV2(unsigned char inputbuff)
{
if(inputbuff&0x80)
return (inputbuff&0x7F);
else
return (0-(inputbuff&0x7F));
}
/*********************************************
Function: ChangeToTV2
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:54
*********************************************/
unsigned char ChangeToTV2(signed char inputbuff)
{
if(inputbuff&0x80)
return (0x80-(inputbuff&0x7F));
else
return ((inputbuff&0x7F)+0x80);
}
/*********************************************
Function: GetTV2
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:52
*********************************************/
unsigned char GetTV2(unsigned int inputfreq)
{
signed char temp;
signed int tempslope;
if(FreqInAM(inputfreq))
return(0x90);
if(FreqInOirtFM(inputfreq))
{
if(inputfreq<6650)
return(EepromBuff[43]);
else if(inputfreq<7050)
return(EepromBuff[44]);
else
return(EepromBuff[45]);
}
if(inputfreq<Radio.TestPointFreq)
tempslope=Radio.Slope;
else
tempslope=Radio.Slope2;
temp=(signed char)((signed int)(Radio.TestPointFreq-inputfreq)/tempslope+Radio.TestPointVal);
return(ChangeToTV2(temp));
}
/*********************************************
Function: RadioInit
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:51
*********************************************/
void RadioInit(void)
{
unsigned char i,j,k;
PD_AFS=1;//PD4--push-pull output
PO_AFS=1;
PD_SWFLAG=0;//PD7--floating input for ISS filter status
PO_SWFLAG=0;
PD_SSTOP=0;//PD6--floating input
PO_SSTOP=0;
//Pin_POWER=1;
Wait1ms(200);
EepromRead(TunerEepromAddress,0,1,&EepromBuff[0]);
if(EepromBuff[0]!=0x0C)
{
//for(i=0;i<50;i++)
// EepromBuff[i]=TunerDefaultSetting[i];//yete test
DispNum[0]='N';
DispNum[1]='O';
DispNum[2]=' ';
DispNum[3]='A';
DispNum[4]='L';
DispNum[5]='I';
DispNum[6]='G';
DispNum[7]='N';
DisplayNumber();
DisplaySentData();
while(1);
}
else
{
EepromRead(TunerEepromAddress,10,50,&EepromBuff[0]);
}
Radio.TestPointFreq=9810;
Radio.TestPointVal=ChangeTV2(EepromBuff[41]);
Radio.Slope=(signed int)(9810-8800)/(ChangeTV2(EepromBuff[40])-ChangeTV2(EepromBuff[41]));
Radio.Slope2=(signed int)(10750-9810)/(ChangeTV2(EepromBuff[41])-ChangeTV2(EepromBuff[42]));
RadioSetFreq(8750);
//Pin_POWER=0;
//Radio.Area=Menu.Band_set;
//Radio.Area=AREA_OIRT;
Radio.Area=AREA_EUROPE;
LoadArea();
Radio.CurrentBand=0;
for(k=0;k<5;k++)
{
for(j=0;j<6;j++)
{
Radio.Band[k].MemAFNum[j]=0;
for(i=0;i<8;i++)
Radio.Band[k].MemAFList[j][i]=0xFF;
}
}
}
/*********************************************
Function: RadioOn
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:49
*********************************************/
void RadioOn(void)
{
if(!F_InEONTASwitch)
{
Radio.ReqFreq=Radio.Band[Radio.CurrentBand].BandFreq;
Radio.F_ForceSetBuff=1;
RadioSetFreq(Radio.ReqFreq);
Radio.F_TunerDispReq=1;
}
RadioMute(SOFTOFF);
}
/*********************************************
Function: RadioOff
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:48
*********************************************/
void RadioOff(void)
{
RDSDataInit();
}
/*********************************************
Function: RadioMain
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:47
*********************************************/
void RadioMain(void)
{
if(System.FWorkMode.Next==WORKMODE_RADIO)
RadioOn();
if(System.FWorkMode.Last==WORKMODE_RADIO)
RadioOff();
RadioSeek();
RadioWork();
RadioKey();
RadioDisplay();
}
/*********************************************
Function: RadioKey
Description:
Write/Modify: Perry.Liang
Time: 2006-1-24- 15:38:31
*********************************************/
void RadioKey(void)
{
if(System.FWorkMode.Current!=WORKMODE_RADIO||F_MuteKey)return;
if(Radio.F_ManualSeek ||((SeekKeyTimer%2)==0 && SeekKeyTimer>50))
{
if(Radio.F_ManualSeek)
SeekKeyTimer=50;
else
SeekKeyTimer=255;
Radio.F_ManualSeek=0;
RadioMute(SOFTON);
Radio.ReqFreq=RadioFreqCal(Radio.Step);
RadioSetFreq(Radio.ReqFreq);
Wait1ms(1);
RadioMute(SOFTOFF);
Radio.F_TunerDispReq=1;
}
switch(KeyCode)
{
case S_AD_M1:
case S_RM_M1:
M_RadioNewKey;
RadioLoad(0);
break;
case S_AD_M2:
case S_RM_M2:
M_RadioNewKey;
RadioLoad(1);
break;
case S_AD_M3:
case S_RM_M3:
M_RadioNewKey;
RadioLoad(2);
break;
case S_AD_M4:
case S_RM_M4:
M_RadioNewKey;
RadioLoad(3);
break;
case S_AD_M5:
case S_RM_M5:
M_RadioNewKey;
RadioLoad(4);
break;
case S_AD_M6:
case S_RM_M6:
M_RadioNewKey;
RadioLoad(5);
break;
case L_AD_M1:
case L_RM_M1:
M_RadioNewKey;
RadioSave(0);
break;
case L_AD_M2:
case L_RM_M2:
M_RadioNewKey;
RadioSave(1);
break;
case L_AD_M3:
case L_RM_M3:
M_RadioNewKey;
RadioSave(2);
break;
case L_AD_M4:
case L_RM_M4:
M_RadioNewKey;
RadioSave(3);
break;
case L_AD_M5:
case L_RM_M5:
M_RadioNewKey;
RadioSave(4);
break;
case L_AD_M6:
case L_RM_M6:
M_RadioNewKey;
RadioSave(5);
break;
case L_AD_SEEKUP:
case L_AD_SEEKDN:
SeekKeyTimer=255;//Enter to continous manual seek mode after long press key
if(KeyCode==L_AD_SEEKUP)
Radio.Direction=1;
else
Radio.Direction=-1;
break;
case R_AD_SEEKUP:
case R_AD_SEEKDN:
if(SeekKeyTimer>50)//stop continous manual seek mode and set the valid time of manual seek mode
{
Radio.F_ManualSeek=0;
SeekKeyTimer=50;
}
break;
case S_AD_SEEKUP:
case S_AD_SEEKDN:
if(SeekKeyTimer>0)//short press change one step in manual seek
{
Radio.F_ManualSeek=1;
if(KeyCode==S_AD_SEEKUP)
Radio.Direction=1;
else
Radio.Direction=-1;
}
else//short press in autoseek mode
{
M_RadioNewKey;
if(AFTAShowTimer>1)AFTAShowTimer=1;
if(AudioWorkMode!=AUDIO_MODE_IDLE)break;
if(KeyCode==S_AD_SEEKUP)
Radio.Direction=1;
else
Radio.Direction=-1;
if(RADIO_IN_SEEK)
{
Radio.WorkMode=RADIO_WORK_SEEKBREAK;
}
else if(RADIO_IN_AS||RADIO_IN_PS)
{
Radio.WorkMode=RADIO_WORK_ASPSBREAK;
}
else
{
Radio.WorkMode=RADIO_WORK_SEEKREQ;
}
}
break;
case S_AD_AS:
case S_RM_AS:
M_RadioNewKey;
if((Radio.WorkMode&0xF0)==RADIO_WORK_SEEKMODE)
{
Radio.WorkMode=RADIO_WORK_SEEKBREAK;
}
else if((Radio.WorkMode&0xF0)==RADIO_WORK_ASPSMODE)
{
Radio.WorkMode=RADIO_WORK_ASPSBREAK;
}
else
{
Radio.WorkMode=RADIO_WORK_PSREQ;
}
break;
case L_AD_AS:
case L_RM_AS:
M_RadioNewKey;
if((Radio.WorkMode&0xF0)==RADIO_WORK_SEEKMODE)
{
Radio.WorkMode=RADIO_WORK_SEEKBREAK;
}
else if((Radio.WorkMode&0xF0)==RADIO_WORK_ASPSMODE)
{
Radio.WorkMode=RADIO_WORK_ASPSBREAK;
}
else
{
Radio.WorkMode=RADIO_WORK_ASREQ;
}
break;
case S_AD_BAND:
case S_RM_BAND:
M_RadioNewKey;
if((Radio.WorkMode&0xF0)==RADIO_WORK_SEEKMODE)
{
Radio.WorkMode=RADIO_WORK_SEEKBREAK;
}
else if((Radio.WorkMode&0xF0)==RADIO_WORK_ASPSMODE)
{
Radio.WorkMode=RADIO_WORK_ASPSBREAK;
}
Radio.CurrentBand=MaxMinChangeProtect(Radio.CurrentBand,1, 4, 0, 0);
Radio.ReqFreq=Radio.Band[Radio.CurrentBand].BandFreq;
Radio.F_ForceSetBuff=1;
RadioMute(SOFTON);
RadioSetFreq(Radio.ReqFreq);
RadioMute(SOFTOFF);
Radio.F_TunerDispReq=1;
break;
case S_AD_LOC:
M_RadioNewKey;
Radio.F_LocDx=~Radio.F_LocDx;
Radio.F_ForceSetBuff=1;
RadioMute(SOFTON);
RadioSetFreq(Radio.ReqFreq);
RadioMute(SOFTOFF);
F_DISP_LOC=Radio.F_LocDx;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -