📄 tuner.c
字号:
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 + -