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

📄 tuner.c

📁 一个带收音的功放程序, VFD显示驱动用一个非常实用的方法, 稍加修改即可换成不同的VFD, 功放芯片用M61538
💻 C
📖 第 1 页 / 共 2 页
字号:
						DeltFMFreq = I2C_GetByte(A24C02, (FM_Start + 0));
						DeltFMFreq = (I2C_GetByte(A24C02, (FM_Start + 1))) << 8 + DeltFMFreq;
						//如果取到的频率大于最大值,那么设置最小值频率为当前频率
						if(DeltFMFreq > FMFREQMAX)
							DeltFMFreq = 0;
						Current_Freq = FMFREQMIN+ DeltFMFreq;						
					}
					else
					{						
						DeltAMFreq = I2C_GetByte(A24C02, (AM_Start + 0));						
						if(DeltAMFreq > AMFREQMAX)
							DeltAMFreq = 0;
						Current_Freq = AMFREQMIN+ DeltAMFreq;
						
					}
					RadioMute(); //radio静音
					RadioFreq(Current_Freq); //设置当前频率
					RadioOpen(); //Raido 打开
					Auto_Scan_Enable = Auto_Scan_Stop;				
					Auto_Is_Reach = 0;
					Wait_Lock_40ms = Wait_Timer_End;
					Scan_Channel = 0;
					Channel_Display = 100;
					Auto_Scan_Start = 0;
				}
			}
		}
	}

	else if(Manual_Scan_Enable != Manual_Scan_End)
	{
		
		if(Manual_Scan_Flag == 0)
		{
			RadioMute();	
			if(Manual_Scan_Enable == Manual_Scan_FF)//前向扫描
				RadioUp();
			else if(Manual_Scan_Enable == Manual_Scan_FB)//后向扫描
				RadioDown();
			RadioFreq(Current_Freq); //设置当前频率
			Frequency_Display();     //显示当前频率
			Wait_Lock_40ms = Wait_Timer_Start;
			Manual_Scan_Flag = 1;
		}
		else 
		{
			Lock_Flag = RadioLock(); //看是否到达中频锁定时间
			if( Lock_Flag != Timer_Not_Reach)
			{
				if(Lock_Flag == TRUE)
				{
					RadioOpen();
					Manual_Scan_Enable = Manual_Scan_End;
				}				
				Manual_Scan_Flag = 0;
					
			}
		}
		
		
		
	}
}
//执行下一曲按键
void Proc_Tuner_NEXT_KEY(void)
{	
	BYTE TEMP1;
	BYTE TEMP2;
	
	Manual_Scan_Enable = Manual_Scan_End;
	Auto_Scan_Enable = Auto_Scan_Stop;

	//如果在FM 模式
	if(FM_AM_Select == FM_MODE)
	{
		//当前频道加加
		if(Scan_Channel == FM_MAX_Channel - 1)
			Scan_Channel = 0;
		else
			Scan_Channel++;
	}
	else
	{
		if(Scan_Channel == AM_MAX_Channel - 1)
			Scan_Channel = 0;
		else
			Scan_Channel++;	
	}
	
	if(FM_AM_Select == FM_MODE)
	{
		//取出台的对应频率
		TEMP1 = FM_Start + (Scan_Channel * 2);
		DeltFMFreq = I2C_GetByte(A24C02, TEMP1);
		TEMP2 = I2C_GetByte(A24C02, TEMP1+1);		
		DeltFMFreq +=  (TEMP2 << 8);
		if(DeltFMFreq > FMFREQMAX)
			DeltFMFreq = 0;
		Current_Freq = FMFREQMIN+ DeltFMFreq;
	}
	else
	{
		DeltAMFreq = I2C_GetByte(A24C02, (AM_Start + Scan_Channel));
		if(DeltAMFreq > AMFREQMAX)
			DeltAMFreq = 0;
		Current_Freq = AMFREQMIN+ DeltAMFreq;
	}
	//设置当前频率
	RadioMute();
	RadioFreq(Current_Freq);
	RadioOpen();	
	TO_MAIN_DISPLAY = 0;
	Channel_Display = 100;//这个值用来显示台号后再显示频率的时间差
}


//执行上一曲频率
void Proc_Tuner_PREV_KEY(void)
{

	Manual_Scan_Enable = Manual_Scan_End;
	Auto_Scan_Enable = Auto_Scan_Stop;

	if(FM_AM_Select == FM_MODE)
	{
		if(Scan_Channel == 0)
			Scan_Channel = FM_MAX_Channel - 1;
		else
			Scan_Channel--;
	}
	else
	{
		
		if(Scan_Channel == 0)
			Scan_Channel = AM_MAX_Channel - 1;
		else
			Scan_Channel--;
	}
	
	if(FM_AM_Select == FM_MODE)
	{
		DeltFMFreq = I2C_GetByte(A24C02, (FM_Start + (Scan_Channel * 2) + 1));
		DeltFMFreq <<= 8;
		DeltFMFreq +=  I2C_GetByte(A24C02, (FM_Start + (Scan_Channel * 2)) );
		if(DeltFMFreq > FMFREQMAX)
			DeltFMFreq = 0;
		Current_Freq = FMFREQMIN+ DeltFMFreq;
	}
	else
	{
		DeltAMFreq = I2C_GetByte(A24C02, (AM_Start + Scan_Channel));
		if(DeltAMFreq > AMFREQMAX)
			DeltAMFreq = 0;
		Current_Freq = AMFREQMIN+ DeltAMFreq;
	}
	RadioMute();
	RadioFreq(Current_Freq);
	RadioOpen();	
	TO_MAIN_DISPLAY = 0;
	Channel_Display = 100;
}

//整机上电初始化Tuner, 进入FM模式, 
void    Tuner_Open(void)
{		
	Scan_Channel = 0;
	DeltFMFreq = I2C_GetByte(A24C02, (FM_Start + 0));
	DeltFMFreq += (WORD)( I2C_GetByte(A24C02, (FM_Start +  1)) << 8);
	if(DeltFMFreq > FMFREQMAX)
		DeltFMFreq = 0;	
	Current_Freq = FMFREQMIN+ DeltFMFreq;
	RadioMute();
	RadioFreq(Current_Freq);
	RadioOpen();
}


//从其他通道输入模式转换到tuner输入模式
void    Change_Tuner_Mode(void)
{		
	if(FM_AM_Select == FM_MODE)//如果在FM MODE
	{				
		Current_Freq = FMFREQMIN+ DeltFMFreq;//设置FM的工作频率		
	}
	else
	{		
		Current_Freq = AMFREQMIN+ DeltAMFreq;//设置AM的工作频率	
	}	
	RadioMute();              //中频静音
	RadioFreq(Current_Freq);  //设置当前频率
	RadioOpen();              //打开收音	
}

//tuner单步调整
void    Tuner_Step(BYTE Direct)
{		
	if(Direct == 0)
		RadioDown();//频率减一步
    else
		RadioUp(); //频率加一步
	RadioMute();  //中频静音
	RadioFreq(Current_Freq);//设置当前频率
	RadioOpen();	
}

//执行到快进到下一个可以锁定的频率
void 	Proc_Tuner_FF_KEY(void)
{
	 Auto_Scan_Enable   = 0; //自动扫描禁止
	 Manual_Scan_Enable = 1; //手动扫描打开,并设置向后(频率加)方向	
}

//执行快退到上一个可以锁定的频率
void 	Proc_Tuner_FB_KEY(void)
{
	 Auto_Scan_Enable   = 0; //自动扫描禁止
	 Manual_Scan_Enable = -1;//手动扫描打开,并设置向前(频率减)方向		
}


//执行自动扫描台的频率
void 	Proc_Tuner_AUTOSCAN_KEY(void)
{
	 Auto_Scan_Enable   = 1;//执行自动扫描功能
	 Manual_Scan_Enable = 0;//手动扫描禁止
	 Auto_Scan_Start = 0;   //将第一次扫描标志置位
}

// FM/AM之间的切换
void    Proc_FMAM_Change(void)
{	
	Scan_Channel = 0;
	if(FM_AM_Select == FM_MODE)
	{		
		Current_Freq = AMFREQMIN+ DeltAMFreq;
		FM_AM_Select = AM_MODE;
	}
	else
	{		
		Current_Freq = FMFREQMIN+ DeltFMFreq;
		FM_AM_Select = FM_MODE;
	}
	//假如切换前另外一个模式正在自动/手动扫描,可以停止
	Auto_Scan_Enable   = 0;
	Manual_Scan_Enable = 0;
	Auto_Scan_Start = 0;
	
	RadioMute();
	RadioFreq(Current_Freq);
	RadioOpen();	
}

//从静音状态恢复到收音状态时, FM/AM的显示要加上部分特殊ICON
void    Tuner_MuteOFF_Display(void)
{	
	if(FM_AM_Select == FM_MODE)
	{		
		VFD_ICON_Display(ICON_FM | ICON_MHZ);
	}
	else
	{		
		VFD_ICON_Display(ICON_AM | ICON_KHZ);
	}
	
}
//执行TUNER存储
void Proc_Digital_Key(void)
{

	//如果前面已经按下了MEMORY_KEY,
	if((Memory_Start == 1) && (NumberKey_Dealed == 0))
	{
	 	if(Current_Key < KEY_5PLUS) //如果按下的按键是KEY_0, KEY_1,KEY_2,KEY_3,KEY_4
	 	{
			Digital_Number += Current_Key;//记忆数字键	
			NumberKey_Dealed = 1;
		}		
		else if(Current_Key == KEY_5PLUS) //如果按下的按键是KEY_5PLUS
			Digital_Number += 5;
		
		//判断输入的数字是否大于台号的最大值
		if( ((Digital_Number > FM_MAX_Channel) && (FM_AM_Select == FM_MODE))
			 || ((Digital_Number > AM_MAX_Channel) && (FM_AM_Select == AM_MODE))
			 || (Digital_Number == 0) )//如果数字台号为零,也为非法值
		{

			Digital_Number = 0;  //如果大于, 返回
			Memory_Start = 0;
			TO_MAIN_DISPLAY = 50;
			return;
		}					
		TO_MAIN_DISPLAY = 400;
		
	}
}

/*=====================  MEMORY_KEY的功能 ===============*/
void 	Proc_MEMORY_Key(void)
{

	 if(Memory_Start == 0)
	 {
	  	 String_Display[0] = 'M';
		 String_Display[1] = 'E';
		 String_Display[2] = 'M';
		 String_Display[3] = '0';
		 String_Display[4] = '0';
		 VFD_Display(String_Display, 5, 0, 0);	
		 if(FM_AM_Select == FM_MODE)
		 {		
			 VFD_ICON_Display(ICON_FM);
		 }
		 else
		 {		
			 VFD_ICON_Display(ICON_AM);
		 }				 
		 Memory_Start = 1; //存贮标志
		 NumberKey_Dealed = 0;
		 TO_MAIN_DISPLAY = 400;
		 Digital_Number = 0;
	}
	else
	{
	 	if(Digital_Number > 0)
	 	{
		 	if(FM_AM_Select == FM_MODE)
			{							
				I2C_PutByte(A24C02, (Digital_Number-1)* 2 + FM_Start, DeltFMFreq & 0xFF );
				DelayX1ms(2);					
				I2C_PutByte(A24C02, (Digital_Number-1)* 2 + FM_Start + 1, (BYTE) ((DeltFMFreq & 0xFF00) >> 8)  );
			}
			else
			{
				I2C_PutByte(A24C02, (AM_Start + Digital_Number - 1), (BYTE)(DeltAMFreq & 0xFF) );	
			}
		}
		Memory_Start = 0;		
		NumberKey_Dealed = 0;
		String_Display[3] = (Digital_Number / 10) + '0';
		String_Display[4] = (Digital_Number % 10) + '0';
		TO_MAIN_DISPLAY = 80;
		Digital_Number = 0;
		VFD_Display(String_Display, 5, 0, 0);	
	}													
}

/*=======================  各频率通道的频率初始值设定  =================*/
//十个字节对应的频率是87.5M, 90M, 98M, 106M, 108MHZ
code BYTE FM_Default_Freq[] = {0,0, 50,0, 210,0, 0x72,0x1, 0x9A,0x1};

//对应的频率是530K, 600K, 1000K, 1400K, 1710KHZ
code BYTE AM_Default_Freq[] = {0, 14, 94, 174, 236};

/*=======================  各频率通道的频率初始值设定  =================*/
//用于在初始化EEPROM, 该函数在POWER_ON的时候调用, 用来对FM和AM的存储频率
//初始化, 在产品出货前,工程也可以通过一些定义的按键顺序来初始化,
/*=======================  各频率通道的频率初始值设定  =================*/
void Tuner_Channel_Init(void)
{
	BYTE EEPROML;
	BYTE EEPROMH;
	//先读出AT24C02的地址Channel_Test(0x20,0x21)的值, 
	//如果分别等于0x55和0xAA,那么认为无需要初始化
	EEPROML = I2C_GetByte( A24C02, Channel_Test );
	EEPROMH = I2C_GetByte( A24C02, Channel_Test + 1);
	if((EEPROML == 0x55) && (EEPROMH == 0xAA))
		return;

	//FM 模式, 先写入87.5M, 90M, 98M, 106M, 108MHZ的频率
	for(EEPROML = 0; EEPROML < 10; EEPROML++)
	{
		I2C_PutByte(A24C02, (FM_Start + EEPROML), FM_Default_Freq[EEPROML]);
		DelayX1ms(2);
	}
	//剩下的(FM_MAX_Channel -5)的空间内都写入87.5MHZ,即偏差都为0
	for(EEPROML = 10; EEPROML < (FM_MAX_Channel * 2); EEPROML ++)
	{
		I2C_PutByte(A24C02, (FM_Start + EEPROML), 0);
		DelayX1ms(2);
	}
	
	//AM 模式,先写入530K, 600K, 1000K, 1400K, 1710Khz的频率
	for(EEPROML = 0; EEPROML < 5; EEPROML ++)
	{
		I2C_PutByte(A24C02, (AM_Start + EEPROML), AM_Default_Freq[EEPROML]);
		DelayX1ms(2);
	}
	//在剩余(AM_MAX_Channel - 5)个的空间内写入530K,即偏差为0的频率
	for(EEPROML = 5; EEPROML < AM_MAX_Channel; EEPROML ++)
	{
		I2C_PutByte(A24C02, (AM_Start + EEPROML), 0);
		DelayX1ms(2);
	}

	//写标志为,证明EEPROM已经初始化
	I2C_PutByte(A24C02, Channel_Test, 0x55);
	DelayX1ms(2);
	I2C_PutByte(A24C02, Channel_Test + 1, 0xAA);
}

⌨️ 快捷键说明

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