📄 main.c
字号:
/****************************************Copyright (c)**************************************************
p0.2 p0.3 cat1025存储
p0.11 p0.14 收音模块i2c总线
p0.4 p0.5 p0.6液晶控制线
p1.16-p1.23 液晶数据线
p0.15-p0.19 键盘扫描输出端(行)
p0.20-p0.23 键盘扫描采样输入端(列)
p0.7 数字电位器x9313wp的cs端(低有效)
p0.8 数字电位器x9313wp的w/~d
p0.9 数字电位器x9313wp的INC端(平时为高)
尚且空余的引脚
p0.0 p0.1留作串口
p0.12 p0.13 p0.25 p0.26 p0.27 p0.28 p0.29 p0.30 p0.31 p1.24 p1.25
********************************************************************************************************/
#include "config.h"
#include "I2C1INT.h"
#include "tea5767_driver.h"
#include "1602driver.h"
#include "remote.h"
#include "key_driver.h"
/******部分全局变量定义****/
#define CAT1025 0xA0 /* CAT1025器件从机地址*/
enum state {channel,vol,search,turn,zidong,jiajian}state1=channel;
/******开机画面显示******/
void display_init(void)
{
save_cgram(cg1,0);
save_cgram(cg2,1);
save_cgram(cg3,2);
display_string(0,1,date);
display_cgram(4,1,0);
display_cgram(6,1,1);
display_cgram(9,1,2);
delay_ns(100);
display_string(0,0,string3);
delay_ns(100);
display_clear();
display_string(0,0,string4);
}
/*****显示电台信息******/
void show_radio(void)
{
display_clear();
display_num(0,0,((float)(fm_freq)/1000));
display_string(5,0,string1);
display_string(0,1,string2);
display_num(8,1,n);
}
/*****向cat1025写入num个字节的数据*/
void write_cat1025( uint32 suba, uint8 *s, uint32 num)
{
uint8 i,m,l,*p;
m=num%16;
i=num/16;
p=s+num-m;
for(l=0;l<i;l++)
{
I2C_WriteNByte(CAT1025, ONE_BYTE_SUBA, (suba+16*l),(s+16*l), 16);
delay_ns(200);
}
I2C_WriteNByte(CAT1025, ONE_BYTE_SUBA, (suba+num-m), p,m);
}
/*****从cat1025读出num个字节的数据*/
void read_cat1025( uint32 suba, uint8 *s, uint32 num)
{
uint8 i,m,l,*p;
m=num%16;
i=num/16;
p=s+num-m;
for(l=0;l<i;l++)
{
I2C_ReadNByte(CAT1025, ONE_BYTE_SUBA, (suba+16*l), (s+16*l), 16);
delay_ns(200);
}
for(;m>0;m--)
I2C_ReadNByte(CAT1025, ONE_BYTE_SUBA, (suba+num-m), p,m);
}
/******检测有效电台数量****/
uint8 check_avail_channel(void)
{
uint8 i;
for(i=0;i<max_num;i++)
{
if(station[i]<77000||station[i]>108000)
return (i-1);
}
return max_num;
}
/*******删除电台********/
void delate_station(void)
{
uint8 i,m;
i=check_avail_channel();
if(n<i)
for(m=n;m<i;m++)
station[m]=station[m+1];
else
station[n]=0;
}
/*******保存电台********/
void save_to_station(void)
{
uint8 i;
uint8 tmp_station[4*max_num];
for(i=0;i<12;i++)
{
tmp_station[((4*i)+0)]=(uint8)(station[i]>>24);
tmp_station[((4*i)+1)]=(uint8)(station[i]>>16);
tmp_station[((4*i)+2)]=(uint8)(station[i]>>8);
tmp_station[((4*i)+3)]=(uint8)(station[i]);
}
delay_ns(200);
// n=0;
write_cat1025(0x00, tmp_station, 4*max_num);
delay_ns(200);
I2C_WriteNByte(CAT1025, ONE_BYTE_SUBA, 4*max_num, &n,1);
delay_ns(200);
for(i=0;i<48;i++)
tmp_station[i]=0;
}
/*****跳到预置电台******/
void goto_pre_station(void)
{
uint8 i;
uint8 tmp_station[4*max_num];
read_cat1025(0x00, tmp_station, 4*max_num);
delay_ns(200);
I2C_ReadNByte(CAT1025, ONE_BYTE_SUBA, 4*max_num, &n,1);
delay_ns(200);
for(i=0;i<max_num;i++)
{
station[i]=(uint32)((tmp_station[((4*i)+0)]<<24)
|(tmp_station[((4*i)+1)]<<16)
|(tmp_station[((4*i)+2)]<<8)
|(tmp_station[((4*i)+3)]));
}
/*if(station[0]==0)
{
display_string(0,0,string4);
auto_scan(1);
display_clear();
display_string(6,0,string5);
save_to_station();
n=0;
}*/
fm_freq=station[n];
fm_hilo_optimal();
set_freq();
show_radio();
display_string(9,0,string_channel);
}
/*********数字电位器x9313wp的管脚初始化****/
void x9313_init(void)
{
PINSEL0=PINSEL0&0xfff03fff;
IO0DIR|=(1<<7)|(1<<8)|(1<<9);
IO0SET=1<<9;
}
void vol_up(void)
{
IO0CLR=1<<7;
IO0SET=1<<8;
IO0SET=1<<9;
delay_ns(10);
IO0CLR=1<<9;
delay_ns(10);
IO0SET=1<<9;
IO0SET=1<<7;
}
void vol_down(void)
{
IO0CLR=1<<7;
IO0CLR=1<<8;
IO0SET=1<<9;
delay_ns(10);
IO0CLR=1<<9;
delay_ns(10);
IO0SET=1<<9;
IO0SET=1<<7;
}
int main (void)
{
uint8 i;
uint32 freq_temp=0;
/*初始化各个模块*/
lcd_init();
tea5767_init();
key_init();
x9313_init();
//remote_init();
/*显示开机画面*/
display_init();
turn_on_tea5767();
fm_freq=93100;
fm_hilo_optimal();
set_freq();
display_clear();
show_radio();
/*跳到预置电台*/
//goto_pre_station();
while(1)
{
get_key();
delay_ns(10);
/* if(key==10) //自动搜索
{
display_string(0,0,string4);
auto_scan(1);
display_clear();
display_string(6,0,string5);
delay_ns(100);
fm_freq=station[n];
fm_hilo_optimal();
set_freq();
display_clear();
show_radio();
display_string(9,0,string_vol);
}*/
/* if(key==12) //静音
{
check_mute();
}*/
/* if(key==13) //增加一个电台
{
i=check_avail_channel()+1;
station[i]=station[n];
n=i;
fm_freq=station[n];
fm_hilo_optimal();
set_freq();
show_radio();
}*/
if(key==14)
{ switch(state1)
{
case vol: state1=channel;display_string(9,0,string_channel);break;
case channel:state1=search; display_string(9,0,string_search);break;
case search: state1=turn; display_string(9,0,string_turn);break;
case turn: state1=zidong; display_string(9,0,string_zidong);break;
case zidong: state1=jiajian; display_string(9,0,string_jiajian);break;
case jiajian: state1=vol; display_string(9,0,string_vol);break;
default:break;
}
}
if(key==15)
{
switch(state1)
{
case vol:vol_up();break; //音量加
case channel: //电台加
if(n<check_avail_channel())
goto_station(1+(n++));
else
goto_station(n=0);
show_radio();
break;
case search: //搜索下一个电台
fm_auto_scan(1);
//fm_freq=fm_freq-100;
station[n]=fm_freq;
show_radio();
break;
case turn: //微调电台频率
fm_manual_scan(1);
station[n]=fm_freq;
show_radio();
break;
case zidong: //自动搜索电台
display_string(0,0,string4);
auto_scan(1);
display_clear();
display_string(6,0,string5);
delay_ns(100);
fm_freq=station[n];
fm_hilo_optimal();
set_freq();
display_clear();
show_radio();
display_string(9,0,string_vol);
break;
case jiajian: //自动搜索电台
i=check_avail_channel()+1;
station[i]=station[n];
n=i;
fm_freq=station[n];
fm_hilo_optimal();
set_freq();
show_radio();
break;
default:break;
}
}
if(key==16)
{
switch(state1)
{
case vol:vol_down();break; //音量减
case channel: //电台减
if((n>0)&&(n<=check_avail_channel()))
goto_station(-1+(n--));
else
goto_station(n=check_avail_channel());
show_radio();
break;
case search: //搜索上一个电台
fm_auto_scan(0);
// fm_freq=fm_freq+100;
station[n]=fm_freq;
show_radio();
break;
case turn: //微调电台频率
fm_manual_scan(0);
station[n]=fm_freq;
show_radio();
break;
case zidong: //自动搜索电台
display_string(0,0,string4);
auto_scan(1);
display_clear();
display_string(6,0,string5);
delay_ns(100);
fm_freq=station[n];
fm_hilo_optimal();
set_freq();
display_clear();
show_radio();
display_string(9,0,string_vol);
break;
case jiajian: //自动搜索电台
delate_station();
break;
default:break;
}
}
if(key==17)
{
check_mute(); //静音
// delate_station();//删除电台
}
if(key==18) //保存电台
{
//save_to_station();
}
if(key<=9)
{
freq_temp=(freq_temp+key)*10;
}
if(key==19) //确定
{
if(freq_temp>=770000&&freq_temp<=1080000)
{
fm_freq=freq_temp/10;
station[n]=fm_freq;
}
else if(freq_temp<=1000)
if(station[(freq_temp/10)]>=77000&&station[(freq_temp/10)]<=108000)
{
n=freq_temp/10;
fm_freq=station[n];
}
fm_hilo_optimal();
set_freq();
show_radio();
freq_temp=0;
}
delay_ns(200);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -