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

📄 key_panel.c

📁 非常好的电源管理和按键处理
💻 C
字号:
/*--*----*----*----*----*----*----*----*----*----*----*----*----*----*----*----*/
/*                                                                                                                                                  */
/*                        KEY_PANEL.C                                                            */
/*                                                                                                                                                  */
/*--*----*----*----*----*----*----*----*----*----*----*----*----*----*----*----*/
#define GLOBALS_PANEL
#include "include.h"

#define AD_START_VALUE    0X10			//这个开始值还要计算
#pragma CONST_SEG DEFAULT

/*
#define NUM_AD1   4
#if 0
const int8u AD_KeyValue_Table1[NUM_AD1][3]=
{
	{0X19-9,0X19+9,K_MODE},
	{0X33-9,0X33+9,K_MENU},
	{0X45-9,0X45+9,K_LEFT},
	{0X55-9,0X55+9,K_RIGHT},
									//{0X68-9,0X68+9,K_MODE},
									//{0X7F-9,0X7F+9,K_AV},	
};
#endif
*/
#pragma CODE_SEG DEFAULT

/*
static void Set_Key_Property(int8u source,int8u value)
{
	if(source>=NUMOFKEYSOURCE)
	{
		source=0;
		value=NO_KEY;
	}
	if(value!=NO_KEY)
	{
		SetBit(Key_Status,source);
	}
	else
	{
		ClrBit(Key_Status,source);
	}
	g_Key[source].Value=value;		//获取键值、键源、时间
	g_Key[source].Time=0;
	return;
}

static void Key_Power_Scan(void)
{
	#define POWERKEY_MASK_VALUE   0b00000111
	static int8u PowerKey_count;
	PowerKey_count<<=1;
	if(KEY_POWER_Val==0)
		PowerKey_count|=0b00000001;

	//Set key property:status,time,value
	if(ValBit(Key_Status,PANEL_POWER))
	{
		if((PowerKey_count&POWERKEY_MASK_VALUE)==0B00000000)
		{
			Set_Key_Property(PANEL_POWER,NO_KEY);
		}
	}
	else
	{
		if(PowerKey_count==POWERKEY_MASK_VALUE)
		{
			Set_Key_Property(PANEL_POWER,K_POWER);			
		}
	}
	return;
}
*/
/*
static void Key_AD1_Scan(void)
{
#if 0
	#define AD1_MASK_VALUE        0B00000011
	
	int8u index1,CurrentValue;
	static int8u AD1_count;	
	index1=0;	
		CurrentValue=ADC_8b(ADCH_KEY1);		//获取AD后的键值ADCH_KEY==0
		if(CurrentValue>AD_START_VALUE)
		{
			//Testmode_KeyValueRefresh(CurrentValue);	开始不做测试
			for(;;)
			{
				if(CurrentValue<AD_KeyValue_Table1[index1][0])
				{
					index1=0;
					break;
				}
				if(CurrentValue<=AD_KeyValue_Table1[index1][1])
				{
					index1++;
					break;
				}
				index1++;
				if(index1<NUM_AD1)continue;			//NUM_AD1==>AD口上挂的键数
				index1=0;
				break;
			}
		}
	AD1_count<<=1;

	#define MaskValue CurrentValue
	MaskValue=AD1_MASK_VALUE;


	//键值变化一定次数后(包括变为0后),使键值等于新的键值。
	//AD1_mem的目的,是在同一个AD上,旧键尚未释放,新键又按下时,使键值等于新的按键
	//if(AD1_mem!=index1)
	//{
	//	if((AD1_count&MaskValue)==0B00000000)
	//		AD1_mem=index1;
	//}
	//else
	{
		if(index1)
		{
			AD1_count|=0B00000001;
		}
	}
		
	//Set key property:status,time,value
	if(ValBit(Key_Status,PANEL_AD))
	{
		if((AD1_count&MaskValue)==0B00000000)
		{
			Set_Key_Property(PANEL_AD,NO_KEY);
		}
	}
	else
	{
		if(AD1_count==MaskValue)
		{
			Set_Key_Property(PANEL_AD,AD_KeyValue_Table1[index1-1][2]);
		}	//AD键少扫的出口,键值和键源
	}
	return;
#endif
}
*/

//#include "net_key.c"
/*--------------------------------------------------------------------
描述:本按键处理中分三种键,第一种为按下到短键,每二种为长键,第三种为释放时响应的键,
			第三种键主要区别于一键有长和短合在一起时,如未到长键时采用释放时的状态来决定键
			有效
----------------------------------------------------------------------*/
typedef unsigned char UNCHAR;
typedef unsigned char BOOLEN;

#define SHORT_KEY	3
#define	VALID_KEY	SHORT_KEY-1
#define LONG_KEY	40//20//70//250
#define	LONG_KEY_MARGIN	5//13//60

#define	HAVE_KEY_SHORT	    0x01
#define	HAVE_KEY_LONG		0x02
#define	HAVE_KEY_FREE		0x04
#define	KEY_NEED_SEND		0x80
/*
#define	KEYCODE_MODE          0
#define	KEYCODE_MENU          1
#define	KEYCODE_UP            2
#define	KEYCODE_DOWN          3
#define	KEYCODE_IRIS          4
#define	KEYCODE_NULL		  5
*/
#define	KEYCODE_MENU          0
#define	KEYCODE_DOWN          1
#define	KEYCODE_UP            2
#define	KEYCODE_POWER         3
#define	KEYCODE_NULL		  4

const UNCHAR AD_KEYVALUE_TABLE[3][2]=
{ 
/*
   	{0X77-9,0X77+9},    //KEYCODE_MODE 
   	{0X45-9,0X45+9},    //KEYCODE_MENU 
   	{0X18-9,0X18+9},    //KEYCODE_UP   
	{0X33-9,0X33+9},   	//KEYCODE_DOWN 
   	{0X55-9,0X55+9},    //KEYCODE_IRIS 
*/						
   
   	{0X80-9,0X80+9},//menu_src
   	{0X56-9,0X56+9},//down
   	{0X2d-9,0X2d+9},//up
   	
};

UNCHAR	old_adc_key,new_adc_key,net_key_requit,valid_key=0;
UNCHAR	key_type_mark=0,message_button_key=0;
BOOLEN	flag_dl_reapeat=0;
//extern	UNCHAR led_buffer[LED_NUM];

void Read_Net_Key()
{
	static UNCHAR key_down_count=0;
	UNCHAR temp,i;
	new_adc_key=KEYCODE_NULL;
	if(KEY_POWER_Val) 
	{
	    new_adc_key=KEYCODE_POWER;
	}
	else
	if(nPowerState==SYSTEM_RUN)
	{
    	temp=ADC_8b(ADCH_KEY1);
     	for(i=0;i<3;i++)
    	{
    		if((temp<=AD_KEYVALUE_TABLE[i][1])&&(temp>=AD_KEYVALUE_TABLE[i][0]))
    		{
    		    new_adc_key=i;
    			break;
    		}
    	}
	}
	
	if(old_adc_key==new_adc_key)
	{
		if(LONG_KEY>=key_down_count)
		    key_down_count++;
		switch(key_down_count)	
		{
			case VALID_KEY:
				valid_key=new_adc_key;																	//有别的键按下,已加入去抖动功能
			    break;
			case SHORT_KEY:
				if(new_adc_key!=KEYCODE_NULL)
				{
					net_key_requit=valid_key;
					key_type_mark|=HAVE_KEY_SHORT|KEY_NEED_SEND;						//0x81;
					message_button_key=key_type_mark;
				}
				else
				{
					key_type_mark|=HAVE_KEY_FREE|KEY_NEED_SEND;							//0x84;
					message_button_key=key_type_mark;
					key_type_mark=0;
				}
			    break;
			case LONG_KEY:
				if(new_adc_key!=KEYCODE_NULL)
				{
					if(valid_key==KEYCODE_MENU||valid_key==KEYCODE_POWER) //these 2 keys not repeat.
					    key_down_count=LONG_KEY;
					else 
					    key_down_count=LONG_KEY-LONG_KEY_MARGIN;
					    
					key_type_mark|=HAVE_KEY_LONG|KEY_NEED_SEND;							//0x82;
					message_button_key=key_type_mark;
				}
				else
				{
				    key_type_mark=0;
				}
			break;
			default:
/*   				if((message_button_key&0x07)==(HAVE_KEY_LONG|HAVE_KEY_SHORT)
   				    &&new_adc_key==KEYCODE_NULL
   				    )//060801;
				{
					key_type_mark|=HAVE_KEY_FREE|KEY_NEED_SEND;							//0x84;
					message_button_key=key_type_mark;
					key_type_mark=0;
				}   //060801;
*/
			break;
		}
	}
	else
	{
		old_adc_key=new_adc_key;
		key_down_count=0;
		//led_buffer[0]=0;
		//led_buffer[1]=0;
	}
//	return(temp);
}
UNCHAR Net_Code_Process(void)
{
	UNCHAR	message_key=KEY_NULL;
	//if(nPowerState!=SYSTEM_RUN&&net_key_requit!=KEYCODE_POWER) 
	//    return KEY_NULL;
	    
	if(message_button_key&KEY_NEED_SEND)
	{
	    //Printf_Debug(1,0,message_button_key&0x07);//debug;
		switch(message_button_key&0x07)
		{
			case HAVE_KEY_SHORT:									//短键												//shortkey
    			flag_dl_reapeat=0;
    			switch (net_key_requit)
    			{
    				case KEYCODE_UP:
    					message_key=KEY_UP;
    				break;
    				case KEYCODE_DOWN:
    					message_key=KEY_DOWN;
    				break;
    				case KEYCODE_POWER:
        				if(!Main_Power())
        				    message_key=KEY_POWER;
                    break;
    				default:
    				    break;
    			}
    			break;

        	case HAVE_KEY_LONG|HAVE_KEY_SHORT:									//长键和连键																	// longkey
				switch (net_key_requit)
    			{
    				case KEYCODE_UP:
    					message_key=KEY_UP;
    				break;
    				
    				case KEYCODE_DOWN:
    					message_key=KEY_DOWN;
    				break;
    				
    				case KEYCODE_MENU:
    					message_key=KEY_SOURCE;
                    break;
    				case KEYCODE_POWER:
    					message_key=KEY_POWER;
    				break;
    				
    				default:
    				break;
    			}
    			flag_dl_reapeat=1;					//长键重复禁止标志,根据各键需要而定
    			break;
    		case HAVE_KEY_FREE|HAVE_KEY_SHORT:		//短键和长键之间							//free key
    			switch (net_key_requit)
    			{
    			    
    				case KEYCODE_MENU:
    				    message_key=KEY_MENU;
    				    break;
    				case KEYCODE_POWER:
    				    if(Main_Power())
    				    {
        					message_key=KEY_MUTE;
        				}
    				break;
    				default:
    				    break;
    			}
    			break;
    		/*
    		case HAVE_KEY_SHORT|HAVE_KEY_LONG|HAVE_KEY_FREE:								//长键																						//free key
    		    Printf_Debug(1,3,2);//debug;
    			switch (net_key_requit)
    			{
    		        case KEYCODE_MENU:
    		            Printf_Debug(1,6,3);//debug;
    					message_key=KEY_SOURCE;
    				default:
    				    break;
    				break;
    			}
    			break;
    		*/
			default:
    			break;
		}//switch(message_button_key&0x07)
		message_button_key=0;
	}//if(message_button_key&KEY_NEED_SEND)
	//Printf_Debug(3,0,message_key);//debug;
	/*
	{//debug;
	    extern int8u Video_Format_mem;
	    if(message_key==KEY_MENU)
	    { Video_Format_mem++;
    	    if(Video_Format_mem>2) Video_Format_mem=0;
    	    Load_CVBS_Format();
	    }
	    Printf_Debug(1,0,Video_Format_mem);
	}*/
	return	message_key;
	//return	net_key_requit;
}






extern void Key_panel(void)
{
	//Key_AD1_Scan();	
	Read_Net_Key();
	//Key_Power_Scan();	
	return;
}

⌨️ 快捷键说明

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