📄 key_panel.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 + -