📄 一些常用的c语言音响程序(5):收音头控制程序(有些难度) - enbia's blog.mht
字号:
=3D=20
((freq + 1070) * 1000) / (FM_FREF=20
*100);<BR> }<BR> &nbs=
p; break;<BR> }<BR><BR> Tuner_Set_Freque=
ncy_Int();<BR><BR> dwPLL_Shadow_IN2=20
|=3D BO2_ON; =
//=20
Unmute<BR><BR> Write_LC72131(MODE_IN1,=20
dwPLL_Shadow_IN1); <BR> Write_LC72131(MODE_IN2,=20
dwPLL_Shadow_IN2); <BR><BR> // save the current=20
count<BR> Write_EEPROM(EE_CURCNT_LOW, cur_count[band] & =
0xff);=20
Write_EEPROM(EE_CURCNT_HIGH, cur_count[band] >>=20
8);<BR><BR> return=20
(Count_To_Freq());<BR>}<BR><BR>//----------------------------------------=
-----------------------------------<BR>//=20
Tuner_Step<BR>//---------------------------------------------------------=
------------------<BR>WORD=20
Tuner_Step(BYTE ctrl){<BR><BR> if (ctrl !=3D SET)return=20
Tuner_Set_Frequency(ctrl,=20
0);<BR>}<BR><BR>//-------------------------------------------------------=
--------------------<BR>//=20
Tuner_Scan<BR>//---------------------------------------------------------=
------------------<BR>int=20
Tuner_Scan(BYTE ctrl){<BR>BAND_INFO code *pBInfo;<BR>WORD =
temp;<BR>register BYTE=20
j;<BR><BR> switch(band){<BR> case=20
BAND_AM:<BR> if (b_amstep) pBInfo =3D =
&BandInfo_AM_10KHz; else pBInfo =3D &BandInfo_AM_9KHz;=20
break;<BR><BR> case=20
BAND_FM:<BR> if (b_fmstep) pBInfo =3D =
&BandInfo_FM_100KHz; else pBInfo =3D &BandInfo_FM_50KHz;=20
break;<BR><BR> case=20
BAND_SW:<BR> break;<BR> }<B=
R><BR> if=20
(ctrl =3D=3D INQUIRE){<BR> return=20
(Count_To_Freq());<BR> }<BR> else if (ctrl =3D=3D=20
UP){<BR> cur_count[band] +=3D pBInfo ->=20
CntStep;<BR> }<BR> else if (ctrl =3D=3D DOWN){=20
<BR> cur_count[band] -=3D pBInfo ->=20
CntStep;<BR> }<BR><BR>// Temp_Mute(1);<BR><BR> =
; Tuner_Set_Frequency_Int();<BR><BR> Write_LC72131(MODE_I=
N1,=20
dwPLL_Shadow_IN1); <BR> Write_LC72131(MODE_IN2,=20
dwPLL_Shadow_IN2); <BR> <BR> // Wait =
PLL Lock=20
-----------------------------------------------------------<BR> &nbs=
p;Pause(1); &n=
bsp; //<BR> &nb=
sp;<BR> for=20
(j=3D0; j<255; j++){<BR> if=20
(PIN_TUNER_DO)break;<BR> }<BR><BR> dwPLL_Shadow_IN2=
&=3D=20
DO_MODE_MASK; // set DO =
mode, end=20
uc<BR> dwPLL_Shadow_IN2 |=3D=20
DO_MODE_END_UC;<BR><BR> dwPLL_Shadow_IN1 |=3D=20
CTE_ON; =
//=20
IF count start<BR> <BR> Write_LC72131(MODE_IN1,=20
dwPLL_Shadow_IN1); <BR> Write_LC72131(MODE_IN2,=20
dwPLL_Shadow_IN2); <BR><BR> // Wait Gate over=20
-----------------------------------------------------<BR> for =
(j=3D0;=20
j<10; j++){<BR> if (!PIN_TUNER_DO)=20
break; // =
break when=20
gate ends<BR> os_wait2(K_TMO,=20
1);<BR> }<BR><BR> // Gate time =
over<BR> temp =3D=20
Read_72131() & 0x0fffff;<BR><BR> dwPLL_Shadow_IN2 |=3D =
BO2_ON;=20
//=20
Unmute<BR> Write_LC72131(MODE_IN2,=20
dwPLL_Shadow_IN2); <BR><BR> // save the current=20
count<BR> Write_EEPROM(EE_CURCNT_LOW, cur_count[band] & =
0xff);=20
Write_EEPROM(EE_CURCNT_HIGH, cur_count[band] >> =
8);<BR><BR> if=20
((temp >=3D pBInfo -> IFCntMin) && (temp <=3D pBInfo =
->=20
IFCntMax)){<BR> return=20
-(Count_To_Freq());<BR> }<BR> else=20
{<BR> return=20
(Count_To_Freq());<BR> }<BR>}<BR><BR>//-----------------------=
----------------------------------------------------<BR>//=20
Tuner_Get_Stereo<BR>//---------------------------------------------------=
------------------------<BR>BOOL=20
Tuner_Get_Stereo(void){<BR><BR> if (band =3D=3D BAND_FM)=20
{<BR> return (!(Read_72131() &=20
0x800000));<BR> }<BR> else=20
<BR> return=20
0;<BR>}<BR><BR>//--------------------------------------------------------=
-------------------<BR>//=20
Tuner_Set_Frequency_Int<BR>//--------------------------------------------=
-------------------------------<BR>static=20
void Tuner_Set_Frequency_Int(void){<BR>BAND_INFO code=20
*pBInfo;<BR><BR> switch(band){<BR> case=
=20
BAND_AM:<BR> if (b_amstep) pBInfo =3D =
&BandInfo_AM_10KHz; else pBInfo =3D &BandInfo_AM_9KHz;=20
break;<BR><BR> case=20
BAND_FM:<BR> if (b_fmstep) pBInfo =3D =
&BandInfo_FM_100KHz; else pBInfo =3D &BandInfo_FM_50KHz;=20
break;<BR><BR> case=20
BAND_SW:<BR> break;<BR> }<B=
R><BR> dwPLL_Shadow_IN1=20
=3D 0; dwPLL_Shadow_IN2 =3D 0;<BR><BR> // Check Boundary=20
-----------------------------------------------------<BR> if=20
(cur_count[band] > pBInfo ->=20
CntMax){<BR> cur_count[band] =3D pBInfo -> =
CntMin;=20
//=20
Cycling<BR> }<BR> else if (cur_count[band] < =
pBInfo=20
-> CntMin){<BR> cur_count[band] =3D pBInfo =
-> CntMax;=20
//=20
Cycling<BR> }<BR><BR> // IN2 Mode=20
-----------------------------------------------------------<BR> &nbs=
p;dwPLL_Shadow_IN2=20
|=3D =
GATE_TIME_32MS; &nbs=
p;//=20
Gate Time =3D 4ms<BR> dwPLL_Shadow_IN2 |=3D=20
0x100000; &nbs=
p; //=20
IFS<BR><BR> if (band =3D=3D=20
BAND_AM){ &nbs=
p; //=20
Set Band <BR> dwPLL_Shadow_IN2 |=3D BO1_ON;=20
<BR> }<BR> else if (band =3D=3D=20
BAND_FM){<BR> dwPLL_Shadow_IN2 |=3D=20
BO4_ON;<BR> }<BR> <BR> if=20
(!bST_MONO) {dwPLL_Shadow_IN2 |=3D BO3_ON;} //=20
Stereo<BR><BR>// dwPLL_Shadow_IN2 &=3D=20
DO_MODE_MASK;<BR> dwPLL_Shadow_IN2 |=3D=20
DO_MODE_UNLOCK; &nbs=
p;//<BR><BR> //=20
IN1 Mode=20
-----------------------------------------------------------<BR><BR> =
if=20
(band =3D=3D=20
BAND_AM){ &nbs=
p; //=20
Set Frequency<BR> dwPLL_Shadow_IN1 |=3D =
(cur_count[band]=20
<< 4); <BR> }<BR> else=20
{<BR> dwPLL_Shadow_IN1 |=3D cur_count[band];=20
<BR> }<BR><BR> =
dwPLL_Shadow_IN1=20
|=3D pBInfo -> =
DivMode; // Set=20
DIv Mode<BR> dwPLL_Shadow_IN1 |=3D pBInfo ->=20
DivRefPara; // Set DIV Ref=20
Para<BR>}<BR><BR>//------------------------------------------------------=
---------------------<BR>//=20
Count_To_Freq<BR>//------------------------------------------------------=
---------------------<BR>static=20
WORD Count_To_Freq(void){<BR>BAND_INFO code=20
*pBInfo;<BR><BR> switch(band){<BR> case=
=20
BAND_AM:<BR> if (b_amstep) pBInfo =3D =
&BandInfo_AM_10KHz; else pBInfo =3D &BandInfo_AM_9KHz;=20
break;<BR><BR> case=20
BAND_FM:<BR> if (b_fmstep) pBInfo =3D =
&BandInfo_FM_100KHz; else pBInfo =3D &BandInfo_FM_50KHz;=20
break;<BR><BR> case=20
BAND_SW:<BR> break;<BR> }<B=
R><BR> if=20
((band =3D=3D BAND_AM) || (band =3D=3D =
BAND_SW)){<BR> return=20
cur_count[band] * pBInfo -> FRef - =
450;<BR> }<BR> else=20
{<BR> return cur_count[band] * ((FM_FREF =
*100)/1000) -=20
1070;<BR> }<BR>}<BR><BR>#define =
LC72131_DELAY() {_nop_();=20
_nop_();=20
_nop_();}<BR><BR>//------------------------------------------------------=
---------------------<BR>//=20
Write_LC72131_Addr<BR>// addr: the addr of the control =
register<BR>//=20
value: the valude to set to=20
<BR>//-------------------------------------------------------------------=
--------<BR>static=20
void Write_LC72131_Addr(BYTE addr){<BR>register BYTE=20
i;<BR><BR> PIN_TUNER_CE =3D 0;<BR> PIN_TUNER_CL =
=3D=20
1;<BR><BR> LC72131_DELAY();<BR><BR> for (i =3D 8; =
i>0;=20
--i){ <BR> PIN_TUNER_CL =3D=20
0;<BR> LC72131_DELAY();<BR><BR> &=
nbsp;if=20
(addr & 0x01) PIN_TUNER_DI=3D1; else=20
PIN_TUNER_DI=3D0;<BR> addr >>=3D=20
1;<BR><BR> LC72131_DELAY();<BR><BR> &nb=
sp; PIN_TUNER_CL=20
=3D=20
1;<BR><BR> LC72131_DELAY();<BR> }<BR>}<=
BR><BR>//----------------------------------------------------------------=
-----------<BR>//=20
Write_LC72131<BR>// addr: the addr of the control =
register<BR>//=20
value: the valude to set to=20
<BR>//-------------------------------------------------------------------=
--------<BR>static=20
void Write_LC72131(BYTE addr, DWORD value){<BR>register BYTE=20
i;<BR><BR> // Send the addr byte first=20
------------//<BR> Write_LC72131_Addr(addr);<BR><BR> &nbs=
p;PIN_TUNER_CE=20
=3D 1;<BR> LC72131_DELAY();<BR><BR> // Send the =
control=20
value in following------------//<BR> for (i =3D 24; i>0; =
--i){=20
<BR> PIN_TUNER_CL =3D=20
0;<BR> LC72131_DELAY();<BR><BR> &=
nbsp;if=20
(value & 0x01) PIN_TUNER_DI=3D1; else=20
PIN_TUNER_DI=3D0;<BR> value >>=3D=20
1;<BR><BR> LC72131_DELAY();<BR><BR> &nb=
sp; PIN_TUNER_CL=20
=3D=20
1;<BR><BR> LC72131_DELAY();<BR> }<BR><B=
R> PIN_TUNER_CE=20
=3D=20
0;<BR>}<BR><BR>//--------------------------------------------------------=
-------------------<BR>//=20
Read_LC72131<BR>// addr: the addr of the control =
register<BR>//=20
return value=20
<BR>//-------------------------------------------------------------------=
--------<BR>static=20
DWORD Read_72131(void){<BR>register BYTE i;<BR>DWORD temp =3D=20
0;<BR><BR> // Send the addr byte first=20
------------//<BR> Write_LC72131_Addr(MODE_OUT);<BR><BR> =
PIN_TUNER_CE=20
=3D 1;<BR> LC72131_DELAY();<BR><BR> // read the =
value dword=20
------------//<BR> for (i=3D24; i>0;=20
--i){<BR> PIN_TUNER_CL =3D=20
0;<BR><BR> LC72131_DELAY();<BR><BR> &nb=
sp; temp=20
<<=3D 1;<BR> if (PIN_TUNER_DO) temp |=3D=20
1;<BR><BR> PIN_TUNER_CL =3D=20
1;<BR> LC72131_DELAY();<BR> }<BR><BR>&n=
bsp; PIN_TUNER_CE=20
=3D 0;<BR><BR> return=20
temp;<BR>}<BR><BR>=E5=A4=B4=E6=96=87=E4=BB=B6=E5=A6=82=E4=B8=8B=EF=BC=9A<=
BR><BR>#ifndef __TUNER_INT_H__<BR>#define=20
__TUNER_INT_H__<BR><BR>#include <types.h><BR><BR>//=20
----------------------------------------------------------------<BR>// =
Control=20
Pins<BR>//=20
----------------------------------------------------------------<BR>exter=
n BOOL=20
PIN_TUNER_DO;<BR>extern BOOL PIN_TUNER_CL;<BR>extern BOOL=20
PIN_TUNER_DI;<BR>extern BOOL PIN_TUNER_CE;<BR><BR>// use 24c02, 0x80 -=20
0xff<BR><BR>enum TUNER_EE {<BR> EE_AMSTEP =3D=20
0x80,<BR> EE_BAND,<BR> EE_CURCNT_LOW,<BR> &nbs=
p;EE_CURCNT_HIGH,<BR><BR> EE_PRESET_BASE &nbs=
p; //=20
To store the preset station <BR>};<BR><BR>#define=20
MAX_PRESET_NUMBER 0x29 // can store 20 =
channels for each band<BR><BR>//=20
-------------------------------------------------------------<BR>// =
Tuner Modle:=20
T-989 of Guangzhou Youshen<BR>//=20
-------------------------------------------------------------<BR><BR>// =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -