📄 tuner.h
字号:
//Use SANYO LC72130 PLL Frequency Synthesizer
#define IN1_CMD 0x28
#define IN2_CMD 0x29
#define READ_CMD 0x2a
#define AMreq_DIVIDER 3 //9
#define FMreq_DIVIDER 5
#define AMreq_STEP 9
#define FMreq_STEP 5
#define FMIN 0x02 //;bit1,bit0
#define AMINL 0x00
#define AMINH 0x01
#define COUNTER_START 0x04 // ;bit 2
#define COUNTER_RESET 0x00
#define CRYSTAL_72MHZ 0x08 //;BIT 3
#define CRYSTAL_45MHZ 0x00
#define Rfreq_100KHZ 0x00 //;bit7,bit6,bit5,bit4
#define Rfreq_050KHZ 0x10
#define Rfreq_025KHZ 0x20
#define Rfreq_010KHZ 0x80
#define Rfreq_009KHZ 0x90
#define Rfreq_005KHZ 0xa0
#define Rfreq_001KHZ 0xb0
#define Rfreq_003KHZ 0xc0
#define Rfreq_015KHZ 0xd0
#define POWER_AM 0X00 //BIT 7
#define POWER_FM 0X80 //BIT 7
#define BO5_STEREO 0x00
#define BO5_MONO 0x01
#define DOC_MODE0 0x00 //bit3.bit2,bit1
#define DOC_MODE1 0x02 //low when the unlock staten is detected
#define DOC_MODE2 0x04 //end UC
#define PHASE_ERR_WIDTH0 0x10 //bit 5,bit 4
#define PHASE_ERR_WIDTH1 0x20
#define PHASE_ERR_WIDTH2 0x30
#define IF_COUNTER_PERIOD0 0x00 // 4MS //BIT 1,BIT 0
#define IF_COUNTER_PERIOD1 0x01 //8MS
#define IF_COUNTER_PERIOD2 0x02 //32MS
#define IF_COUNTER_PERIOD3 0x03 //64MS
#define INPUT_SENSITIVE_MODE 0x10 //BIT 4
#define AMreq_MIN 531
#define AMreq_MAX 1602
#define FMreq_MIN 8750
#define FMreq_MAX 10800
#define FM_BAND 0 //0
#define AM_BAND 1 //1
#define CH_DOWN 0 //0
#define CH_UP 1 //1
#define AUTOSRCH_STEP1 0
#define AUTOSRCH_STEP2 1
#define AUTOSRCH_STEP3 2
#define AUTOSRCH_STEP4 3
#define DWORD unsigned long
//unsigned char lc_cmd;
sbit RADIO_DOUT = P1^0;
sbit RADIO_CLK = P1^1;
sbit RADIO_DIN = P1^2;
sbit RADIO_STB = P1^3;
unsigned char lc_dataout[3];
unsigned char In2_Cdata[3];// = {0,0,0};
unsigned int In1_Pdata;
unsigned char In1_Cdata;
unsigned int AMfreq = 0;
unsigned int FMfreq = 9710;
unsigned char autosrch_step;
unsigned char wait_station_200ms = 0;
unsigned char radio_station_count =0;
unsigned long Ifcount;
bit amfm_flag,radio_station_changed,auto_srch_ok =1;
bit is_search_all_station=0,is_searching_all_station=0;
//bit radio_is_muted;
bit auto_manu;
bit dvd_radio;
bit srch_dir;
unsigned char station_num;
//extern unsigned int radio_stations[25];
void delay(int i)
{
int j;
for(j=0;j<i;j++);
}
void send_byte_to_lc72130(char data1)
{
char i;
for( i=0; i<8; i++)
{
RADIO_CLK = 0;
_nop_();
RADIO_DIN = data1 & 0x01;
_nop_();
RADIO_CLK = 1;
data1 >>= 1;
_nop_();
}
RADIO_CLK = 0; //johnson
}
void send_cmd_to_lc72130(unsigned char cmd,unsigned char para1,unsigned char para2,unsigned char para3)
{
RADIO_STB = 0;
send_byte_to_lc72130(cmd);
RADIO_STB = 1;
send_byte_to_lc72130(para1);
send_byte_to_lc72130(para2);
send_byte_to_lc72130(para3);
RADIO_STB = 0;
}
void mute_radio(unsigned char mute)
{
if(mute)
{
In2_Cdata[0] &= 0xdf;
// radio_is_muted = 1;
// printf("Radio out is mute\n");
}
else
{
In2_Cdata[0] |= 0x20;
// radio_is_muted = 0;
// printf("Radio out is unmute\n");
}
send_cmd_to_lc72130(IN2_CMD,In2_Cdata[0],In2_Cdata[1],In2_Cdata[2]);
}
void read_data_from_lc72130()
{
unsigned char i,j,value;
RADIO_STB = 0;
send_byte_to_lc72130(READ_CMD);
RADIO_STB = 1;
lc_dataout[0] = 0;
lc_dataout[1] = 0;
lc_dataout[2] = 0;
for(j=0;j<3;j++)
{
value = 0;
for(i=0;i<8;i++)
{
RADIO_CLK =0;
_nop_();
RADIO_CLK =1;
_nop_();
RADIO_DOUT =1;
if(RADIO_DOUT) value |= 0x01;
if(i != 7) value <<= 1;
}
lc_dataout[j] = value;
}
RADIO_STB = 0;
}
void switch_audio_channel(unsigned char stereo_out)
{
if(stereo_out)
{
In2_Cdata[1] &= 0xfe;
}
else
{
In2_Cdata[1] |= BO5_MONO;
}
send_cmd_to_lc72130(IN2_CMD,In2_Cdata[0],In2_Cdata[1],In2_Cdata[2]);
}
void switch_fmam(unsigned char am_flag)
{
// unsigned char i;
// radio_is_muted = 1;
if(!is_search_all_station)
station_num = 0;
// printf("Radio out is mute\n");
if(am_flag)
{
// if((AMfreq < 531)||(AMfreq > 1602))
if((AMfreq < AMreq_MIN)||(AMfreq > AMreq_MAX))
AMfreq = AMreq_MIN;//AMreq_MIN =531; AMreq_MAX =1602
// AMfreq = 1287;//AMreq_MIN =531; AMreq_MAX =1602 //for test 1287
// if(!is_search_all_station)
// {
// for(i=0;i<25;i++) //MAX_RADIO_STATION
// {
// if(AMfreq == radio_stations[i])
// station_num = i+1;
// }
// }
In1_Cdata =Rfreq_003KHZ | AMINL | COUNTER_RESET | CRYSTAL_45MHZ; // Rfreq_009KHZ
In1_Pdata =((AMfreq+450)/AMreq_DIVIDER)<< 4;
In2_Cdata[0] = 0x10; //select AM and mute OUT
In2_Cdata[1] = PHASE_ERR_WIDTH0 | DOC_MODE2 | BO5_MONO; //end-UC
In2_Cdata[2] = 0x11; //8ms
}
else
{
// if((FMfreq < 8750)||(FMfreq > 10800))
if((FMfreq < FMreq_MIN)||(FMfreq > FMreq_MAX))
FMfreq = FMreq_MIN; //8750; //FMreq_MIN = 8750; FMreq_MAX = 10800;
// if(!is_search_all_station)
// {
// for(i=0;i<25;i++)
// {
// if(FMfreq == radio_stations[i])
// station_num = i+1;
// }
// }
In1_Cdata = Rfreq_025KHZ | FMIN | COUNTER_RESET | CRYSTAL_45MHZ;
In1_Pdata = (FMfreq+1070)/FMreq_DIVIDER;
In2_Cdata[0] = 0x80; //select FM and mute OUT, BO4 -> POWER FM/AM
In2_Cdata[1] = PHASE_ERR_WIDTH0 | DOC_MODE2 | BO5_MONO; //end-UC
In2_Cdata[2] = 0x12; //32ms
}
send_cmd_to_lc72130(IN1_CMD,(unsigned char) (In1_Pdata),(unsigned char)(In1_Pdata >> 8),In1_Cdata);
send_cmd_to_lc72130(IN2_CMD,In2_Cdata[0],In2_Cdata[1],In2_Cdata[2]);
}
void change_freq_value(unsigned char bband,unsigned char bsearchdir)
{
if(bband == AM_BAND)
{
if(bsearchdir)
{
AMfreq +=AMreq_STEP ;
if(is_search_all_station)
{
if(AMfreq >=AMreq_MAX)
{
is_search_all_station = 0;
auto_srch_ok = 1;
// radio_station_count = 0;
}
}
if(AMfreq> AMreq_MAX) AMfreq = AMreq_MIN;
}
else
{
AMfreq -=AMreq_STEP ;
if(AMfreq<AMreq_MIN) AMfreq = AMreq_MAX;
}
In1_Pdata =((AMfreq+450)/AMreq_DIVIDER)<< 4;
}
else
{
if(bsearchdir) //++
{
FMfreq +=FMreq_STEP;
if(is_search_all_station)
{
if(FMfreq >=FMreq_MAX)
{
is_search_all_station = 0;
auto_srch_ok = 1;
// radio_station_count = 0;
}
}
if(FMfreq>FMreq_MAX) FMfreq = FMreq_MIN;
}
else
{
FMfreq -=FMreq_STEP;
if(FMfreq<FMreq_MIN) FMfreq = FMreq_MAX;
}
In1_Pdata = (FMfreq+1070)/FMreq_DIVIDER;
}
}
void tuner_handsearch(unsigned char bband ,unsigned char bsearchdir)
{
change_freq_value(bband,bsearchdir);
send_cmd_to_lc72130(IN1_CMD,(unsigned char) (In1_Pdata),(unsigned char)((In1_Pdata) >> 8),In1_Cdata);
// send_cmd_to_lc72130(IN2_CMD,In2_Cdata[0],In2_Cdata[1],In2_Cdata[2]);
delay(300);
mute_radio(0);
}
void tuner_autosearch(unsigned char searchdir)
{
if(is_searching_all_station==0)
return;
// if(is_search_all_station==0)
// return;
/*
if(auto_srch_ok && !is_search_all_station)
{
if(is_searching_all_station)
{
is_searching_all_station = 0;
if(amfm_flag)
{
// AMfreq = radio_stations[0];
AMfreq = AMreq_MIN;
In1_Pdata =((AMfreq+450)/AMreq_DIVIDER)<< 4;
}
else
{
// FMfreq = radio_stations[0];
FMfreq = FMreq_MIN;
In1_Pdata = (FMfreq+1070)/FMreq_DIVIDER;
}
In1_Cdata &= 0xfb ; //set cte = 0
send_cmd_to_lc72130(IN1_CMD,(unsigned char) (In1_Pdata),(unsigned char)((In1_Pdata) >> 8),In1_Cdata);
mute_radio(0);
station_num = 1;
}
return;
}
*/
switch(autosrch_step)
{
case AUTOSRCH_STEP1:
switch_fmam(amfm_flag);
// station_num = 0;
autosrch_step ++;
break;
case AUTOSRCH_STEP2: //step interval 20ms
change_freq_value(amfm_flag,searchdir); //1 -> UP search,0 ->DOWN search
In1_Cdata |= 0x04 ; //set cte = 1
send_cmd_to_lc72130(IN1_CMD,(unsigned char) (In1_Pdata),(unsigned char)((In1_Pdata) >> 8),In1_Cdata);
// delay(300);//johnson
autosrch_step = AUTOSRCH_STEP3;
// wait_station_200ms = 0;
wait_station_200ms = 5;
break;
case AUTOSRCH_STEP3:
// if (RADIO_DOUT && !wait_station_200ms)
if (RADIO_DOUT && wait_station_200ms)
{
// autosrch_step = AUTOSRCH_STEP2;
break;
}
else
{
autosrch_step = AUTOSRCH_STEP4;
// wait_station_200ms = 0;
wait_station_200ms = 5;
// In2_Cdata[2] &=0xf7; // set DO pin output mode
// In2_Cdata[2] |=0x08; // set DO pin output mode
// send_cmd_to_lc72130(IN2_CMD,In2_Cdata[0],In2_Cdata[1],In2_Cdata[2]);
}
break;
case AUTOSRCH_STEP4:
read_data_from_lc72130();
read_data_from_lc72130();
Ifcount = ((((DWORD)lc_dataout[0]) <<16) | (((DWORD)lc_dataout[1]) <<8) | (DWORD)lc_dataout[2]) & 0x0fffff;
// if(((lc_dataout[0] & 0x10) != 0x10) && !wait_station_200ms)
if(((lc_dataout[0] & 0x10) != 0x10) && wait_station_200ms)
{
delay(50);
break;
}
else
{
if(amfm_flag)
{
if((Ifcount >3590) && (Ifcount < 3610))
{
auto_srch_ok = 1;
In1_Cdata &= 0xfb ; //set cte = 0
send_cmd_to_lc72130(IN1_CMD,(unsigned char) (In1_Pdata),(unsigned char)((In1_Pdata) >> 8),In1_Cdata);
delay(300); //Johnson
mute_radio(0);
//if(radio_station_count < 25 ) //Johnson
//{
// radio_stations[radio_station_count] = AMfreq;
// radio_station_count++;
// station_num = radio_station_count;
//}johnson
}
}
else
{
if((Ifcount >342300) && (Ifcount < 342500))
{
auto_srch_ok = 1;
In1_Cdata &= 0xfb ; //set cte = 0
send_cmd_to_lc72130(IN1_CMD,(unsigned char) (In1_Pdata),(unsigned char)((In1_Pdata) >> 8),In1_Cdata);
delay(300); //Johnson
mute_radio(0);
//if(radio_station_count < 25 ) //johnson
//{
// radio_stations[radio_station_count] = FMfreq;
// radio_station_count++;
// station_num = radio_station_count;
//}//johnson
}
}
if(auto_srch_ok)
{
radio_station_changed = 1;
if(is_search_all_station)
{
// delay_us(3000000); //dzh add for test
auto_srch_ok = 0;
}
}
autosrch_step = AUTOSRCH_STEP1;
}
break;
} //switch
}
void init_lc72130(void)
{
// switch_audio_channel(0); //default MONO out
// switch_audio_channel(1); //default Stero out
//// ps_restore_amfm();
//// ps_restore_station();
switch_fmam(amfm_flag);
switch_audio_channel(0); //default MONO out
// In1_Cdata = Rfreq_025KHZ | FMIN | COUNTER_RESET | CRYSTAL_45MHZ; //default FM Band
delay(300); //Johnson
mute_radio(0);
auto_manu = 0;
// dvd_radio = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -