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

📄 radio.c

📁 lc72130.收音机软件 #include "saa6588.c" #include "ba1924.c"
💻 C
📖 第 1 页 / 共 2 页
字号:
		do
		{
			status=0;
			radio_seek(band,&cur_freq,UP,&status,disp);
			if(status==0)	//搜索到台
			{
#ifdef DISP_PROGRESS
				disp_radio(dispBuff,(BYTE)(channel/6)+RADIO_TYPE_AM1,cur_freq);
#endif
				disp_char(dispBuff,DISP_CHANNEL,ASCII_NUM+(channel%6+1));
				if(channel%6==0)//修改每个波段的首个电台
				{
					bandLastFreq[regionIndex][channel/6+RADIO_TYPE_AM1-1]=cur_freq;
				}
#ifdef PRESET_SAVE_IN_RAM
				amPresetFreq[regionIndex][channel++]=(UINT16)(cur_freq);
#else
				eeprom_busy_wait();
				eeprom_write_word(amPresetFreq[0]+AM_COUNT*regionIndex+channel,cur_freq);
				channel++;
#endif
			}
		} while((channel<AM_COUNT) && (status==0));
	}
	if(channel && (status==SEARCH_UP_TO_END))
	{
		if(rds==OFF)//AMS
		{
			if((regionIndex==REGION_ORIT) && (sub_band>RADIO_TYPE_FM1))
				radio_set_channel(band,6);				//停留在第一个台
			else
				radio_set_channel(band,0);				//停留在第一个台
		}
	}
	if( ((band==AM) && (channel==AM_COUNT)) || ((band==FM) && (channel==FM_COUNT)) )//最多台
	{
		if(rds==OFF)
			radio_set_channel(band,0);				//停留在第一个台
	}
	if((status==SEARCH_BREAK))//如果不是用户中断且搜索到台//停留在最后搜索的频率
	{								
		pll_set_station(band,cur_freq);
		radio_save_last_station(sub_band,cur_freq);
	}
	if(rds && (status==SEARCH_UP_TO_END) && disp)
	{
		if(!rdsPTYSeek)
		{
			if(maxRdsFreq)
			{
				cur_freq = maxRdsFreq;
				pll_set_station(radioBand,maxRdsFreq);
				disp_radio(dispBuff,sub_band,maxRdsFreq);
			}
			//rds_clear_af();
			//返回最后频率
		}
	}
	//is_ams=0;
	bRadioInAMS = 0;//radioParam &= ~RA_IN_AMS;
	if(currentPower==_POWER_RADIO)
	{
//#ifndef DISP_PROGRESS
		disp_radio(dispBuff,sub_band,cur_freq);
		radio_is_preset(band,cur_freq);
//#endif
		audio_set_mute(OFF);
	}
}
void radio_seek_delay(char band,UINT16 freq)
{
	BYTE i;
	for(i=4;i>0;i--)
	{
		if(band==FM)
			pll_reset_CTE(band,freq-i*freqParam[regionIndex][FM_FREQ_STEP]);
		else
			pll_reset_CTE(band,freq-i*freqParam[regionIndex][AM_FREQ_STEP]);
#if defined(LCD_393)
		display();
#endif
		pll_is_station(band,freq);
	}
}

void radio_seek(char band,UINT16 * start_freq,BYTE dir,BYTE *status,BYTE disp)
{
	//BYTE i=0;
	//UINT16 curSmeter=0;
	disp_volume(0);		//清除当前音量显示值
#ifdef LCD_BIT_STEREO
	disp_set_bit(dispBuff,LCD_BIT_STEREO,OFF);//两个圈
#endif
#if defined(LCD_BIT_ANT)
	disp_set_bit(dispBuff,LCD_BIT_ANT,OFF);//两个圈
#endif
#ifdef LCD_BIT_CH
#ifndef LCD_316
	disp_set_bit(dispBuff,LCD_BIT_CH,OFF);//CH
#endif
#endif
	if(currentPower==_POWER_RADIO)
		display();
	bRadioSeeking  =1;//radioParam |= RA_SEEKING;
#ifndef DISP_PROGRESS
	disp_clr_led(dispBuff);
	//disp_string(dispBuff,"SEARCH",DISP_6CHAR_START,8);
	disp_string_E(dispBuff,strSearch,DISP_6CHAR_START,8);
	display();
#endif
	if(band==FM)
	{
		radio_set_loc(radioParam&RA_LOC);
		if(*start_freq>ORIT_JUMP_FREQ1)	//调整
		{
			while(((*start_freq+10) % freqParam[regionIndex][FM_FREQ_STEP]))//判断当前频率是整倍数
			{
				*start_freq+=freqParam[regionIndex][FM_FREQ_FINE];
			}
		}
		do
		{
			if(dir==UP)
			{
				if(*start_freq==ORIT_JUMP_FREQ1)//74->87.5
				{	
					*start_freq = ORIT_JUMP_FREQ2;
				}else{
					if(*start_freq>ORIT_JUMP_FREQ1) //76,87,...etc
					{
						*start_freq+=freqParam[regionIndex][FM_FREQ_STEP];//先+固定频率,然后设定,再判断是否锁定
					}else{
						if(*start_freq<ORIT_JUMP_FREQ1); //<74
							*start_freq += ORIT_LOW_STEP;
					}
				}
			}else{ //DOWN
				if((*start_freq==ORIT_JUMP_FREQ2) && (regionIndex==REGION_ORIT))
				{
					*start_freq = ORIT_JUMP_FREQ1;
				}else{
					if(*start_freq>ORIT_JUMP_FREQ1)	//>74
					{
						*start_freq-=freqParam[regionIndex][FM_FREQ_STEP];//先-固定频率,然后设定,再判断是否锁定
					}else{	//<74
						*start_freq -= ORIT_LOW_STEP;	//--1
					}
				}
			}
			//up to low
			if(*start_freq<freqParam[regionIndex][FM_FREQ_START])
			{
				*start_freq=freqParam[regionIndex][FM_FREQ_END];
				radio_seek_delay(band,*start_freq);
			}
			//up to high
			if(*start_freq>freqParam[regionIndex][FM_FREQ_END])
			{
				*start_freq=freqParam[regionIndex][FM_FREQ_START];
				radio_seek_delay(band,*start_freq);
				*status = SEARCH_UP_TO_END;
				if(bRadioInAMS)
				{
					break;
				}
			}
#ifdef DISP_PROGRESS
			if(disp)
			{
				if(bRadioInAMS)
				{
					disp_FM_data(dispBuff,*start_freq);
				}else{
					disp_radio(dispBuff,sub_band,*start_freq);
				}
			}
#endif
#ifdef DISP_PROGRESS
			disp_thread();//显示刷新
#endif
			//kb_thread();

			pll_reset_CTE(band,*start_freq);
			if(pll_is_station(band,*start_freq))// 计算IF校验是否假台
			{
				*status = FOUND_STATION;
				break;
			}
#ifdef LCD_BIT_STEREO
			disp_set_bit(dispBuff,LCD_BIT_STEREO,OFF);//两个圈
#endif
#if defined(LCD_BIT_ANT)
			disp_set_bit(dispBuff,LCD_BIT_ANT,OFF);//天线
#endif
			dvd_thread();
			rdsAFFlash = 1;//rdsParam |= AF_FLASH;
			sys_event_500ms();
			if(bit_is_clear(PIN_ACC_IN,ACC_IN))
			{
				bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;
				break;
			}
			kb_thread();
			if(keyParam&KEY_SEEK_MANUAL)		//搜索过程中避免手动操作超时
				seekManualTimeout = SEEK_MANUAL_TIMEOUT;
		}while(bRadioSeeking);
		radio_set_loc(OFF);// LOC OFF
	}else{	//AM
		do
		{
			if(dir==UP)
				*start_freq += freqParam[regionIndex][AM_FREQ_STEP];
			else
				*start_freq -= freqParam[regionIndex][AM_FREQ_STEP];

			if(*start_freq<freqParam[regionIndex][AM_FREQ_START])
			{
				*start_freq = freqParam[regionIndex][AM_FREQ_END];
				radio_seek_delay(band,*start_freq);
			}
			if(*start_freq>freqParam[regionIndex][AM_FREQ_END])
			{
				*start_freq = freqParam[regionIndex][AM_FREQ_START];
				radio_seek_delay(band,*start_freq);
				*status = SEARCH_UP_TO_END;
				if(bRadioInAMS)
				{
					break;
				}
			}
#ifdef DISP_PROGRESS
			if(bRadioInAMS)
				disp_AM_data(dispBuff,*start_freq);
			else
				disp_radio(dispBuff,sub_band,*start_freq);
#endif
			pll_reset_CTE(band,*start_freq);
			//以下在等待中频计数期间做其它任务
			dvd_thread();
			disp_thread();//in loop, need to reflash lcd
			sys_event_500ms();
			if(bit_is_clear(PIN_ACC_IN,ACC_IN))
			{
				bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;
				break;
			}
			kb_thread();
			if(keyParam&KEY_SEEK_MANUAL)
				seekManualTimeout = SEEK_MANUAL_TIMEOUT;
		}while((pll_is_station(band,*start_freq)==FALSE) && bRadioSeeking);
	}
	pll_set_station(band,*start_freq);
	radio_save_last_station(sub_band,*start_freq);
	if(!bRadioSeeking)
	{
		*status = SEARCH_BREAK;
		bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;
	}
	bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;
	//if(disp)
		//disp_radio(dispBuff,sub_band,*start_freq);
	//return start_freq;
}
BYTE seekStatus=0;
extern BYTE afDelayMs;
//搜索线程
void sys_event_seek(void)
{
	UINT rdsWaitLoops=0;
	if(currentPower==_POWER_RADIO)//仅在收音模式下工作
	{
		//短按事件
		if((keyParam&KEY_SEEK_FWD) || (keyParam&KEY_SEEK_REV))//短按释放
		{
			if(rdsTASeek)
				return;
			cur_channel=0xFF;
			bRadioInPreview = 0;//radioParam &= ~RA_PREVIEW;//如果预览则停止
			disp_char(dispBuff,DISP_CHANNEL,' ');//clear save channel flag
			if(!bRadioSeeking)
			{
				cur_channel=0xFF;
				//如果AF开启,FM,自动模式
				if(!(keyParam&KEY_SEEK_MANUAL))
				{
					muteStart=OFF;//防止静音被打开
					audio_set_mute(ON);
					beforeSeekFreq= cur_freq;//保存搜索前的频率
					if(rdsAFEnable && (radioBand==FM))//AF开启
					{
#ifdef _SUPPORT_RDS
						rdsActive = 0;//rdsParam &= ~RDS_ACTIVE;
						rds_clear();
						do{
							seekStatus=0;
							if(keyParam&KEY_SEEK_FWD)
							{
								radio_seek(radioBand,&cur_freq,UP,&seekStatus,ON);
							}else{
								radio_seek(radioBand,&cur_freq,DOWN,&seekStatus,ON);
							}
							if(seekStatus==0)//找到台
							{
								pll_set_station(radioBand,cur_freq);
								//display();
								rdsWaitLoops=0;
//#ifndef LA1844
								while(!rdsActive)
								{
									rdsWaitLoops++;
									if(rdsWaitLoops>WAIT_RDS_READY_LOOPS)
										break;
									sys_delay_loops(1);	
								}
								//sys_delay_loops(WAIT_RDS_READY_LOOPS);
								//delay_ms(1000);
								if(rdsActive)
								{
#ifdef USE_AF_SEEK_DELAY
									afDelayMs=AF_SEEK_DELAY;//重新置延迟数
#endif
									if(rdsTAEnable && rdsTAGet)
									{
										//rdsParam &= ~TA_SEEK;
										rdsTASeek = 0;
									}
									if(rdsAFEnable)
									{
										rdsAFSeek = 0;//rdsParam &= ~AF_SEEK;
									}
									disp_radio(dispBuff,sub_band,cur_freq);
									break;
								}
//#endif
								//seekStatus=SEARCH_BREAK;
								//break;
							}
						}while(seekStatus!=SEARCH_BREAK);
	#ifdef USE_AF_SEEK_DELAY
						afDelayMs=AF_SEEK_DELAY;	//重新置延迟数
	#endif
#endif
					}else{//AF关闭或AM
						seekStatus=0;
						if(keyParam&KEY_SEEK_FWD)
						{
							radio_seek(radioBand,&cur_freq,UP,&seekStatus,ON);
						}else{
							radio_seek(radioBand,&cur_freq,DOWN,&seekStatus,ON);
						}
						
					}
					//此处判断是用户中断还是找到台
					if(seekStatus==SEARCH_BREAK)//恢复
					{
						bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;
						keyParam &= ~KEY_SEEK_REV;
						keyParam &= ~KEY_SEEK_FWD;
						cur_freq = beforeSeekFreq;
						lastFreq = cur_freq;
						pll_set_station(radioBand,cur_freq);
						//disp_radio(dispBuff,sub_band,cur_freq);
						radio_save_last_station(sub_band,cur_freq);
						radio_is_preset(radioBand,cur_freq);
					}
					disp_radio(dispBuff,sub_band,cur_freq);
					radio_is_preset(radioBand,cur_freq);
					audio_set_mute(OFF);
				}else{//手工模式短按
					seekManualTimeout = SEEK_MANUAL_TIMEOUT;
#ifdef _SUPPORT_RDS
					rds_clear();
#endif
					if((keyParam&KEY_SEEK_FWD))
						radio_go_next(UP);
					else
						radio_go_next(DOWN);
				}
			}
			keyParam &= ~KEY_SEEK_FWD;
			keyParam &= ~KEY_SEEK_REV;
		}
		//长按事件
		if((keyParam&KEY_DEPRESS_FWD) || (keyParam&KEY_DEPRESS_REV))
		{
			bRadioInPreview = 0;//radioParam &= ~RA_PREVIEW;//如果预览则停止
#ifdef _SUPPORT_RDS
				//切换到手工模式
				rdsAFActive = 0;//rdsParam &= ~AF_ACTIVE;
				rds_clear();
#endif
			if(!(keyParam&KEY_SEEK_MANUAL))//自动模式
			{
				disp_clr_led(dispBuff);
				//disp_string(dispBuff,"MANUAL",DISP_6CHAR_START,6);
				disp_string_E(dispBuff,strManual,DISP_6CHAR_START,6);
				keyParam |= KEY_SEEK_MANUAL;
				seekManualTimeout = SEEK_MANUAL_TIMEOUT;
				display();
				delay_ms(1000);//显示MANUAL 1S
				disp_radio(dispBuff,sub_band,cur_freq);
			}else{//手工模式
				muteStart=OFF;//防止静音被打开
				audio_set_mute(ON);
				//beforeSeekFreq= cur_freq;//保存搜索前的频率
				seekStatus=0;
				if(keyParam&KEY_DEPRESS_FWD)
				{
					radio_seek(radioBand,&cur_freq,UP,&seekStatus,ON);
				}else{
					radio_seek(radioBand,&cur_freq,DOWN,&seekStatus,ON);
				}
				//此处判断是用户中断还是找到台
				if(seekStatus==SEARCH_BREAK)//恢复
				{
					bRadioSeeking = 0;//radioParam &= ~RA_SEEKING;
					keyParam &= ~KEY_SEEK_REV;
					keyParam &= ~KEY_SEEK_FWD;
					//cur_freq = beforeSeekFreq;
					lastFreq = cur_freq;
					pll_set_station(radioBand,cur_freq);
					//disp_radio(dispBuff,sub_band,cur_freq);
					radio_save_last_station(radioBand,cur_freq);
				}
				disp_radio(dispBuff,sub_band,cur_freq);
				audio_set_mute(OFF);
			}
			keyParam &= ~KEY_DEPRESS_FWD;
			keyParam &= ~KEY_DEPRESS_REV;
		}
		//radio_is_preset(radioBand,cur_freq);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -