📄 keyboard.c
字号:
/**********************************************************************
*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 + -