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

📄 keyboard.c

📁 用51单片机实现IR解码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********************************************************************
*File		Name		:	
*Creat		Time		:	
*Program	Author		:	
*File		Discreption	:	 
************************************************************************/

#include "common.h"
#include "main.h"
#include "key.h"
#include "Var.h"
#include "keyboard.h"

/*************************************************************
 Title: 		 Parse_Input_Key_Timer
 
	1.The timer is  increased by hardware TIMER2 with an unit  about 20ms.
	2.Once MCU check some key is pressed ,it the start.
	3.After MCU do not check any key for 150ms ,the timer is reseted.
	
***************************************************************/
 EX_DATA U8  FP_Key_Hold_Enable_Table[]=
{
	0,	//						KEY_FP_0=0x40,
	0,	//						KEY_FP_NEXT	   	=0x41,
	0,	//						KEY_FP_SEEK_DOWN	 	=	 0x42,
	0,	//						KEY_FP_STEREO	 	=0x43,
	0,	//						KEY_FP_RDS_DISPALY	=	0x44,
	0,	//						KEY_FP_PREVIOUS  	  	 =	 0x45,
	0,	//						KEY_FP_TRACK_DOWN	   =		0x46,
	0,	//						KEY_FP_AUTO_ALL 	  =		0x47,
	0,	//						KEY_FP_RDS_PTY	    =		 0x48,
	0,	//						KEY_FP_NOP1=	0x49,
	0,	//						KEY_FP_SEEK_UP	  =	0x4A,
	0,	//						KEY_FP_MUTE	  =	0x4B,
	1,	//						KEY_FP_TUNER_AREA	=	0x4C,
	0,	//						KEY_FP_NOP=	0x4D,
	0,	//						KEY_FP_TRACK_UP	    =	0x4E,
	1	//						KEY_FP_PROGRAM       	=0x4F,

};
#define HIGH_OUT_LOW_INPUT
#ifdef HIGH_OUT_LOW_INPUT
#define  SET_KEY_OUT0_LOW       P2=0xEF   //KEY_OUT0=0;// KEY_OUT1=1;KEY_OUT2=1;KEY_OUT3=1;
#define  SET_KEY_OUT1_LOW  	      P2=0xDF //KEY_OUT0=1; KEY_OUT1=0;KEY_OUT2=1;KEY_OUT3=1;
#define  SET_KEY_OUT2_LOW        P2=0xBF  //KEY_OUT0=1; KEY_OUT1=1;KEY_OUT2=0;KEY_OUT3=1;
#define  SET_KEY_OUT3_LOW        P2=0x7F //KEY_OUT0=1; KEY_OUT1=1;KEY_OUT2=1;KEY_OUT3=0;
#define  SET_KEY_OUT_CANCEL     P2=0xFF //KEY_OUT0=1; KEY_OUT1=1;KEY_OUT2=1;KEY_OUT3=1;
#define   KEY_INPUT_REGISTER      P2
#define GET_SIGNLE_KEY_TIMER 		0x80

void Get_Panel_Click_key()
{
 	U8 get_key_flag,  temp_key_code;
	
 	get_key_flag=0;
	temp_key_code=0xff;
	//check the first line input
                     switch(Key_Scan_Buffer0)
                	{
                	case 0x7:    //key4 presss
					    	Key_Code=0x44; // 0b 0100 0100
			//Tuner.FMFreq=4+9000;	 System_Flag_DispEvent=1; 
						break;
		      case 0xB:     //key3  press
					    	Key_Code=0x43;	// 0b 0100 0011	
			//	Tuner.FMFreq=3+9000;	 System_Flag_DispEvent=1; 
					    	break;
		        case 0xD:    	 //key2 presss
					    	Key_Code=0x42; // 0b 0100 0010
			//	Tuner.FMFreq=2+9000;	 System_Flag_DispEvent=1; 
			       		break;
			case 0xE:   //key1 presss
					    	Key_Code=0x41; // 0b 0100 0001
			//Tuner.FMFreq=1+9000;	 System_Flag_DispEvent=1;   	

						break;
                  	default:
					 	break;
                    	  }

			switch(Key_Scan_Buffer1)
                	{
                	case 0x7:    //key4 presss
					    	Key_Code=0x48; // 0b 0100 0100
						break;
		      case 0xB:     //key3  press
					    	Key_Code=0x47;	// 0b 0100 0011	
					    	break;
		        case 0xD:    	 //key2 presss
					    	Key_Code=0x46; // 0b 0100 0010
			       		break;
			case 0xE:   //key1 presss
					    	Key_Code=0x45; // 0b 0100 0001
						break;
                  	default:
					 	break;
                    	  }
			switch(Key_Scan_Buffer2)
                	{
                	case 0x7:    //key4 presss
					    	Key_Code=0x4C; // 0b 0100 0100
						break;
		      case 0xB:     //key3  press
					    	Key_Code=0x4B;	// 0b 0100 0011	
					    	break;
		        case 0xD:    	 //key2 presss
					    	Key_Code=0x4A; // 0b 0100 0010
			       		break;
			case 0xE:   //key1 presss
					    	Key_Code=0x49; // 0b 0100 0001
						break;
                  	default:
					 	break;
                    	  }
			switch(Key_Scan_Buffer3)
                	{
                	case 0x7:    //key4 presss
					    	Key_Code=0x50; // 0b 0100 0100
						break;
		      case 0xB:     //key3  press
					    	Key_Code=0x4F;	// 0b 0100 0011	
					    	break;
		        case 0xD:    	 //key2 presss
					    	Key_Code=0x4E; // 0b 0100 0010
			       		break;
			case 0xE:   //key1 presss
					    	Key_Code=0x4D; // 0b 0100 0001
						break;
                  	default:
					 	break;
                    	  }

			

		 	
}


void Get_Keyboard_Key()
{

          U8 temp_input;
	  BOOL  has_key_flag;

              has_key_flag=0;

			
		
	//scan the line0
       	SET_KEY_OUT0_LOW;
	
              Delay_xuS(1);
		temp_input=KEY_INPUT_REGISTER&0x0F;
		
		if(temp_input!=0x0F)
			{
			Key_Scan_Buffer0=temp_input;
			has_key_flag=1;
		//	   Tuner.FMFreq=Key_Scan_Buffer0+1000;	 System_Flag_DispEvent=1;
			}

	//scan the line1			
		SET_KEY_OUT1_LOW;

              Delay_xuS(1);
		temp_input=KEY_INPUT_REGISTER&0x0F;
		if(temp_input!=0x0F)
			{
			Key_Scan_Buffer1=temp_input;
			has_key_flag=1;
			//   Tuner.FMFreq=Key_Scan_Buffer1+2000;	 System_Flag_DispEvent=1;
			}
	//scan the line2
		SET_KEY_OUT2_LOW;
	
              Delay_xuS(1);
		temp_input=KEY_INPUT_REGISTER&0x0F;
		if(temp_input!=0x0F)
			  {
			  Key_Scan_Buffer2=temp_input;
			  has_key_flag=1;
			    // Tuner.FMFreq=Key_Scan_Buffer2+3000;	 System_Flag_DispEvent=1;
			  }
  	//scan he line3
	       SET_KEY_OUT3_LOW;
	       Delay_xuS(1);
		temp_input=KEY_INPUT_REGISTER&0x0F;
		if(temp_input!=0x0F)
			{
			Key_Scan_Buffer3=temp_input;
			has_key_flag=1;
			 //  Tuner.FMFreq=Key_Scan_Buffer3+4000;	 System_Flag_DispEvent=1;
			}

		SET_KEY_OUT_CANCEL;

		
	

		if(has_key_flag==1)
		{
		 Get_Key_Counter++;
	   	}
		else
		{
		No_Key_Counter++;
		}
		
            if(Enable_Get_Key==1)
            	{
		
			if(Get_Key_Counter>80)
				{

	                           if(Get_Key_Counter>No_Key_Counter+10)    //No_Key_Counter+10-100))
					{
						Get_Panel_Click_key();
						//Tuner.FMFreq=Key_Code-0x40+9000;	 System_Flag_DispEvent=1;   
						//Key_Code=0xff;
	                       	}
				      
					//process  the repeat key input 
				       if(Key_Code==KEY_FP_TRACK_DOWN
					   	||Key_Code==KEY_FP_TRACK_UP)
					  {
					           
                                   
						 	  if(Flag_Get_Hold_Key)
					            	{
					            	           //when get hold key ,we mask some key
								      if(Get_Key_Counter>80)
									 {
										         //the key is hold
										         No_Key_Counter=0;
											 Get_Key_Counter=0;
											// Key_Code=0xFF;
											
											  
		                                                   }
									else		
								 	        Key_Code=0xFF;
									
									 Need_Send_Single_Key=0;	
										
								 	
						        }
							 else
							  {      
							          Need_Send_Single_Key=1;
							                 Panel_Key_Backup=Key_Code;
							                 Key_Code=0xFF;
							            if(Get_Key_Counter>1000)
									  Flag_Get_Hold_Key=1;
							  }
						 						
							 Enable_Get_Key=1;
					            

				         }
				        else if(FP_Key_Hold_Enable_Table[Key_Code-0x40])    
						//	==KEY_FP_TUNER_AREA||Key_Code==KEY_FP_PROGRAM) 
					  {//process the Hold key

									//get the hold key and send it ,then disable the input until key release
							            if(Get_Key_Counter>3000)
								     {
									  Enable_Get_Key=0;
									 Need_Send_Single_Key=0;
									 Key_Code=Key_Code+0x80;
									
							            	}
							 		else
									{//only get the single press key,send the key after key release
							 		   Enable_Get_Key=1;
					            	                 Need_Send_Single_Key=1;
							                 Panel_Key_Backup=Key_Code;
							                 Key_Code=0xFF;

									}

					  }
					   else
					 {
				               Enable_Get_Key=0;
					         Get_Key_Counter=0;
	                                     No_Key_Counter=0;//No_Key_Counter=100;
                                         Flag_Get_Hold_Key=0;
					}

				}
            	}

		
		if(No_Key_Counter>10)//No_Key_Counter>130)
		{
			//Tuner.FMFreq=Get_Key_Counter;	 System_Flag_DispEvent=1;   	
                    Enable_Get_Key=1;
			No_Key_Counter=0;//No_Key_Counter=100;
			Get_Key_Counter=0;
			Flag_Get_Hold_Key=0;
			//send the backup key
			if( Need_Send_Single_Key)

⌨️ 快捷键说明

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