📄 radio.c
字号:
/*
好利来音响部设计
未经同意不得散布于网络
2005年2月15日
*/
/*
本项目专门为宣传本站的51 PIC AVR 多功能学习开发板而奉献,仅供参考,请勿做商业用途,欢迎转载但要保留本站信息
志博电子专注于8位单片机开发板设计和教学
让人耳目一心的经济又豪华型开发板
性价比最高
仅售378!
欢迎访问我们的网站 www.elecmcu.com
*/
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include <reg52.h>
#include <absacc.h>
#include "mylib.h"
#define power_dvd 1
#define power_radio 0
#define vfd_dvd 1
#define vfd_radio 0
#define fm 0
#define am 1
#define dvd 2
#define tape 3
#define tv 4
#define inc 1
#define dec 0
#define add_volume 248
#define add_band 249
#define add_eq 250
#define add_tai 251
#define add_la_1 252
#define add_la_2 253
#define add_la_3 254
uchar test_iic_wr=8;
uchar test_iic_rd=0;
sbit vold=P0^0;//音量加按键 39
sbit voli=P0^1;//音量减按键 38
sbit funp=P1^3;//tape/radio转换按键 4
sbit next=P2^7;//下一个电台按键 28
sbit pre=P2^6;//上一个电台按键 27
sbit tuni=P2^5;//步进一个电台频率按键 26
sbit tund=P2^4;//步退一个电台频率按键 25
sbit fun_vfd=P1^4;//VFD控制权切换 5
sbit fun_power=P3^3;//DVD电源控制 13
sbit mute_key=P0^5;//净音按键 34
sbit memory_key=P0^7;//存储按键 32
sbit band_key=P0^6; //AM FM切换按键 33
sbit power_key=P0^4; //电源控制按键 35
sbit tape_p=P3^1; //TAPE电源控制 11
sbit eq=P0^2; //EQ按键 37
sbit mute=P3^5; //净音控制 15
sbit dvd_tv=P0^3; //DVD TV 切换 36
sbit func_dvd=P1^2; //TFT屏进入DVD状态控制 3
sbit func_tv=P1^1; //TFT屏进入 TV状态控制 2
sbit power_led=P1^0; //电源指示灯输出 1
bit key_sta;
bit key_long;
bit start=0;
extern bit mute_l=0;
extern bit power_l=0;
bit key();
uchar ab_am=0;
uchar ab_fm=0;
void pub();
#define on 1
#define off 0
extern uchar eq_l;
uchar u;
uchar k;
uchar fun=0;
uchar code dx58[3] _at_ 0x3b;
extern uchar remkey; //定义功能数据,改变它的有遥控程序和按键程序
uchar tai; //显示的台号
uchar band;
bit int_power_off=0;
static bb;
extern uchar ab=0; //目前波段标志
ulong e=4;
uchar i=4;
uchar b[2]={2,3}; //I2C发送缓冲
uchar a[2]; //I2C接收缓冲
main()
{
//func_dvd=0;
//func_tv=1;
//func_dvd=1;
//inieeprom();
rdnbyt(0xa0,add_la_1,1,&test_iic_rd);
if(test_iic_rd!='z')
inieeprom();
rdnbyt(0xa0,add_la_2,1,&test_iic_rd);
if(test_iic_rd!='t')
inieeprom();
rdnbyt(0xa0,add_la_3,1,&test_iic_rd);
if(test_iic_rd!='y')
inieeprom();
test_iic_wr=test_iic_rd;
func_tv=0;
func_dvd=0;
dvd_tv=1;
remkey=0x99;
fun_power=power_radio;//电源为收音
m:
key_long=key();
// sys_ini();
tape_p=1;
// fun_power=power_radio;//电源为收音
// fun_vfd=vfd_radio; //VFD控制给收音
//while(1)
// vfd_test();
while(1)
{
if(!int_power_off)
{
remkey=0x99;
power_l=1;
}
volcheack();
if(remkey==0x99)//关机处理
{
func_tv=0;
func_dvd=0;
fun_power=power_radio;//电源为收音
fun_vfd=vfd_radio; //VFD控制给收音
vfd_clean();
remkey=0;
power_led=1;
mute_(on);
int_power_off=1;
tape_p=0;
TR1=0;
}
if(remkey==0x98)//开机处理
{
remkey=0;
mute_(off);
power_led=0;
int_power_off=1;
mute_(off);
sys_ini();
tape_p=1;
goto m;
}
if(!power_l)
{
if(remkey==0x97)
{
eqchange();
save_eeprom();
}
if(remkey==0xdf)
{
band_change();
save_eeprom(); //功能切换
}
if(remkey==0xf4)
dvd_tv_ch();
if(band==fm||band==am)
{
if(remkey==0x78)
radio_change();
else if(remkey==0xB5)
station_search(reuse_seach,up); //自动搜索所有频道电台,并存储到24C02。
else if(remkey==0xef)
{
if(TR0)
{
if(ab<50)
ab++;
else
ab=0;
taiwei();
remkey=0x00;//如果是在存台状态下台号改变而不真正调台
}
else
{
station_change(inc);//调出搜到的电台,并使电台号 加1 指向下一个存储的电台
save_eeprom();
}
}
else if(remkey==0x85)
{
if(TR0)
{
if(ab>=1)
ab--;
taiwei();
remkey=0x00; //如果是在存台状态下台号改变而不真正调台
}
else
{
station_change(dec);//调出搜到的电台,并使电台号 减1 指向上一个存储的电台
save_eeprom();
}
}
else if(remkey==0x33)
station_search(reuse_waite,up); //向前搜索一个电台并停止。
else if(remkey==0x34)
station_search(reuse_waite,down); //向后搜索一个电台并停止。
else if(remkey==0x55)
band_step(up); //向前步进一个电台频率;
else if(remkey==0x77)
band_step(down); //向前步进一个电台频率;
}
if(remkey==0x64)//总音量加
sub_vol(up);
else if(remkey==0x65)//总音量减
sub_vol(down);
else if(remkey==0x47)//存台处理
{
if((band==fm)||(band==am))
{
bb=~bb;
if(bb)
TR0=1;
else
{
TR0=0;
if(band==fm)
in0.in0.frq=swdata(swdata(in0.in0.frq)-1);
if(band==am)
in0.in0.frq=swdata(swdata(in0.in0.frq)-0x10);
b[0]=in0.in0.frq>>8;
b[1]=in0.in0.frq;
if(band==fm)
wrnbyt(0xa0,ab*2,2,b);
else if(band==am)
wrnbyt(0xa0,ab*2+120,2,b);
taiwei();
}
}
remkey=0x00;
}
}}
}
void display() //在VFD上显示目前频率和当前的台号
{
if(in1.in1.band==am)
{
vfddigit(swdata(in0.in0.frq<<4)*5-450);//调频波段电台实际频率和写入锁相环的算法
//if((swdata(in0.in0.frq<<4)*5-450));
}
else
vfddigit(swdata(in0.in0.frq)/2-107); //调幅波段电台实际频率和写入锁相环的算法
}
void band_step(bit direction) //频率步进调幅5KHZ/STEP 调频50HZ/STEP
{
iniband();
iniband1(band);
pub();
e=stepserch(direction,in0.in0.frq); //根据形参 direction 决定步进方向
vfd_clean();
display();
remkey=0x00;
}
void band_change(void) //波段换函数
{
TR0=0;
fun++;
tape_p=1;
if(band==tape||band==fm||band==am||band==tv)
{
band=dvd;
func_dvd=0;
func_tv=1;
fun_power=power_dvd;//电源为收音
fun_vfd=vfd_radio; //VFD控制给收音
vfd_clean();
wrvfd(0x05,0x5f);//清屏
wrvfd(0x04,0x24);
wrvfd(0x07,0x5e);
fun_vfd=vfd_dvd;
channel(dvd_fun);
remkey=0x00;
save_eeprom();
return;
}
else if(band==tape||band==fm||band==am||band==dvd)
{
band=tv;
func_dvd=1;
func_tv=0;
fun_power=power_radio;//电源为收音
fun_vfd=vfd_radio; //VFD控制给收音
vfd_clean();
wrvfd(0x05,0xb6);//清屏
wrvfd(0x04,0x76);
wrvfd(0x07,0x6f);
wrvfd(0x06,0x40);
channel(tv_fun);
remkey=0x00;
save_eeprom();
tape_p=1;
return;
}
/*
else if(band==dvd)
{
band=fm;
fun_power=power_radio;//电源为收音
fun_vfd=vfd_radio; //VFD控制给收音
channel(radio_fun);
vfd_clean(); //清屏
if(band==fm)
ab=ab_fm;
else
ab=ab_am;
if(band==fm)
rdnbyt(0xa0,ab*2,2,a); //经过IIC总线调出硬件地址为0XA0,子地址为tai*2的24C02中的数据高第一字节放在A[0]中第二字节放在A[1]中
else
rdnbyt(0xa0,ab*2+120,2,a);
in0.in0.frq=a[0];
in0.in0.frq=(in0.in0.frq<<8)|(0x00ff&a[1]);//将调出的两个字节频率值付给in0.in0.frq
iniband1(band); //初始化具体波段的私有部分
e=stepserch(1,in0.in0.frq); //加载频率
display(); //更新显示
remkey=0x00;
}
else if((band==fm)||(band==am))
{
band=tape;
fun_power=power_radio;//电源为收音
fun_vfd=vfd_radio; //VFD控制给收音
channel(tape_fun);
vfd_clean(); //清屏
wrvfd(0x06,0x40);
wrvfd(0x07,0xfd);
wrvfd(0x04,0xfa);
wrvfd(0x05,0xb6);
remkey=0x00;
}
*/
}
void dvd_tv_ch(void) //波段换函数
{
TR0=0;
fun++;
if(band==dvd||band==fm||band==am||band==tv)
{ func_dvd=0;
func_tv=0;
band=tape;
fun_power=power_radio;//电源为收音
fun_vfd=vfd_radio; //VFD控制给收音
channel(tape_fun);
vfd_clean(); //清屏
wrvfd(0x06,0x40);
wrvfd(0x07,0xfd);
wrvfd(0x04,0xfa);
wrvfd(0x05,0xb6);
remkey=0x00;
tape_p=1;
save_eeprom();
return;
}
else if(band==tape||band==tv||band==dvd)
{
tape_p=0;
func_dvd=0;
func_tv=0;
band=fm;
fun_power=power_radio;//电源为收音
fun_vfd=vfd_radio; //VFD控制给收音
channel(radio_fun);
vfd_clean(); //清屏
if(band==fm)
station_change(up); //加载频率
station_change(down);
display(); //更新显示
remkey=0x00;
save_eeprom();
tape_p=1;
}
}
void station_change(bit direction) //调出已经存储的电台并设置为当前电台
{
if(direction)
{
if(ab<50)
ab++;
else
ab=0;
}
else
{
if(ab>=1)
ab--;
}
if(band==fm)
rdnbyt(0xa0,ab*2,2,a); //经过IIC总线调出硬件地址为0XA0,子地址为tai*2的24C02中的数据高第一字节放在A[0]中第二字节放在A[1]中
else
rdnbyt(0xa0,ab*2+120,2,a);
if(a[0]==0xaa&&a[1]==0xaa)
{
ab=0;
if(band==fm)
rdnbyt(0xa0,ab*2,2,a); //经过IIC总线调出硬件地址为0XA0,子地址为tai*2的24C02中的数据高第一字节放在A[0]中第二字节放在A[1]中
else
rdnbyt(0xa0,ab*2+120,2,a);
}
in0.in0.frq=a[0];
in0.in0.frq=(in0.in0.frq<<8)|(0x00ff&a[1]);//将调出的两个字节频率值付给in0.in0.frq
iniband();
iniband1(band);
e=stepserch(1,in0.in0.frq);
vfd_clean();
display();
remkey=0x00;
if(band==fm)
ab_fm=ab;
else
ab_am=ab;
}
void station_search(bit reuse,bit dir) //电台搜索并存储
{
mute_(on);
pub();
if(band==am)
{
iniband();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -