📄 lc72131.c
字号:
/********************************************************************/
/* */
/* Copyright (c) 2003 DuirkWang SHENZHEN */
/* */
/* File:Tuner.c */
/* =========== */
/* Descripton: KST-CD111LVD-100 car tuner Driver */
/* PLL LC72131 & LA1787 */
/* */
/********************************************************************/
#include "Reg52.h"
#include "Config.h"
#include "Global.h"
#include "OSD_String.h"
#include "OSD.h"
Uint8 xdata TenKeyCnt = 0;
Uint8 xdata MemoryCnt = 0;
#ifdef KST_TUNER
#include "IOPort.h"
#include "tools.h"
#include "Extern.h"
#include "I2C.h"
#include "Tuner.h"
#include "AVSwitch.h"
#include "EEPROM.h"
#include "Uicc_def.h"
#include "menu.h"
#include "clock.h"
#include "Sanyoccb.h"
#include "command.h"
#include "Audio.h"
#include "Ir.h"
#include "Event.h"
#include "Ir_lut.h"
#include "mcutoess.h"
#include "Cdc.h"
Uint16 idata FMfreq = FMFREQ_MIN;
Uint16 idata AMfreq = AMFREQ_MIN;
Uint8 idata AutoSearchStep = 0;
//Uint8 idata IFDetectCount = 0;
Uint8 idata IFRepeatDetect = 0;
Uint8 idata CurrentBand = FM_BAND;
BIT bMonoStereo = STEREO;
BIT bLocDx = DX;
BIT bAutoSearchOK = TRUE;
BIT bPrevNextSearchFlag = FALSE;
BIT bSearchDir = FALSE;
Uint8 xdata ChannelNum = 1;
Uint32 RadioIn1Data = 0;
Uint32 RadioIn2Data = 0;
Uint32 RadioOutData = 0;
//Uint16 idata Count_delay_timer = 0;
Uint8 xdata picture_state = 0;
BIT tuner_repeat_key_flag = 0;
/*******************************************************
LC72131
1 0
BO4 FM AM
IO2 UNMUTE MUTE
BO3 ST MO
IO1 DX LO
********************************************************/
void Change_freq_value(Uint8 CurrentBand, BIT bSearchDir)
{
switch(CurrentBand)
{
case AM_BAND:
if(bSearchDir)
{
AMfreq += 9 ;
if(AMfreq > AMFREQ_MAX)
{
bAutoSearchOK = 1;//zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Osd_display_string(
OSD_ROW_7, OSD_COLUMN_18, TV_SEARCH,
OSD_STANDARD, OSD_BLUE, OSD_BLACK, BACKGROUND_OFF,
CLEAR_STRING
);
if(bPrevNextSearchFlag)
{
AMfreq = AMFREQ_MIN;
bPrevNextSearchFlag = 0;
}
else
{
ChannelNum = 1;
Eeprom_write_ch_band();
Eeprom_read_freq();
Tuner_DisplayChannel(ChannelNum);
}
Direct_select();
Tuner_display_freq();
if(!b_Mute)
up_volume_flag = 1;
}
}
else
{
AMfreq -= 9 ;
if(AMfreq < AMFREQ_MIN)
{
bAutoSearchOK = 1;//zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Osd_display_string(
OSD_ROW_7, OSD_COLUMN_18, TV_SEARCH,
OSD_STANDARD, OSD_BLUE, OSD_BLACK, BACKGROUND_OFF,
CLEAR_STRING
);
if(bPrevNextSearchFlag)
{
AMfreq = AMFREQ_MAX;
bPrevNextSearchFlag = 0;
}
else
{
ChannelNum = 1;
Eeprom_write_ch_band();
Eeprom_read_freq();
Tuner_DisplayChannel(ChannelNum);
}
Direct_select();
Tuner_display_freq();
if(!b_Mute)
up_volume_flag = 1;
}
}
RadioIn1Data = (RadioIn1Data & 0xff0000) |(((AMfreq + 10710) / 9) << 4 );
break;
default:
if(bSearchDir)
{
FMfreq += 5;
if(FMfreq > FMFREQ_MAX)
{
bAutoSearchOK = 1;//zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Osd_display_string(
OSD_ROW_7, OSD_COLUMN_18, TV_SEARCH,
OSD_STANDARD, OSD_BLUE, OSD_BLACK, BACKGROUND_OFF,
CLEAR_STRING
);
if(bPrevNextSearchFlag)
{
FMfreq = FMFREQ_MIN;
}
else
{
ChannelNum = 1;
Eeprom_write_ch_band();
Eeprom_read_freq();
Tuner_DisplayChannel(ChannelNum);
}
Direct_select();
Tuner_display_freq();
Unmute_bo2port();
if(!b_Mute)
up_volume_flag = 1;
}
}
else
{
FMfreq -= 5;
if(FMfreq < FMFREQ_MIN)
{
bAutoSearchOK = 1;//zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Osd_display_string(
OSD_ROW_7, OSD_COLUMN_18, TV_SEARCH,
OSD_STANDARD, OSD_BLUE, OSD_BLACK, BACKGROUND_OFF,
CLEAR_STRING
);
if(bPrevNextSearchFlag)
{
FMfreq = FMFREQ_MAX;
}
else
{
ChannelNum = 1;
Eeprom_write_ch_band();
Eeprom_read_freq();
Tuner_DisplayChannel(ChannelNum);
}
Direct_select();
Tuner_display_freq();
if(!b_Mute)
up_volume_flag = 1;
}
}
RadioIn1Data = (RadioIn1Data & 0xff0000) |((FMfreq+1070) / 5);
break;
}
}
BIT Tuner_IFok(void)
{
BIT bIFOK;
bIFOK = 0;
switch(CurrentBand)
{
case AM_BAND:
if(RADIO_SD_HIGH && (IFRepeatDetect < IF_REPEAT_DETECT))
if( ((RadioOutData & 0xfffff) < (AM_IFFREQ + AM_IFFREQ_MARGIN)) &&
((RadioOutData & 0xfffff) > (AM_IFFREQ - AM_IFFREQ_MARGIN)))
{
bIFOK = 1;
IFRepeatDetect = 0;
break;
}
IFRepeatDetect++;
if(IFRepeatDetect == IF_REPEAT_DETECT)
IFRepeatDetect = 0;
else
Change_freq_value(CurrentBand, !bSearchDir); /*plus or minus freq*/
break;
default:
if(FMfreq % 10)
break;
if(RADIO_SD_HIGH && (IFRepeatDetect < IF_REPEAT_DETECT))
if( ((RadioOutData & 0xfffff) < (FM_IFFREQ + FM_IFFREQ_MARGIN)) &&
((RadioOutData & 0xfffff) > (FM_IFFREQ - FM_IFFREQ_MARGIN)))
{
bIFOK = 1;
IFRepeatDetect = 0;
break;
}
IFRepeatDetect++;
if(IFRepeatDetect == IF_REPEAT_DETECT)
{
IFRepeatDetect = 0;
}
else
{
Change_freq_value(CurrentBand, !bSearchDir); /*plus or minus freq*/
}
break;
}
if(!IFRepeatDetect)
{
Tuner_display_freq();
}
return bIFOK;
}
void Tuner_stereo_ind()
{
if(RADIO_SD_LOW)
Osd_display_string(ST_MO_ROW, ST_MO_COL, STEREO_IND, OSD_STANDARD,
NO_SHADE, OSD_YELLOW, BACKGROUND_OFF, DISPLAY_STRING);
else
Osd_display_string(ST_MO_ROW, ST_MO_COL, STEREO_IND, OSD_STANDARD,
NO_SHADE, OSD_YELLOW, BACKGROUND_OFF, CLEAR_STRING);
}
void Tuner_autosearch(void)
{
if(bAutoSearchOK)
return;
switch(AutoSearchStep)
{
case AUTOSRCH_STEP0:
RadioIn2Data &= ~RADIO_IN2_RESET;
RadioIn2Data |= BO3_ST ;
RadioIn2Data |= RADIO_IN2_DOC;
RadioIn2Data &= ~IO2_UNMUTE;
Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
RadioIn1Data &= ~RADIO_IN1_CTE; /* set cte = 0, reset counter*/
Change_freq_value(CurrentBand, bSearchDir);
Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);
RadioIn1Data |= RADIO_IN1_CTE;
Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);
AutoSearchStep ++;
//IFDetectCount = 0xff;
break;
case AUTOSRCH_STEP1: /*check DO is low?*/
//if(Count_delay_timer)
// {
// Count_delay_timer--;
// break;
// }
if (RADIO_DATA_HIGH /*&& IFDetectCount*/)
{
//IFDetectCount--;
break; /*IF counter end*/
}
if (0/*RADIO_DATA_HIGH*/) /*reset lc72131*/
{
RadioIn2Data |= RADIO_IN2_RESET;
Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
AutoSearchStep = AUTOSRCH_STEP0;
break;
}
AutoSearchStep ++;
case AUTOSRCH_STEP2: /*/check UL and read data from LC72131*/
RadioOutData = Read_data_from_ccb(LC72131_OUT_ADDR, 24);
RadioOutData = Read_data_from_ccb(LC72131_OUT_ADDR, 24);
if(((RadioOutData & RADIO_OUT_LOCK) != RADIO_OUT_LOCK))
break;
AutoSearchStep = AUTOSRCH_STEP0;
//Read_lc72131(); /*locked*/
if(Tuner_IFok())
{
Eeprom_write_freq();
if(bPrevNextSearchFlag)
{
bAutoSearchOK = 1; //zzzzzzzzzzzzzzzzzzzzzzzzz
Osd_display_string(
OSD_ROW_7, OSD_COLUMN_18, TV_SEARCH,
OSD_STANDARD, OSD_BLUE, OSD_BLACK,
BACKGROUND_OFF, CLEAR_STRING
);
bPrevNextSearchFlag = 0;
Direct_select();
if(!b_Mute)
up_volume_flag = 1;
}
else
{
if(bSearchDir)
{
ChannelNum++;
if(ChannelNum > MAX_CHANNEL_NUM)
ChannelNum = MIN_CHANNEL_NUM;
}
else
{
ChannelNum--;
if(ChannelNum == 0)
ChannelNum = MAX_CHANNEL_NUM;
}
Tuner_DisplayChannel(ChannelNum);
}
}
break;
}
}
void mute_bo2port(void)
{
RadioIn2Data = (RadioIn2Data & ~IO2_UNMUTE) & ~RADIO_IN2_DOC ;
Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
}
void Unmute_bo2port(void)
{
RadioIn2Data = (RadioIn2Data | IO2_UNMUTE) & ~RADIO_IN2_DOC ;
Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
}
void Init_lc72131()
{
switch(CurrentBand)
{
case AM_BAND:
RadioIn1Data = IN1_AM_INIT | (((AMfreq + 10710) / 9) << 4 );
RadioIn2Data = IN2_DATA_INIT | IO2_UNMUTE | IO1_DX ;
break;
default:
RadioIn1Data = IN1_FM_INIT | (FMfreq + 1070) /5;
RadioIn2Data = IN2_DATA_INIT | IO2_UNMUTE | IO1_DX |SELECT_FM |BO3_ST;
break;
}
Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);
Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
Unmute_bo2port();
}
void Tuner_handsearch(Uint8 bSearchDir)
{
mute_bo2port();
Change_freq_value(CurrentBand, bSearchDir);/////////////////////////////////////////////////
Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);
Unmute_bo2port();
}
fffffffffffff
void Direct_select()
{
if(CurrentBand == AM_BAND)
{
if((AMfreq >1620) || (AMfreq < 522))
AMfreq = 522;
RadioIn1Data = (RadioIn1Data & 0xff0000) |(((AMfreq + 10710) / 9) << 4 );
}
else
{
if((FMfreq >10800) || (FMfreq < 8700))
FMfreq = 8700;
RadioIn1Data = (RadioIn1Data & 0xff0000) |((FMfreq+1070) / 5);
}
Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);
Unmute_bo2port();
}
void Tuner_display_freq()
{
Uint16 idata temp[10];
if(CurrentBand == FM_BAND)
{
if(FMfreq > 9999)
temp[0] = FMfreq / 10000 + '0';
else
temp[0] = '0';//OSD_FONT_BLANK;
temp[1] = (FMfreq % 10000) / 1000 + '0';
temp[2] = (FMfreq % 1000) / 100+ '0';
temp[3] ='.';
temp[4] = (FMfreq % 100) / 10 + '0';
temp[5] = FMfreq % 10 + '0';
temp[6] = 'M';
temp[7] = 'H';
temp[8] = 'z';
temp[9] = 0xff;
}
else
{
temp[0] = '0';//OSD_FONT_BLANK;
temp[1] = '0';//OSD_FONT_BLANK;
if(AMfreq > 999)
temp[2] = AMfreq / 1000 + '0';
else
temp[2] = '0';//OSD_FONT_BLANK;
temp[3] = (AMfreq % 1000) / 100 + '0';
temp[4] = (AMfreq % 100) / 10 + '0';
temp[5] = (AMfreq % 10) + '0';
temp[6] = 'K';
temp[7] = 'H';
temp[8] = 'z';
temp[9] = 0xff;
}
Osd_display_string(FREQUENCY_ROW+5, 6, temp, OSD_STANDARD,
NO_SHADE, OSD_WHITE, BACKGROUND_OFF, DISPLAY_STRING);
}
void Process_mono_stereo()
{
if(bMonoStereo)
{
RadioIn2Data |= BO3_ST;
bMonoStereo = STEREO;
}
else
{
RadioIn2Data &= ~BO3_ST;
bMonoStereo = MONO;
}
Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
}
void Process_loc_dx()
{
if(bLocDx)
{
RadioIn2Data &= ~IO1_DX;
bLocDx = LOC;
}
else
{
RadioIn2Data |= IO1_DX;
bLocDx = DX;
}
Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
LOC_DX_set();
}
void Eeprom_read_freq(void)
{
I2C_buffer[0] = 0;
I2C_buffer[1] = 0;
if(CurrentBand)
{
I2C_read_sub(EEPROM_ADDR, ((ChannelNum - 1) * 2 + AM_START_ADDR),
I2C_buffer, 2);
AMfreq = (Uint16)I2C_buffer[0] <<8 | I2C_buffer[1];
}
else
{
I2C_read_sub(EEPROM_ADDR, ((ChannelNum - 1) * 2 + FM_START_ADDR),
I2C_buffer, 2);
FMfreq = (Uint16)I2C_buffer[0] <<8 |I2C_buffer[1];
}
delay_ms(5);
}
void Eeprom_write_freq(void) /*write channel freqency*/
{
if(CurrentBand)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -