📄 tuner.c
字号:
#include "Main.h"
#include "tuner.h"
//显示的内容
extern UCHAR LED_Data1;
extern UCHAR LED_Data2;
extern UCHAR LED_Data3;
//FM当前频道,FM当前频道个数
extern UCHAR nFM;
extern UCHAR nFMs;
extern uchar select_ch;
extern bit b_mute_f;
//频道类型
extern uchar m_channel_place;
extern uchar m_B,m_C,m_E,m_IF_address;
//检测是否有视频信号的I/O口
sbit FindChannel = P1^5;
sbit m_mute = P1^4;
//Tuner段控制字
extern UCHAR nFmBand;
extern UCHAR nLowBand;
extern UCHAR nMidBand;
extern UCHAR nHigBand;
extern uint m_IF;
extern uchar lcd_cnt;
extern UCHAR taiHao;
//super 超强接收
extern bit bWSB;
//FM立体音
extern bit bMono;
//TNF8533 TNF8833 01
//TNF8533 TNF8833 02
//TNF8532 TNF8832 03
//TNF8731 TNF8731FF 04
extern UCHAR nTunerType;
//当前频道编号
UCHAR nChannel;
extern UCHAR IsChannels;
extern UCHAR idata lcd_data_line1[16];
extern UCHAR idata lcd_data_line2[16];
extern UCHAR IR_Data;
extern bit IR_Succes;
extern uchar m_taihao;
extern bit m_auto;
//中国频道
extern long int code tuner_China[100] =
{
//VHF_LOW 12
4975, 5775, 6575, 7725, 8525, 11225, 12025, 12825, 13625, 14425,
15225, 16025,
//VHF_HIG 38
16825, 17625, 18425, 19225, 20025, 20825, 21625, 22425, 23225, 24025,
24825, 25625, 26425, 27225, 28025, 28825, 29625, 30425, 31225, 32025,
32825, 33625, 34425, 35225, 36025, 36825, 37625, 38425, 39225, 40025,
40825, 41625, 42425, 43225, 44025, 44825, 45625, 46425,
//UHF 50
47125, 47925, 48725, 49525, 50325, 51125, 51925, 52725, 53525, 54325,
55125, 55925, 56725, 57525, 58325, 59125, 59925, 60725, 61525, 62325,
63125, 63925, 64725, 65525, 66325, 67125, 67925, 68725, 69525, 70325,
71125, 71925, 72725, 73525, 74325, 75125, 75925, 76725, 77525, 78325,
79125, 79925, 80725, 81525, 82325, 83125, 83925, 84725, 85525, 86325,
};
//欧洲频道
long int code tuner_Europe[104] =
{
//VHF_LOW 15
4825, 5525, 6225, 6925, 7625, 8325, 10525, 11225, 11925, 12625,
13325, 14025, 14725, 15425, 16125,
//VHF_HIG 40
16825, 17558, 18225, 18925, 19625, 20325, 21025, 21725, 22425, 23125,
23825, 24525, 25225, 25925, 26625, 27325, 28025, 28725, 29425, 30325,
31125, 31925, 32725, 33525, 34325, 35125, 35925, 36725, 37525, 38325,
39125, 39925, 40725, 41525, 42325, 43125, 43925, 44725, 45525, 46325,
//UHF 49
47125, 47925, 48725, 49525, 50325, 51125, 51925, 52725, 53525, 54325,
55125, 55925, 56725, 57525, 58325, 59125, 59925, 60725, 61525, 62325,
63125, 63925, 64725, 65525, 66325, 67125, 67925, 68725, 69525, 70325,
71125, 71925, 72725, 73525, 74325, 75125, 75925, 76725, 77525, 78325,
79125, 79925, 80725, 81525, 82325, 83125, 83925, 84725, 85525,
};
//美国频道
long int code tuner_USA[136] =
{
//VHF_LOW 19
5525, 6125, 6725, 7725, 8325, 8525, 9125, 9725, 10325, 10925,
11525, 12125, 12725,13325, 13925, 14525, 15125, 15725, 16325,
//VHF_HIG 51
16925, 17525, 18125, 18725, 19325, 19925, 20525, 21125, 21725, 22325,
22925, 23525, 24125, 24725, 25325, 25925, 26525, 27125, 27725, 28325,
28925, 29525, 30125, 30725, 31325, 31925, 32525, 33125, 33725, 34325,
34925, 35525, 36125, 36725, 37325, 37925, 38525, 39125, 39725, 40325,
40925, 41525, 42125, 42725, 43325, 43925, 44525, 45125, 45725, 46325,
46925,
//UHF 66
47125, 47725, 48325, 48925, 49525, 50125, 50725, 51325, 51925, 52525,
53125, 53725, 54325, 54925, 55525, 56125, 56725, 57325, 57925, 58525,
59125, 59725, 60325, 60925, 61525, 62125, 62725, 63325, 63925, 64525,
65125, 65725, 66325, 66925, 67525, 68125, 68725, 69325, 69925, 70525,
71125, 71725, 72325, 72925, 73525, 74125, 74725, 75325, 75925, 76525,
77125, 77725, 78325, 78925, 79525, 80125, 80725, 81325, 81925, 82525,
83125, 83725, 84325, 84925, 85525, 86125,
};
//法国频道
long int code tuner_France[89] =
{
//VHF_LOW 7
5575, 6050, 6375, 11675, 12875, 14075, 15275,
//VHF_HIG 31
16475, 17600, 17675, 18400, 18875, 19200, 20000, 20075, 20800, 21275,
21600, 22475, 23675, 24875, 26075, 27275, 28475, 29675, 30875, 32075, 33275,
34475, 35675, 36875, 38075, 39275, 40475, 41675, 42875, 44075, 45275,
//UHF 51
46475, 47125, 47925, 48725, 49525, 50325, 51125, 51925, 52725, 53525,
54325, 55125, 55925, 56725, 57525, 58325, 59125, 59925, 60725, 61525,
62325, 63125, 63925, 64725, 65525, 66325, 67125, 67925, 68725, 69525,
70325, 71125, 71925, 72725, 73525, 74325, 75125, 75925, 76725, 77525,
78325, 79125, 79925, 80725, 81525, 82325, 83125, 83925, 84725, 85525,
86325,
};
bit TunerGB(uchar channel_gb)
{
uchar nPd;
unsigned long nDb;
switch (m_channel_place)
{
case ChinaChannel:
if (select_ch == 6)
{
if (channel_gb < 12)
nPd = nLowBand;
else if (channel_gb <= 45)
{
nPd = nMidBand;
}
else
nPd = nHigBand;
}
else
{
if (channel_gb < 12)
nPd = nLowBand;
else if (channel_gb <= 50)
{
nPd = nMidBand;
}
else
nPd = nHigBand;
}
nDb = tuner_China[channel_gb];
break;
case EuropeChannel:
if (channel_gb < 15)
nPd = nLowBand;
else if (channel_gb <= 55)
nPd = nMidBand;
else
nPd = nHigBand;
nDb = tuner_Europe[channel_gb];
break;
case USAChannel:
if (channel_gb < 19)
nPd = nLowBand;
else if (channel_gb <= 70)
nPd = nMidBand;
else
nPd = nHigBand;
nDb = tuner_USA[channel_gb];
break;
case FranceChannel:
if (channel_gb < 7)
nPd = nLowBand;
else if (channel_gb <= 38)
nPd = nMidBand;
else
nPd = nHigBand;
nDb = tuner_France[channel_gb];
break;
}
nDb = (nDb + m_IF) * 4 / 25;
return WriteTuner(0xc0, nDb, 0xce, nPd);
}
/////////////////////////////////////////////////////////////////////////////
//写FM
bit WriteTunerFM(UINT Db)
{
UCHAR nPortByte;
// FM 10.7M
unsigned long int nDb = Db + 1070;
nDb = (nDb *4 ) /25;
nPortByte=nFmBand;
if(bMono)
{
switch(nTunerType)
{
case 1:
//TNF8531 TNF8831
nPortByte= nFmBand | 0x2;
break;
case 2:
//TNF8533 TNF8833
nPortByte= nFmBand | 0x20;
break;
case 3:
//TNF8532 TNF8832
nPortByte= nFmBand | 0x40;
break;
case 4:
//TNF8731 TNF8731FF
nPortByte= nFmBand ;
break;
default:
break;
}
}
return WriteTuner(Tuner5523, nDb , 0x8e, nPortByte);
}
/////////////////////////////////////////////////////////////////////////////
//读高频头(地址,控制字,返回值)
bit ReadTuner(UCHAR *STB)
{
IICStart();
if( !IICWriteByte(0xc0+1) )
return FALSE;
*STB=IICReadByte();
// IICNoAck();
IICStop();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
//写高频头(地址,频点,控制字)
bit WriteTuner(UCHAR Adb, UINT Db, UCHAR Cb, UCHAR Pd)
{
uchar db1,db2;
db1 = Db >> 8;
db2 = Db & 0xff;
IICStart();
if (!IICWriteByte(Adb) )
return false;
if (!IICWriteByte(db1) )
return false;
if (!IICWriteByte(db2))
return false;
if (!IICWriteByte(Cb) )
return false;
if (!IICWriteByte(Pd) )
return false;
IICStop();
return true;
}
/////////////////////////////////////////////////////////////////////////////
//自动搜索FM
bit AutoFM(void)
{
bit bResult;
UINT i;
UCHAR IsFMs = 0;
UCHAR STB;
UINT nAddress;
for(i=780; i<=1080; i++)
{
bResult = WriteTunerFM(i*10);
// LED_Data3 = Dis_Code( i%10 );
// LED_Data2 = Dis_Code( (i/10)%10 + 16);
// LED_Data1 = Dis_Code( (i/100)%16);
delay(0x7f);
bResult = ReadTuner(&STB);
if( (STB&0xf0==0xd0) && (STB&0x7==2 ))
{
IsFMs++; //有效FM台计数
if(IsFMs >=50)
return TRUE;
nAddress = IsFMs*2+100;
bResult = Write24xxByte(nAddress, (i*10)>>8 );
bResult = Write24xxByte(nAddress+1, (i*10)&0xff);
}
}
bResult = Write24xxByte(201, IsFMs-1); //写搜索的频道个数
return bResult;
}
/////////////////////////////////////////////////////////////////////////////
//自动搜索频道
bit AutoChannel(void)
{
bit bResult,bok;
UCHAR i;
UCHAR STB;
unsigned long int fre;
uchar tmp,tmp1;
uchar nChannelMax = 0;
IsChannels = 0;
switch( m_channel_place)
{
case ChinaChannel:
nChannelMax=100;
break;
case EuropeChannel:
nChannelMax=104;
break;
case USAChannel:
nChannelMax=136;
break;
case FranceChannel:
nChannelMax=89;
break;
default:
break;
}
m_mute = 1; // close
lcd_data(0,"Search: ");
for (i = 0; i < nChannelMax; i++)
{
if (IR_Succes == 1)
{
if ((IR_Data == keyAudioUp) || (IR_Data == keyAudioDn))
{
IR_Data = ~IR_Data;
IR_Succes = 0;
break;
}
else
IR_Succes = 0;
}
bResult = TunerGB(i);
if (~bResult)
break;
lcd_cnt = 0xf0;
lcd_display();
delay(0xff);
delay(0xff);
delay(0xff);
delay(0xff);
if (m_IF_address == 0)
{
bResult = ReadTuner(&STB);
if( STB == 0x79 || STB == 0x7a || STB == 0x7b)
{
bResult = Write24xxByte(IsChannels, i);
IsChannels++; //有效台计数
}
}
else
{
bResult = ReadIF(&STB);
STB = STB | 0x20;
if ((STB & 0xe0) == 0xe0)
{
bok = 0;
tmp1 = STB & 0x1f;
tmp1 = tmp1 >> 1;
if ( tmp1 <= 0x04 )
bok = 1;
if ( (tmp1 >= 0x0b) && (tmp1 <= 0x0f) )
bok = 1;
if (bok)
{
bResult = Write24xxByte(IsChannels, i);
IsChannels++; //有效台计数
}
}
}
taiHao = i;
m_taihao = i;
m_auto = 1;
channel_show();
tmp = tmp1 ;
tmp = STB >> 4;
if (tmp > 9)
tmp = tmp + 0x37;
else
tmp = tmp + 0x30;
lcd_data_line1[14] = tmp;
tmp = STB & 0x0f;
if (tmp > 9)
tmp = tmp + 0x37;
else
tmp = tmp + 0x30;
lcd_data_line1[15] = tmp;
}
bResult = Write24xxByte(0xff, IsChannels); //写搜索的频道个数
taiHao = 0;
bResult = Read24xxByte(taiHao,&tmp);
bResult = TunerGB(tmp);
if (~b_mute_f)
m_mute = 0; // open
lcd_data(0," ");
m_auto = 0;
channel_show();
return bResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -