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

📄 lc72131.c

📁 C51的基于KST-CD111LVD-100 car tuner Driver PLL LC72131 & LA1787 的数字调谐系统
💻 C
📖 第 1 页 / 共 3 页
字号:
/********************************************************************/
/*                          */
/*      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 + -