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

📄 tuner.c

📁 nl81,收音头开发资料
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "target.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;
unsigned char code array_version[]=__DATE__;

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
};

#ifdef __RDS__
extern unsigned char RdsText[];
char *ptrname = 0;

unsigned char start_rdsindex=0;
unsigned char pointer_scrollstring;
unsigned char MaxRdslen=0;
static unsigned char displaymode = 0;
extern unsigned char RDS_text;
extern unsigned char RDS_locked;
extern unsigned char RDS_name_changed;
extern unsigned char hour;
extern unsigned char minutes;
extern unsigned char CT_changed;
extern unsigned char PTY;

unsigned char scrollcount = 0;
void DebugRds();
#endif


//可供调用的显示函数:
void TunerOutTextString(unsigned char add,unsigned char *str);
void TunerOutTextChar(unsigned char add,unsigned char ucChar);

bit bIsStereo = 1;
bit bIsFm = 1;
bit bIsLocal = 0;
bit bIsUp = 0;
bit bIsAscan = 0;
bit bIsPscan = 0;
bit bPreset = 0;

//中频测试计数变量
unsigned char countifok = 0;
unsigned char countifc = 0;

//频率变量
unsigned short idata FmFreq = 8980;
unsigned short idata AmFreq = 1287;
unsigned short idata CurrentFreq;
unsigned char idata TunerArea = AREA_EUROPE;
unsigned char idata TunerBand = 1;

//台号变量--0x00 表示没有台号
unsigned char idata FmPresetNo;
unsigned char idata AmPresetNo;

//收音模式变量
unsigned char idata TunerMode = TUNER_MAIN_MODE;

#ifdef __RDS__
//显示模式变量
unsigned char idata TunerDisplayMode;
#endif


//收音机显示部分
void DisplayTunerCurrentFreq()
{
	unsigned char i;
	unsigned int uitemp;
	FPClearLcd();
	if(bIsFm){
		//FPDisplayIcon(FP_INFO_DOT_SECOND,1);
		FPDisplayIcon(FP_INFO_MHZ,1);
		FPDisplayIcon(FP_INFO_LOC,bIsLocal);
		FPDisplayIcon(FP_INFO_ST,bIsStereo);
		
		FPOutChar(0,'F');
		FPOutChar(1,'M');
		FPOutChar(2,TunerBand+'0');

		if(bPreset){
			FPDisplayIcon(FP_INFO_LINE,1);
			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 = 8;
	}
	else{
		FPDisplayIcon(FP_INFO_KHZ,1);
		FPDisplayIcon(FP_INFO_LOC,bIsLocal);
		
		FPOutChar(0,'A');
		FPOutChar(1,'M');

		if(bPreset){
			FPDisplayIcon(FP_INFO_LINE,1);
		 	FPOutChar(3,AmPresetNo+'0');
		}

		uitemp = AmFreq;
		i = 8;
	}

	while(uitemp){
		FPOutChar(i,(uitemp%10+'0'));
		i--;
		uitemp /= 10;
	}
}

#ifdef __RDS__
void DisplayCT()
{
}

void DisplayPTY()
{
}

#endif


void RedrawTuner()
{
#ifdef __RDS__
	switch(TunerDisplayMode){
	case DISPLAY_FREQ_MODE:
		DisplayTunerCurrentFreq();
	break;
	case DISPLAY_NAME_MODE:
		DisplayRdsName();
	break;
	case DISPLAY_PTY_MODE:
		DisplayPTY();
	break;
	case DISPLAY_TEXT_MODE:
		DisplayText();
	break;
	case DISPLAY_CT_MODE:
		DisplayCT();
	break;
	default:
		TunerDisplayMode = DISPLAY_FREQ_MODE;
	break;
	}
#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();
	countifok = 0;
	countifc = 0;
}

/*******************************************************************
	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()
{
#if 1
	unsigned char idata i,uctemp;
	
	for(i=0;i<8;i++)
	{
		ReadEepromBytes(VERSION_EEPROM_ADDR+i,&uctemp,1);
		if(uctemp != array_version[i] ) break;
	}
	if( i < 8 ){//write default values to eeprom 
		TunerBand = 1;
		bIsFm = 1;
		FmFreq = DEFAULT_FMFREQ ;
		AmFreq = DEFAULT_AMFREQ ;
		CurrentFreq = FmFreq;
		WriteEepromBytes(VERSION_EEPROM_ADDR,array_version,8);
		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);	
#endif
}

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;

⌨️ 快捷键说明

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