?? tuner.c
字號:
#include "target.h"
#include "tuner.h"
#include "lcd.h"
extern unsigned int idata TimeMessage ;
#define MAX_FMSTATION_NO 18
#define MAX_AMSTATION_NO 6
#define USA_FM_MINFREQ 8750
#define USA_FM_MAXFREQ 10800
#define EUROPE_FM_MINFREQ 8750
#define EUROPE_FM_MAXFREQ 10800
#define JAPAN_FM_MINFREQ 7600
#define JAPAN_FM_MAXFREQ 9000
#define USA_AM_MINFREQ 520
#define USA_AM_MAXFREQ 1710
#define EUROPE_AM_MINFREQ 522
#define EUROPE_AM_MAXFREQ 1620
#define JAPAN_AM_MINFREQ 531
#define JAPAN_AM_MAXFREQ 1620
#ifdef __TUNER__
void GotoPreset(unsigned char);
//define the location of eeprom
enum{
ADDR_CURRENT_BAND = TUNER_EEPROM_ADDR_START,
ADDR_CURRENT_FMFREQ,
ADDR_CURRENT_AMFREQ = ADDR_CURRENT_FMFREQ + 2,
ADDR_FMSTATION_START = ADDR_CURRENT_AMFREQ + 2,
ADDR_AMSTATION_START = (ADDR_FMSTATION_START + MAX_FMSTATION_NO*2),
ADDR_AMSTATION_END = (ADDR_AMSTATION_START + MAX_AMSTATION_NO*2)
};
extern unsigned char idata AudioToneMode;
unsigned int code DEFAULT_FMFREQ = USA_FM_MINFREQ;
unsigned int code DEFAULT_AMFREQ = USA_AM_MINFREQ;
void FPOutChar(unsigned char i,unsigned char j);
enum{
TUNER_MAIN_MODE,
TUNER_SEEK_MODE
};
enum{
DISPLAY_FREQ_MODE,
DISPLAY_NAME_MODE,
DISPLAY_PTY_MODE,
DISPLAY_TEXT_MODE,
DISPLAY_CT_MODE
};
typedef struct freq{
unsigned short FmMax;
unsigned short FmMin;
unsigned char FmStep;
unsigned short AmMax;
unsigned short AmMin;
unsigned char AmStep;
}FREQ;
FREQ code FreqArray[3]={
{
USA_FM_MAXFREQ,
USA_FM_MINFREQ,
10,//100khz
USA_AM_MAXFREQ,
USA_AM_MINFREQ,
10//10khz
},//USA
{
EUROPE_FM_MAXFREQ,
EUROPE_FM_MINFREQ,
5,//50khz
EUROPE_AM_MAXFREQ,
EUROPE_AM_MINFREQ,
9//9khz
},//EUROPE
{
JAPAN_FM_MAXFREQ,
JAPAN_FM_MINFREQ,
10,//100khz
JAPAN_AM_MAXFREQ,
JAPAN_AM_MINFREQ,
9//9khz
}//JAPAN
};
//可供調用的顯示函數:
bit bIsStereo = 1;
bit bIsFm = 1;
bit bIsLocal = 1;
bit bIsUp = 0;
bit bIsAscan = 0;
bit bIsPscan = 0;
bit bPreset = 0;
//頻率變量
unsigned short idata FmFreq = 9710;
unsigned short idata AmFreq = 1280;
unsigned short idata CurrentFreq;
unsigned char idata TunerArea = AREA_USA;
unsigned char idata TunerBand = 1;
//臺號變量--0x00 表示沒有臺號
unsigned char idata FmPresetNo;
unsigned char idata AmPresetNo;
//收音模式變量
unsigned char idata TunerMode = TUNER_MAIN_MODE;
//收音機顯示部分
void FpClearStr()
{
}
void FPOutChar(unsigned char i ,unsigned char j)
{
i=i+j;
}
void FPDisplayIcon(unsigned int i ,unsigned char j)
{
i=i;
j=j;
}
void DisplayTunerCurrentFreq()
{
unsigned char i;
unsigned int uitemp;
FpClearStr();
FPDisplayIcon(FP_INFO_MHZ,0);
FPDisplayIcon(FP_INFO_KHZ,0);
FPDisplayIcon(FP_INFO_DX,0);
FPDisplayIcon(FP_INFO_ST,0);
FPDisplayIcon(FP_INFO_DOT_MIN2,0);
if(bIsFm){
FPDisplayIcon(FP_INFO_MHZ,1);
FPDisplayIcon(FP_INFO_FM,1);
FPDisplayIcon(FP_INFO_KHZ,0);
FPDisplayIcon(FP_INFO_AM,0);
FPDisplayIcon(FP_INFO_DX,bIsLocal);
FPDisplayIcon(FP_INFO_DOT_MIN2,1);
FPOutChar(0,'F');
FPOutChar(1,TunerBand+'0');
if(bPreset){
FPOutChar(2,'-');
if(FmPresetNo<7) FPOutChar(3,FmPresetNo+'0');
else if(FmPresetNo<13) FPOutChar(3,(FmPresetNo-6)+'0');
else FPOutChar(3,(FmPresetNo-12)+'0');
}
uitemp = FmFreq;
i = 9;
}
else{
FPDisplayIcon(FP_INFO_MHZ,0);
FPDisplayIcon(FP_INFO_FM,0);
FPDisplayIcon(FP_INFO_AM,1);
FPDisplayIcon(FP_INFO_KHZ,1);
FPDisplayIcon(FP_INFO_DX,bIsLocal);
FPOutChar(0,'A');
FPOutChar(1,'1');
if(bPreset){
FPOutChar(2,'-');
FPOutChar(3,AmPresetNo+'0');
}
uitemp = AmFreq;
i = 9;
}
ShowLcdHex(0x40,uitemp);
ShowLcdString(0x50,"FREQ");
while(uitemp){
FPOutChar(i,(uitemp%10+'0'));
i--;
uitemp /= 10;
}
}
#ifdef __RDS__
void DisplayCT()
{
}
void DisplayPTY()
{
}
#endif
void RedrawTuner()
{
#ifdef __RDS__
#else
DisplayTunerCurrentFreq();
#endif
}
/*******************************************************************
Tuner functions
*******************************************************************/
unsigned char GetCurrentStep()
{
unsigned char ucstep;
if(bIsFm)
ucstep = FreqArray[TunerArea].FmStep;
else
ucstep = FreqArray[TunerArea].AmStep;
return ucstep;
}
/*******************************************************************
Func: freq+ step , and judge if it is larger than the max freq
argu:
return: 0 not over flow the max freq
1 over flow max freq
and modify the fmfreq and amfreq
*******************************************************************/
unsigned char IsFreqOverFlow()
{
unsigned char result = 0;
if(bIsFm){
if( (FmFreq + FreqArray[TunerArea].FmStep) > FreqArray[TunerArea].FmMax ){
result = 1;
}
}
else{
if( (AmFreq + FreqArray[TunerArea].AmStep) > FreqArray[TunerArea].AmMax ) {
result = 1;
}
}
return result;
}
/*******************************************************************
Func: freq+ step
argu:
return: none
*******************************************************************/
void FreqUp()
{
if(bIsFm){
FmFreq += FreqArray[TunerArea].FmStep;
if(FmFreq > FreqArray[TunerArea].FmMax ) FmFreq = FreqArray[TunerArea].FmMin;
}
else{
AmFreq += FreqArray[TunerArea].AmStep;
if(AmFreq > FreqArray[TunerArea].AmMax ) AmFreq = FreqArray[TunerArea].AmMin;
}
bPreset = 0;
GotoFreq();
DisplayTunerCurrentFreq();
}
/*******************************************************************
Func: calculate the value of pcm
and write the value into ns81_reg[9]
argu: FmFreq,AmFreq
return: none
*******************************************************************/
void FreqDown()
{
if(bIsFm){
FmFreq -= FreqArray[TunerArea].FmStep;
if(FmFreq < FreqArray[TunerArea].FmMin ) FmFreq = FreqArray[TunerArea].FmMax;
}
else{
AmFreq -= FreqArray[TunerArea].AmStep;
if(AmFreq < FreqArray[TunerArea].AmMin ) AmFreq = FreqArray[TunerArea].AmMax;
}
bPreset = 0;
GotoFreq();
DisplayTunerCurrentFreq();
}
/*******************************************************************
Func: stop seek and return to main mode
*******************************************************************/
void ReturntoMainMode()
{
TunerMode = TUNER_MAIN_MODE;
StopSeekStation();
if(bIsAscan )
GotoPreset(FmPresetNo);//return to the first station
else{
GotoFreq();
DisplayTunerCurrentFreq();
}
SetTimerFunc(TIME_1SEC,SAVE_CURRENT_FREQ_KEY);
}
/*******************************************************************
Func: start seek and goto seek mode
*******************************************************************/
void GotoSeekMode()
{
TunerMode = TUNER_SEEK_MODE;
SetTimerFunc(TIME_50MS,SD_KEY);
StartSeekStation();
}
/*******************************************************************
Func: save current freq and band value to eeprom
argu: FmFreq,AmFreq,bIsFm
return: none
*******************************************************************/
void SaveFreq()
{
if(bIsFm){
WriteEepromBytes(ADDR_CURRENT_FMFREQ,(unsigned char *)&FmFreq,2);
CurrentFreq = FmFreq;
}
else{
CurrentFreq = AmFreq;
WriteEepromBytes(ADDR_CURRENT_AMFREQ,(unsigned char *)&AmFreq,2);
}
WriteEepromBytes(ADDR_CURRENT_BAND,&TunerBand,1);
}
/*******************************************************************
Func: recover current freq and band value from eeprom
argu: none
return : FmFreq,AmFreq,bIsFm
*******************************************************************/
void RecoverFreq()
{
unsigned char idata i ;
if( i < 8 ){//write default values to eeprom
TunerBand = 1;
bIsFm = 1;
FmFreq = DEFAULT_FMFREQ ;
AmFreq = DEFAULT_AMFREQ ;
CurrentFreq = FmFreq;
WriteEepromBytes(ADDR_CURRENT_BAND, &TunerBand, 1);
WriteEepromBytes(ADDR_CURRENT_FMFREQ, (unsigned char *)&DEFAULT_FMFREQ, 2);
WriteEepromBytes(ADDR_CURRENT_AMFREQ, (unsigned char *)&DEFAULT_AMFREQ, 2);
for(i=0; i< MAX_FMSTATION_NO ; i++)
{
WriteEepromBytes(ADDR_FMSTATION_START+i*2,(unsigned char *)&DEFAULT_FMFREQ,2);
}
for(i=0; i< MAX_AMSTATION_NO ; i++)
{
WriteEepromBytes(ADDR_AMSTATION_START+i*2,(unsigned char *)&DEFAULT_AMFREQ,2);
}
}
else{
ReadEepromBytes(ADDR_CURRENT_BAND,&TunerBand,1);
if(TunerBand == 4){
bIsFm = 0;
ReadEepromBytes(ADDR_CURRENT_AMFREQ,(unsigned char *)&AmFreq,2);
CurrentFreq = AmFreq;
}
else {
bIsFm = 1;
ReadEepromBytes(ADDR_CURRENT_FMFREQ,(unsigned char *)&FmFreq,2);
CurrentFreq = FmFreq;
}
}
Set_Band();
GotoFreq();
DisplayTunerCurrentFreq();
SetTimerFunc(TIME_1SEC,SAVE_CURRENT_FREQ_KEY);
}
void SavePreset(unsigned char presetno)
{
unsigned int uitemp;
unsigned char address;
if(bIsFm){
if( presetno > MAX_FMSTATION_NO) return;
address = (presetno-1)*2 + ADDR_FMSTATION_START;
uitemp = FmFreq;
}
else{
if( presetno > MAX_AMSTATION_NO) return;
address = (presetno-1)*2 + ADDR_AMSTATION_START;
uitemp = AmFreq;
}
WriteEepromBytes(address,(unsigned char *)&uitemp,2);
bPreset = 1;
}
void GotoPreset(unsigned char presetno)
{
unsigned int uitemp;
unsigned char address;
bPreset = 1;
if(bIsFm){
if( presetno > MAX_FMSTATION_NO) return;
address = (presetno-1)*2 + ADDR_FMSTATION_START;
}
else{
if( presetno > MAX_AMSTATION_NO) return;
address = (presetno-1)*2 + ADDR_AMSTATION_START;
}
ReadEepromBytes(address,(unsigned char *)&uitemp,2);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -