📄 tuner.c
字号:
//#include<reg52.h>
#include<define.h>
#include<IIC_C51.h>
#include<OSD_5514.h>
#include<tuner.h>
#include<delay.h>
#include<TV_ch_table.h>
#include<use_factory.h>
#include<audio.h>
// sbit Stable=P0^7;
//sbit ANT_X=P0^6;
// sbit SyncDetPort=P0^3;
// #define TunerAddr 0xc0
// #define TV_space 0x100
// #define cur_prog_addr 0x1fe
// #define MAX_prog_addr 0x1ff
// #define C_CTRL_BYTE 0xce
// #define PLL_lock 0x40
// #define Lock_wait_time 75 //定时器*75=150ms,锁相环最长锁定时间
// #define ADC_reg 0x07
// #define ADC_ok 0x03
// #define Max_CH 73 //数字置台最大的CH数
//BYTE *TunerTBL_Ptr;
BYTE xdata cur_prog; //当前节目号,从1-99,对应EEPROM存贮地址0x101--0x163,存贮内容为CH号
BYTE xdata Max_prog;
BYTE xdata cur_ch; //频率表频道号
//BYTE PLL_wait;
BYTE xdata scan_cnt;
BYTE xdata CH_num_disp,ppp;
bit scaning=0;
bit fac_TV_Disp=1;
extern bit TV_sync,Mute_flg;
extern bit sync,ack;
extern BYTE xdata remote_key;
extern BYTE xdata button_key;
bit ScanSyncDet();
void WritePLL(BYTE band, BYTE PLL_high, BYTE PLL_low, bit sw)
{
sw=1;
//if (sw == 1)
{ // Type-1
IIC_buf[0] = PLL_high;
IIC_buf[1] = PLL_low;
IIC_buf[2] = C_CTRL_BYTE;// #define C_CTRL_BYTE 0x8E
IIC_buf[3] = band;
}
//else
{ // Type-2
//IIC_buf[0] = C_CTRL_BYTE;
//IIC_buf[1] = band;
//IIC_buf[2] = PLL_high;
//IIC_buf[3] = PLL_low;
}
ppp=USendStr(TunerAddr,IIC_buf,4);
}
BYTE ReadTuner(void)
{
URcvStr(TunerAddr,IIC_buf,1);
return(IIC_buf[0]);
}
/*
bit Tuner_check(void)
{
ReadTuner();
return(~ack);
}*/
void Disp_TV_ch(void)
{
if(fac_TV_Disp) PrintDec(20,1,cur_ch);
else PrintDec(20,1,cur_prog);
}
void TV_osd(void)
{
TV_init_osd();
Disp_TV_ch();
if(Mute_flg) PrintString(5,9,"MUTE");
}
void TV_init_osd(void)
{
BYTE code *tv_disp3[]={"NTSC ","PAL B/G","PAL D/K","PAL I ","SEC B/G","SEC D/K","SEC L ","PAL B/G","NTSC "};
PrintString(1,1,"TV ");
PrintString(17,1,"CH");
PrintString(17,2,tv_disp3[fac_TV_Format]);
//Disp_TV_ch();
//if(Mute_flg) PrintString(5,9,"MUTE");
}
void TV_Disp(void)
{
CloseOSD();
TV_osd();
}
void CH_set(BYTE Prog,bit direct,bit display)
{
BYTE PLL_high,PLL_low;
BYTE PLLband;
BYTE *TunerTBL_Ptr;
if(IRcvStr(0xa2,Prog,IIC_buf,1)) cur_ch=IIC_buf[0];
else cur_ch=2;
//if(cur_ch<Max_CH)
{
IIC_buf[0]=0;
switch(fac_TV_Format)
{
case 0:
TunerTBL_Ptr=&USA_table[0][0];
//IIC_buf[1]=0x16;
//IIC_buf[2]=0x30;
//IIC_buf[3]=0x08;
break;
case 1:
case 4:
case 6:
TunerTBL_Ptr=&CCIR_table[0][0];
IIC_buf[1]=0xd6;
IIC_buf[2]=0x70;
IIC_buf[3]=0x09;
break;
case 2:
case 5:
TunerTBL_Ptr=&PAL_DK_table[0][0];
IIC_buf[1]=0xd6;
IIC_buf[2]=0x70;
IIC_buf[3]=0x0b;
break;
case 3: //PAL I 只有ch21-ch69,即CCIR频道表的UHF段
TunerTBL_Ptr=&CCIR_table[0][0];
//cur_ch=20;
IIC_buf[1]=0xd6;
IIC_buf[2]=0x70;
IIC_buf[3]=0x0a;
break;
case 7:
TunerTBL_Ptr=&AUTSTRLIA_table[0][0];
IIC_buf[1]=0xd6;
IIC_buf[2]=0x70;
IIC_buf[3]=0x09;
break;
case 8:
default:
TunerTBL_Ptr=&USA2_table[0][0];
IIC_buf[1]=0x16;
IIC_buf[2]=0x30;
IIC_buf[3]=0x08;
break;
}
if(fac_TV_Format)
USendStr(0x86,IIC_buf,4);
DelayX2ms(50);
PLL_high=*(TunerTBL_Ptr+(cur_ch-1)*3);
TunerTBL_Ptr++;
PLL_low=*(TunerTBL_Ptr+(cur_ch-1)*3);
TunerTBL_Ptr++;
PLLband=*(TunerTBL_Ptr+(cur_ch-1)*3);
WritePLL(PLLband,PLL_high,PLL_low,direct);
CH_num_disp=cur_ch;
IIC_buf[0] = cur_ch;
IIC_buf[1]=Max_prog;
IIC_buf[2]=cur_prog;
ISendStr(0xa0,0x03,IIC_buf,3);
DelayX2ms(50);
if(display) TV_Disp();
}
}
void TV_Scan(void)
{
BYTE PLL_high,PLL_low;
BYTE PLLband;
BYTE *TunerTBL_Ptr;
BYTE ANT_count;
bit ANT_locked;
bit ForceStop;
bit scan_tag;
ForceStop=scan_tag=0;
scaning=1;
cur_ch=2;
cur_prog=1;
Max_prog=1;
ANT_locked=0;
fac_TV_Disp=1;
ANT_X=0;
Stable=0;
OSD_format(NTSC);
BlueScreen(1);
IIC_buf[0]=0;
switch(fac_TV_Format)
{
case 0:
TunerTBL_Ptr=&USA_table[1][0];
//IIC_buf[1]=0x16;
//IIC_buf[2]=0x30;
//IIC_buf[3]=0x08;
break;
case 1:
case 4:
case 6:
TunerTBL_Ptr=&CCIR_table[1][0];
IIC_buf[1]=0xd6;
IIC_buf[2]=0x70;
IIC_buf[3]=0x09;
break;
case 2:
case 5:
TunerTBL_Ptr=&PAL_DK_table[0][0];
cur_ch=1;
IIC_buf[1]=0xd6;
IIC_buf[2]=0x70;
IIC_buf[3]=0x0b;
break;
case 3: //PAL I 只有ch21-ch69,即CCIR频道表的UHF段
TunerTBL_Ptr=&CCIR_table[1][0];
IIC_buf[1]=0xd6;
IIC_buf[2]=0x70;
IIC_buf[3]=0x0a;
break;
case 7:
TunerTBL_Ptr=&AUTSTRLIA_table[0][0];
cur_ch=1;
IIC_buf[1]=0xd6;
IIC_buf[2]=0x70;
IIC_buf[3]=0x09;
break;
case 8:
default:
TunerTBL_Ptr=&USA2_table[1][0];
IIC_buf[1]=0x16;
IIC_buf[2]=0x30;
IIC_buf[3]=0x08;
break;
}
if(fac_TV_Format)
USendStr(0x86,IIC_buf,4);
DelayX2ms(50);
TV_Disp();
while(*TunerTBL_Ptr!=0)
{
if(fac_TV_Disp) Disp_TV_ch();
PLL_high= *TunerTBL_Ptr;
TunerTBL_Ptr++;
PLL_low= *TunerTBL_Ptr;
TunerTBL_Ptr++;
PLLband=*TunerTBL_Ptr;
TunerTBL_Ptr++;
if(PLLband==flg_VHFL) PrintString(3,10,"VHF LOW... ");
else if(PLLband==flg_VHFH) PrintString(3,10,"VHF HIGH...");
else PrintString(3,10,"UHF... ");
PLL_low-=2; //按经验值,下降两步为最佳位置
WritePLL(PLLband,PLL_high,PLL_low,1); //写分频数据
DelayX2ms(15);
if(ANT_locked) ANT_count=1; //如果天线已锁定,则只做一次当前天线的搜索
else ANT_count=4; //天线未锁定,则做4次
scan_cnt=0;
scaning=1;
while(ANT_count)
{
if(!ANT_locked) ANT_X=1;
DelayX2ms(100);
if(scan_cnt>9)
{
//PrintHex(5,1,scan_cnt);
scan_cnt=0;
ANT_locked=1;
ANT_X=0;
IIC_buf[0]=cur_ch;
ISendStr(0xa2,cur_prog,IIC_buf,1);
cur_prog++;
CloseOSD();
DelayX2ms(50);
BlueScreen(0);
DelayX2ms(100);
TV_osd();
DelayX2ms(120);
//CloseOSD();
//TV_Disp();
//OSD_format(NTSC);
scan_tag=1;
break;
}
ANT_X=0;
ANT_count--;
if((remote_key==3)||(button_key==3)) {ForceStop=1;break;}
}
scaning=0;
//OSD_format(NTSC);
BlueScreen(1); ////
if(ForceStop) break;
cur_ch++;
}
Stable=1;
remote_key=0;//0xff;
button_key=0;
if(!scan_tag)
{
Max_prog=1;
IIC_buf[0]=2;
ISendStr(0xa2,1,IIC_buf,1);
}
else if(cur_prog==1)
Max_prog=cur_prog;
else {cur_prog-=1;Max_prog=cur_prog;}
cur_prog=1;
IIC_buf[0]=Max_prog;
IIC_buf[1]=cur_prog;
ISendStr(0xa0,0x04,IIC_buf,2);
DelayX2ms(5);
CH_set(cur_prog,0,1);
scaning=0;
ANT_X=1; //天线脉冲输出脚的复位放在后面的位置,使四路天线CPU有足够时间退出中断
}
void CH_inc(void)
{
if(cur_prog<Max_prog) {cur_prog++;CH_set(cur_prog,1,1);}
else {cur_prog=1;CH_set(cur_prog,0,1);}
}
void CH_dec(void)
{
if(cur_prog>1) {cur_prog--;CH_set(cur_prog,0,1);}
else {cur_prog=Max_prog;CH_set(cur_prog,1,1);}
}
void CH_setr(BYTE digital)
{
BYTE PLL_high,PLL_low;
BYTE PLLband;
BYTE Max_CH;
BYTE *TunerTBL_Ptr;
if((digital==0)||((digital==1)&&((fac_TV_Format!=2)&&(fac_TV_Format!=5)&&(fac_TV_Format!=7))))
{
Disp_TV_ch();
//return;
}
//else if(cur_ch==digital)
//TV_osd();
else if(!fac_TV_Disp) //节目号显示模式
{
if(digital<=Max_prog) //数字键置台必须小于最大台数,否则不予置台
{
if(digital<cur_prog) CH_set(digital,0,1);
else CH_set(digital,1,1);
cur_prog=digital;
}
else TV_Disp();
}
else // CH号显示模式
{
IIC_buf[0]=0;
switch(fac_TV_Format)
{
case 0:
TunerTBL_Ptr=&USA_table[0][0];
Max_CH=72;
//IIC_buf[1]=0x16;
//IIC_buf[2]=0x30;
//IIC_buf[3]=0x08;
break;
case 1:
case 4:
case 6:
TunerTBL_Ptr=&CCIR_table[0][0];
Max_CH=69;
IIC_buf[1]=0xd6;
IIC_buf[2]=0x70;
IIC_buf[3]=0x09;
break;
case 2:
case 5:
TunerTBL_Ptr=&PAL_DK_table[0][0];
Max_CH=95;
IIC_buf[1]=0xd6;
IIC_buf[2]=0x70;
IIC_buf[3]=0x0b;
break;
case 3: //PAL I 只有ch21-ch69,即CCIR频道表的UHF段
TunerTBL_Ptr=&CCIR_table[0][0];
Max_CH=69;
IIC_buf[1]=0xd6;
IIC_buf[2]=0x70;
IIC_buf[3]=0x0a;
break;
case 7:
TunerTBL_Ptr=&AUTSTRLIA_table[0][0];
Max_CH=69;
IIC_buf[1]=0xd6;
IIC_buf[2]=0x70;
IIC_buf[3]=0x09;
break;
case 8:
default:
TunerTBL_Ptr=&USA2_table[0][0];
Max_CH=72;
IIC_buf[1]=0x16;
IIC_buf[2]=0x30;
IIC_buf[3]=0x08;
break;
}
if(fac_TV_Format)
USendStr(0x86,IIC_buf,4);
DelayX2ms(50);
if(digital<=Max_CH)
{
set_mute(0);
PLL_high=*(TunerTBL_Ptr+(digital-1)*3);
TunerTBL_Ptr++;
PLL_low=*(TunerTBL_Ptr+(digital-1)*3);
TunerTBL_Ptr++;
PLLband=*(TunerTBL_Ptr+(digital-1)*3);
if(digital<cur_ch) WritePLL(PLLband,PLL_high,PLL_low,0);
else WritePLL(PLLband,PLL_high,PLL_low,1);
for(cur_ch=1;cur_ch<Max_prog;cur_ch++)
{
IRcvStr(0xa2,cur_ch,IIC_buf,1);
if(IIC_buf[0]==digital) //在表内
{
cur_prog=cur_ch;
cur_ch=Max_prog;
}
}
cur_ch=digital;
CH_num_disp=cur_ch;
DelayX2ms(50);
TV_Disp();
//cur_ch=i;
//PrintHex(5,1,PLL_high);
//PrintHex(8,1,PLL_low);
}
else {Disp_TV_ch();return;}//{CH_set(cur_prog,1,1);return;}
IIC_buf[0]=cur_ch;
ISendStr(0xa0,0x03,IIC_buf,1);
}
}
void Disp_ch_setr_1st(BYTE num)
{
TV_Disp();
PrintHex(20,1,num*10);
PrintChar(21,1,'-');
}
void Disp_search(void)
{
CloseOSD();
PrintString(5,10,"SEARCH...");
}
//void Tuner_Data_init(void)
//{
//IRcvStr(0xa0,0x03,IIC_buf,3);
//cur_ch=IIC_buf[0];
//Max_prog=IIC_buf[1];
//cur_prog=IIC_buf[2];
//fac_TV_Format=0;
//CH_setr(cur_ch);
//}
bit ScanSyncDet()
{
//BYTE i;
//BYTE scan_tmp[5];
bit scan_tmp_flg;
/* ET2=0;
for(i=0;i<5;i++)
{
TR2=0;
TL2=0;
TH2=0;
TF2=0;
EXF2=0;
TR2=1;
while((TF2==0)&&(EXF2==0));
TR2=0;
if(TF2) scan_tmp[i]=0xff;
if(EXF2) scan_tmp[i]=RCAP2H;
}
for(i=0;i<5;i++)
{
if((scan_tmp[i]<3)&&(scan_tmp[i]!=0)) {scan_tmp_flg=1;break;}
else scan_tmp_flg=0;
}
TL2=0;
TH2=0;
TF2=0;
EXF2=0;
TR2=1;
ET2=1;*/
return(scan_tmp_flg);
}
//--------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -