📄 tuner.c
字号:
if(FlagMute) WriteDataWord[0] |= 0x80;
else WriteDataWord[0] &= 0x7f ; //0111 1111
if (FlagSearch ) // search mode
{
WriteDataWord[0] |= 0x40; // Set to 1 for search start; other =0.
// Set the bits of BYTE3 of search
if(FlagSearchtUp) WriteDataWord[2] |= 0x80;
else WriteDataWord[2] &= 0x7f; //0111 1111
if ((FlagLevel & 0x02) == 0x02) WriteDataWord[2] |=0x40 ;
else WriteDataWord[2] &=0x0bf; //1011 1111
if ((FlagLevel & 0x01) == 0x01) WriteDataWord[2] |=0x20;
else WriteDataWord[2] &=0x0df; //1101 1111
Write1= WriteDataWord[0];
}
/////PreSet mode
else
{
AssembleFrequencyWord();
WriteDataWord[0] &= 0x0bf; // Set to 0 for Preset mode. 1011,1111
}
//set the public data bit of BYTE3
if(FlagHighInjection) WriteDataWord[2] |= 0x10 ;
else WriteDataWord[2] &= 0x0ef; //1110 1111
if(FlagMono) WriteDataWord[2] |= 0x08 ;
else WriteDataWord[2] &= 0x0f7 ; //1111 0111
//set the public data bit of BYTE4
if(FlagSWPORT2) WriteDataWord[3] |= 0x80;
else WriteDataWord[3] &= 0x7f ; //0111 1111
if(FlagSoftMute) WriteDataWord[3] |= 0x08;
else WriteDataWord[3] &= 0xf7 ; //1111 0111
if(FlagSWPORT1) WriteDataWord[3] |= 0x01;
else WriteDataWord[3] &= 0xfe ; //1111 1110
}
//////////////////////////////////////////////////////////////////////////////////
/* Above are local sub routine and called in this file */
/*********************************************************
* NAME : Tuner_Preset
* PreSet the 5767 to a Staion_FREQ
*
* Returns : none
*
* Parameter Description
* --------------------------------------------------------
* none
*
* Externals Usage
* --------------------------------------------------------
* Target VCO in
*
* Additional information:
* Local subfunction
* Tested, It is Ok. 4/16
*********************************************************/
void Tuner_Preset (BIT Mute, BIT SetMono,BIT Pin15,unsigned long VCO)
{
FlagSearch = False; // Set global parameters
FlagMono = SetMono;
FlagSWPORT2 = Pin15;
gdwPresetVCO = VCO;
FlagMute=Mute; //0301 mao
AssembleData();
WriteSTR();
Delay10us(50000); //200ms
ReadSTR(); //read data to ReadDataWord[] .
Delay10us(2);
#if 0
// while (SWPORT1);
while(!SearchOver() ) // waiting for station detected
{
Delay10us(2000);
WriteSTR();
}
#endif
}
/*********************************************************
* NAME : Tuner_Search
* Tea5767 to search a statioon.
*
* Returns : none
*
* Parameter Description
* --------------------------------------------------------
* none
*
* Externals Usage
* --------------------------------------------------------
* DataWord[37-24] the bits will be taken(in)
* //gdwSearchedVCO the Freq (out)
*
* Additional information:
* Local subfunction
*********************************************************/
void Tuner_Search (BIT Direction,BYTE Level ) // target level to search for
{
if (Direction)
{
Tuner_Preset (False,False,Low,gdwPresetVCO+AST_STEP); // Preset to searched station 0301 mao
FlagHighInjection=False;
}
else
{
Tuner_Preset (False,False,Low,gdwPresetVCO-AST_STEP);
FlagHighInjection=True;
}
FlagSearch = True; // Set global parameters
FlagSearchtUp = Direction;
FlagLevel = Level;
FlagMute=True; //0301 mao
AssembleData();
WriteSTR();
// Delay10us(100000); //1s ms
///////////////////
#if 1
while (SWPORT1);
Delay10us(2);
while(!SearchOver() ) // waiting for station detected
{
NotFound = True;
}
FlagSearch = False; // Reset search flag
ReadSTR(); //read data to ReadDataWord[] .
Delay10us(2); //for test only
DisAssembleFrequencyWord(); // retrieve VCO frequency from ReadDataWord[]
Delay10us(2);
#else
/////////////////////////
do
{
Delay10us(10000); //0.1s ms
ReadSTR(); //how about continue read???? mao 0227
tbRead1=ReadDataWord[0];
tbRead2=ReadDataWord[2];
LowCount++; //for test only.
Delay10us(20);
if((tbRead1&0x80) != 0) Ready=True; //Found
else Ready=False;
Delay10us(20);
if((tbRead1&0x40) != 0) BandLimit=True; //limited
else BandLimit=False;
Delay10us(20);
if((tbRead2&0x80) != 0) Stereo=True;
else Stereo=False;
Delay10us(20);
if(Ready) break;
DisAssembleFrequencyWord(); // retrieve VCO frequency from ReadDataWord[]
Tuner_Preset (True,False,Low,gdwPresetVCO); // Preset to searched station 0301 mao
FlagSearch = True; // Set global parameters
AssembleData();
WriteSTR();
Delay10us(20000); //for test only
}
while( !BandLimit ) ;
DisAssembleFrequencyWord(); // retrieve VCO frequency from ReadDataWord[]
#endif
///////////////////////////////
FlagSearch = False; // Reset search flag
if((gdwSearchedVCO > HighestFM )|| (gdwSearchedVCO < LowestFM ) )
{
BandLimit=True;
FlagSWPORT2=True;
LCD_ShowChar(LCD_ERR);
}
else
{
Tuner_Preset (False,False,Low,gdwSearchedVCO); // Preset to searched station 0301 mao
LCD_ShowFM(0x00,gdwSearchedVCO);
BandLimit=False;
}
Delay10us(20); //for test only
LowCount=0;
}
/*********************************************************
* NAME : Tuner_AST_Search
* Perform the AST function
*
* Returns : none
*
* Parameter Description
* --------------------------------------------------------
* none
*
* Externals Usage
* --------------------------------------------------------
*
* Additional information:
* To simplify the control,we only search one level of 3.
* in factly we should search 2 and 3 level.
*
*********************************************************/
BYTE station_num=0;
void Tuner_AST_Search(void)
{
UINT32 InitASTVCO=0;
//Mute(ON); //no sound out
//clear the sation buffer!!!
for(station_num=0;station_num<=MAX_STATION;station_num++)
{
TunerStation[station_num]=0;
}
station_num=0;
gdwPresetVCO = LowestFM-AST_STEP; // Lowest -SETP
Delay10us(20); // Test only
do
{
// Tuner_Preset (False,False,Low,gdwSearchedVCO+AST_STEP );
//Delay10us(50000); // 500ms delay
Tuner_Search(Up,SearchLevel);
if(!BandLimit)
{
Delay10us(2); // Test only
station_num++; //stion 0 not used.
TunerStation[station_num]=gdwSearchedVCO;
gdwPresetVCO =gdwSearchedVCO; //for next search use
//Tuner_Preset (False,False,Low,gdwSearchedVCO); //???? 0308 for test????
// LCD_ShowFM(station_num,gdwSearchedVCO);
Delay10us(100000); // 1s delay
}
else
{
SearchLevel--;
BandLimit=False;
break;
}
Delay10us(2); // 250ms delay
}while(station_num < MAX_STATION+1);
Max_Station=station_num;
////////////////////////////////////
if(Max_Station >0) //if found station!!!
{
Delay10us(100);
/* when exit AST, preset a fm station */
NowStation=1;
gdwWorkingVCO=TunerStation[NowStation];
Tuner_Preset (False,False,Low,gdwWorkingVCO);
//Mute(OFF); //sound out
// LCD_ShowFM(NowStation,gdwWorkingVCO);
}
else
LCD_ShowChar(LCD_ERR);
}
/*********************************************************
* NAME : Tuner_Init
* Tea5767 init. and preset it to a station.
*
* Returns : none
*
* Parameter Description
* --------------------------------------------------------
* none
*
* Externals Usage
* --------------------------------------------------------
* DataWord[37-24] the bits will be taken(in)
* //gdwSearchedVCO the Freq (out)
*
* Additional information:
* Local subfunction
*********************************************************/
void Tuner_Init(void)
{
BYTE i;
for(i=0;i<5;i++) //Clear 5767 data buffer =0
{
ReadDataWord[i] = False;
WriteDataWord[i] =False;
}
WriteDataWord[0] = 0x2a; //00101010 // init FM89.8MHz ok.
WriteDataWord[1] = 0x0b6; //10110110
WriteDataWord[2] = 0x41; //01000001
WriteDataWord[3] = 0x11; //00010001 //soft Mute
WriteDataWord[4] = 0x40; //01000000
WriteSTR();
Delay10us(100);
WriteDataWord[0] = 0x2a; // init FM89.8MHz ok.
WriteDataWord[1] = 0x0b6;
WriteDataWord[2] = 0x41; //p1 high
WriteDataWord[3] = 0x11;
WriteDataWord[4] = 0x40;
WriteSTR();
Tuner_Preset( False, False,High,97100 ) ;
}
/*********************************************************
* NAME : Tuner_UIF
* According the key val to process the function!!
*
* Returns : none
*
* Parameter Description
* --------------------------------------------------------
* none
*
* Externals Usage
* --------------------------------------------------------
*
*
* Additional information:
* none
*********************************************************/
void Tuner_UIF(void)
{
if( gbNewKey != KEY_NONE )
{
//ClearDisplayDelay(); // clear display delay timer
Delay10us(8);
switch( gbNewKey )
{
case KEY_PREV_DIR: //25 Prev station 103.2
Tuner_Search (Down,SearchLevel );
Tuner_Preset (False,False,Low,gdwSearchedVCO); // Preset to searched station 0301 mao
break;
case KEY_NEXT_DIR: //next staion 103.2
Tuner_Search (Up,SearchLevel );
Tuner_Preset (False,False,Low,gdwSearchedVCO); // Preset to searched station 0301 mao
break;
case KEY_VOL_DOWN: //Tune down one step 100kHz
Tuner_Preset(False,False,High,gdwPresetVCO-STEP);
break;
case KEY_VOL_UP: //Tune up one step 100kHz
Tuner_Preset(False,False,High,gdwPresetVCO+STEP);
break;
case KEY_FR: //29H
Tuner_Preset(False,False,High,88300); //97100);
break;
case KEY_FF: //2aH
Tuner_Preset(False,False,High,100000); //89800);
break;
case KEY_SOUND_EFFECT: // prev station
Tuner_Preset(False,False,High,97100);
break;
case KEY_ESP: //Next station
Tuner_AST_Search(); //AST FUNCTION
break;
case KEY_PLAY: //
if( NowStation>0)
{
NowStation--;
gdwWorkingVCO=TunerStation[NowStation];
Tuner_Preset (False,False,Low,gdwWorkingVCO);
}
break;
case KEY_STOP: // 46
if(NowStation<MAX_STATION)
{
NowStation++;
gdwWorkingVCO=TunerStation[NowStation];
Tuner_Preset (False,False,Low,gdwWorkingVCO);
}
break;
}
gbNewKey = KEY_NONE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -