⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 LPC2148控制tea5767收音模块的收音机的完整源程序
💻 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 + -