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

📄 key.c

📁 用TEA7567做的调频收音机,本人经测试通过的
💻 C
字号:
#include "global.h"
#include "key.h"
	//获取键值程序
	  unsigned char Key_Process(void)
	  {
		Up_Key=1;   Down_Key=1;  //初始值
		_nop_();_nop_();
		if(!Up_Key)     //如果上键按下了   
		{
			if(Down_Key)     //第一种情况
		    {
                Delay_ms(20);//去抖动
				if(!Up_Key)//现在键值还是一样的话
				{
					Key_Down=1;//按下了
					Data_Change=0;//表示关键数据无改变了
					Count_5s=0;//用于计数5秒时间的,5秒到后才存数据
					Auto_Search_Flag=0;
					Count_500ms=0;
					Add_Process(); //加键处理程序
					if(Mode==0)	//在频率设置模式下时
						VolSet(Volume/2+19);//不要太大声了
//					if(Mode==0)	//在频率设置模式下时
//					{
						
//						Tuner_Preset (False,True,Low,gdwPresetVCO);
//   					}
					while(!Up_Key)//判断是否有松键
					{
							if(Long_Click==1)//长按成功了,用于手动设置频率的
							{
								if(Auto_Search_Flag==0)//如果不在自动搜频模式时
								{
									if(CountTime_Key>40)
									{
										CountTime_Key=0;
										Add_Process(); //加键处理程序
//										if(Mode==0) //在频率设置模式下时
//											Tuner_Preset(False,True,High,gdwPresetVCO);
										WatchDog;//喂狗	
									}
								}
								else //在自动搜索状态了,计时成功了
								{
									Autosearch_Up();
										
									while(!Up_Key)//判断是否有松键
									{
											WatchDog;//喂狗	
									}
									break;
								}
							
							}
						WatchDog;//喂狗	
					}
					Key_Down=0;//没按下
					Long_Click=0;//清长按
					//Count_500ms=0;
					CountTime_Key=0;//清长按时间的
					Count_Auto_Search=0;//清自动搜索的计时
					//Auto_Search_Flag=0;
					Data_Change=1;//表示关键数据有改变了
					if(Mode==0)
					{
						Delay_ms(200);//稍作延时
						VolSet(Volume+19);//还原应有的声音
					}
				    return 0;
				}
				
			 }
		 }
		 else
		 {
			 if(!Down_Key)  //如果下键按下了   //第二种情况
			 { 
				Delay_ms(20);//去抖动
				if(!Down_Key)//现在键值还是一样的话
				{
					Key_Down=1;//按下了
					Count_5s=0;//用于计数5秒时间的,5秒到后才存数据
					Data_Change=0;//表示关键数据无改变了
					Auto_Search_Flag=0;
					Count_500ms=0;
					Dec_Process();  //减键处理程序
					if(Mode==0)	//在频率设置模式下时
						VolSet(Volume/2+19);//不要太大声了
//					if(Mode==0)	//在频率设置模式下时
//					{
						
//						Tuner_Preset (False,True,Low,gdwPresetVCO);    // Preset to searched station 0301 mao
//					}
					while(!Down_Key)//判断是否有松键
					{
						if(Long_Click==1)//长按成功了
						{
							if(Auto_Search_Flag==0)//如果不在自动搜频模式时
							{
								if(CountTime_Key>30)
								{
									CountTime_Key=0;
									Dec_Process();  //减键处理程序								
//									Tuner_Preset(False,True,High,gdwPresetVCO);
									WatchDog;//喂狗	
								}
							}
							else //在自动搜索状态了,计时成功了
							{
									Autosearch_Down();
									WatchDog;//喂狗	
									while(!Down_Key)//判断是否有松键
									{
										WatchDog;//喂狗	
									}
									break;

							}
						}
						WatchDog;//喂狗

					}
					Key_Down=0;//没按下
					//Count_500ms=0;
					Long_Click=0;//清长按
					CountTime_Key=0;//清长按时间的
					Count_Auto_Search=0;//清自动搜索的计时
					Data_Change=1;//表示关键数据有改变了
					if(Mode<2)//在频率与音量模式 下时,在音量执行减少音量时,会有噪音,这是为了去噪音的
					{
						Delay_ms(200);//稍作延时
						VolSet(Volume+19);//还原应有的声音
					}
				    return 0;
				}
			 }
			 else
			 {
			 	Up_Key=0;  
				if(!Down_Key)//下键按下了//第三种情况功能切换键
			    {
				    Up_Key=1;   Down_Key=0;
				    if(!Up_Key)
					{
						Delay_ms(20);//去抖动
						if(!Up_Key)//现在键值还是一样的话
						{
							Mode++;        //显示状态的切换
							if(Mode>4)  Mode=0;							
						}
					}
					while(!Up_Key&&!Down_Key)//判断是否有松键
					{
						WatchDog;			//喂狗
					}
//					AutoS_LongClick=0;//清自动搜频长按开始计数标志
//					Count_Auto_Search=0;// 清自动搜频长按计数标志
					Data_Change=1;//有关键数据改变标志
					return 0;
					
			     }
		     }
		 }
		 //第三种情况*********************
			Band=1;
			_nop_();_nop_();
			if(Band==0)
			{
				Delay_ms(20);//去抖动
				if(Band==0) //还有键按下
				{
					Band_Data++;
					Count_5s=0;//用于计数5秒时间的,5秒到后才存数据
					Data_Change=0;//表示关键数据无改变了
					if(Auto_Search_Flag==1)
						Auto_Search_Flag=0;
					if(Band_Data>1)   
						Band_Data=0;//切换回默认状态
					Band_Change(Band_Data);//波段数据转换
				}
				while(Band==0)			//判断是否有松键
				{
					WatchDog;			//喂狗	
				}
				Data_Change=1;//有关键数据改变标志
				return 0;
			}
			
			return 0;
	}

		//加键程序
	  void Dec_Process(void)
	  {
	  	switch(Mode)//显示切换
		{ 
		  	case 0: {
					gdwPresetVCO=gdwPresetVCO-STEP;
					if(Band_Data==0)//是高高波段了
					{	
						if(gdwPresetVCO<Min_FreqH) 
							gdwPresetVCO=Max_FreqH;
						
					}
					else   //是低波段了
					{
						if(gdwPresetVCO<Min_FreqL) 
								gdwPresetVCO=Max_FreqL;
					}
					Frequency_Change(gdwPresetVCO);
					WatchDog;
					Tuner_Preset (False,True,Low,gdwPresetVCO);//向5767发码
//					Radio_Mode=1;//使能手动搜频功能
					}
					break;
		  	case 1: {
					if(Volume)
				 	{
						Volume--;						
						VolSet(Volume+19);
					}
					else
						VolSet(0);//不出声音了
					Volume_Change(Volume);
					}
					break;
		  	case 2:{
					Delay_s=Delay_s-1;
					if(Delay_s<10) Delay_s=250;
					Delays_change(Delay_s);
					}
					break;
		  	case 3: {
					District=District-1;
					if(District<1)District=128;
					District_Change(District);
					}
					break;
		  	case 4: {
					Node=Node-1;
					if(Node<1) Node=255;
					Node_Change(Node);
					}
					break;
		  	default:   break;
		}
	}
	
	//减键程序
	void Add_Process(void)
	{
	switch(Mode)//显示切换
		{ 
		   case 0: {
					gdwPresetVCO=gdwPresetVCO+STEP;
					if(Band_Data==0)//是高波段了
						{	
						if(gdwPresetVCO>Max_FreqH) 
							gdwPresetVCO=Min_FreqH;
						}
					else   //是低波段了
						{
						if(gdwPresetVCO>Max_FreqL) 
							gdwPresetVCO=Min_FreqL;
						}
					//gdwPresetVCO+=STEP;
					Frequency_Change(gdwPresetVCO);
					WatchDog;
					Tuner_Preset (False,True,Low,gdwPresetVCO);//向5767发码
//					Radio_Mode=1;//使能手动搜频功能
					}
					break;
		  	case 1: {
  					//Volume=Volume+1;
					if(Volume<68) Volume++;
					Volume_Change(Volume);
					VolSet(Volume+19);
					}
					break;
		  	case 2: {
					Delay_s=Delay_s+1;
					if(Delay_s>250) Delay_s=10;
					Delays_change(Delay_s);
					}
					break;
		  	case 3:{
					District=District+1;
					if(District>128) 
						District=1;
					District_Change(District);
					}
					break;
		  	case 4:{
					Node=Node+1;
					if(Node==0) Node=1;
					Node_Change(Node);
					}
					break;
		  	default:   break;
		}
	}

	/*
	void Radio_Process(void)
	{
		//uchar vol;
		//vol=(uchar)Volume/2;
		switch(Radio_Mode)
		{
			case 1:{
					Tuner_Preset(False,False,High,gdwPresetVCO);
					
				   }
					break; //手动搜台
			case 2:break;		 		 
			case 3:break;
			default: break;
		}
		Radio_Mode=0;//清搜台功能
	}
	*/

	bit SearchDelayMs(unsigned int Time)
      {
              unsigned char i;
              
              while( --Time != 0)
              {
                      for(i = 0; i < 125; i++); //i 从0加到125,CPU大概就耗时1 毫秒 。
					  WatchDog;
              
			  			if((Time%20)==0)//大约20ms检测一次
			  			{
			  				if((Up_Key!=1)||(Down_Key!=1))//如果有按下时,表示有人为的停下要求了
//							{
//								WatchDog;
//			  					
//							}
								return 1;//表示有键按下了
			  			}
			  }
			  return 0;//无键按下了
      }


⌨️ 快捷键说明

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