📄 drvkeybscan_f026.c
字号:
/*************************************************************
%
% Filename : DrvKeybScan.c
% Project name : part of the lower key driver of GUI part of hyctron, manage the input key scanning
%
% Copyright 2003 Hyctron Electronic Design House,
% "Hyctron Electronic Design House" Shanghai, China.
% All rights are reserved. Reproduction in whole or in part is prohibited
% without the prior written consent of the copyright owner.
%
% Rev Date Author Comments
% (yymmdd)
% -------------------------------------------------------------
% 001 040128 HYCZJ Primary version
% -------------------------------------------------------------
%
% This source file contains the key process part of the GUI
%
****************************************************************/
#include "Interface.h"
#include "KeyCodeEvent.h"
#include "drvKeyb.h"
// 最底层键的定义,键的GPIO的定义,这里定义了
// 1。键盘使用的GPIO值
// 2。GPIO值和具体的键值的关系表
#define KEYB_GPIO_RECORD GPIO_4
#define KEYB_GPIO_PLAY GPIO_14
#define KEYB_ALL_GPIO (KEYB_GPIO_PLAY|KEYB_GPIO_RECORD)
#define MAIN_KEYBOARD_LOCK 0x80
#define KEY_DURATION_LONG_PRESS 15//有效长按保持时间
//ADCIN0支持4个按键+2个组合键:
//电压分别为:S7(Menu) 0V;S5(VOLDOWN)1.29V; S6(A)1.93V;S4(VOLUP) 2.25V;
// VOLDOWN与A同时按下:1.04V;VOLUP与A同时按下:1.59V;
//ADCIN1支持4个按键和2个组合键:
//电压分别为:S11(ESC):0V; S9(Right)1.29V; S10(B)1.93V; S8(Left) 2.25V;
// RIGHT与B同时按下:1.04V;LEFT与B同时按下:1.59V;
//ADC按键的AD值:AD转换值=(V/VREF)*2^10),满电压检测
//AD值扩展0x1A
//-----------ADC_CHANNEL_0--------------
#define ADC_KEYB_MENU_MAX 0x01A
#define ADC_KEYB_MENU_MIN 0x000
#define ADC_KEYB_EQVOLDOWN_MAX 0x17C //A+VOLDOWN
#define ADC_KEYB_EQVOLDOWN_MIN 0x148
#define ADC_KEYB_VOLDOWN_MAX 0x1D2 //VOLDOWN
#define ADC_KEYB_VOLDOWN_MIN 0x19E
#define ADC_KEYB_EQVOLUP_MAX 0x238 //A+VOLUP
#define ADC_KEYB_EQVOLUP_MIN 0x204
#define ADC_KEYB_EQ_MAX 0x2AC //A
#define ADC_KEYB_EQ_MIN 0x278
#define ADC_KEYB_VOLUP_MAX 0x31A
#define ADC_KEYB_VOLUP_MIN 0x2E6
//-------------ADC_CHANNEL_1------------
#define ADC_KEYB_ESC_MAX 0x01A
#define ADC_KEYB_ESC_MIN 0x000
#define ADC_KEYB_MODENEXT_MAX 0x17C //B+NEXT
#define ADC_KEYB_MODENEXT_MIN 0x148
#define ADC_KEYB_NEXT_MAX 0x1D2 //RIGHT
#define ADC_KEYB_NEXT_MIN 0x19E
#define ADC_KEYB_MODEPREV_MAX 0x238 //B+PREV
#define ADC_KEYB_MODEPREV_MIN 0x204
#define ADC_KEYB_MODE_MAX 0x2AC //B
#define ADC_KEYB_MODE_MIN 0x278
#define ADC_KEYB_PREV_MAX 0x31A //LEFT
#define ADC_KEYB_PREV_MIN 0x2E6
/* ETO300 Key Definition --------------------------------------------------
Hardware BUT1 BUT2 BUT3 BUT4 BUT5 BUT6 BUT7
KEY_BIT 0x01 0x02 0x04 0x08 0x10 0x20 0x40
KeyIndex 1 2 3 4 5 6 7 (get from KeyBit by shift, Hardware)
KeyCode Play EQ/FM REC REW FF Vol+ Vol-
------------------------------------------------------------------*/
// this table is important to seperate the hardware key bitmask and high layer software
// Key code definition
const U8 gdrvKeyb_u8KeycodeTable[] =
{
0,
Keyb_Code_Play,
Keyb_Code_Record,
Keyb_Code_Menu,
Keyb_Code_VolDown,
Keyb_Code_Eq,
Keyb_Code_VolUp,
Keyb_Code_Esc,
Keyb_Code_Next,
Keyb_Code_Mode,
Keyb_Code_Prev
};
/*-------------------------------------------------------
* 函数: drvKeyb_ScanInitialize
* 功能: Initialize the key matrix scan module
* 返回: cSSA_OK, initialization is successful
* 参数:
---------------------------------------------------------*/
U32 Hyc_drvKeyb_ScanInitialize(void)
{
Hyc_hyhwGpio_SetasGpio(KEYB_ALL_GPIO);
Hyc_hyhwGpio_SetIn(KEYB_ALL_GPIO);
Hyc_hyhwAdc_Init();
return 0;
}
static U8 LastHoldKey=0;
/*------------------------------------------------------------------------
* 函数: drvKeyb_IsLocked
* 功能: To determine whether the local keypad should be locked.
* 返回: TRUE, the local keys are locked & no events will be generated.
FALSE, the local keys are operated normally.
* 参数:
--------------------------------------------------------------------------*/
U32 Hyc_drvKeyb_IsLocked(void)
{
/*
U8 HoldKey=0;
U32 KeyStatus=0,AdcKeyLev;
extern S8 s8LockedState;
extern U8 u8HoldTimer;
if (Hyc_hyhwAdc_DetectKeyPad())
{//有按键
//----------------ADCCHANNEL0_KEY----------------
Hyc_hyhwAdc_CompulsoryRead(ADC_CHANNEL_0,&AdcKeyLev);
if(AdcKeyLev>=ADC_KEYB_VOLUP_MIN &&
AdcKeyLev<=ADC_KEYB_VOLUP_MAX)
{//VOLUP
KeyStatus |= KEYB_BIT_VOLUP;
}
}
if(Hyc_hyhwAdc_DetectTouchSreen())
{
//----------------ADCCHANNEL1_KEY----------------
Hyc_hyhwAdc_CompulsoryRead(ADC_CHANNEL_1,&AdcKeyLev);
if (AdcKeyLev>=ADC_KEYB_MODE_MIN &&
AdcKeyLev<=ADC_KEYB_MODE_MAX)
{//MODE
KeyStatus |= KEYB_BIT_MODE;
}
}
if((KeyStatus&KEYB_BIT_VOLUP)&&(KeyStatus&KEYB_BIT_MODE))HoldKey=1;
if (HoldKey == 0)
{//无锁键按下,这时可能是按键后抬起
LastHoldKey = 0;
}
else
{//有锁键按下
if(LastHoldKey == 0)
{//上一次没有锁键按下
LastHoldKey = HoldKey;
u8HoldTimer = 0;
}
else
{//上一次有锁键按下
if(u8HoldTimer<=KEY_DURATION_LONG_PRESS)u8HoldTimer ++;
if(u8HoldTimer == KEY_DURATION_LONG_PRESS)
{
if(s8LockedState==0)
s8LockedState = MAIN_KEYBOARD_LOCK;
else
s8LockedState = 0;
}
}
}
return s8LockedState;
*/
return 0;
}
/*------------------------------------------------------------------------
* 函数: PowerOnKeyPressed
* 功能: 检测开机键是否按下
* 参数: none
* 返回: 0------开机键按下
* 非零------开机键没有按下
-------------------------------------------------------------------------*/
U32 Hyc_drvKeybPowerOnKeyPressed(void)
{
return Hyc_hyhwGpio_Read(KEYB_GPIO_PLAY);
}
/*------------------------------------------------------------------------
* 函数: drvKeyb_Scan()
* 功能: Scan the key matrix and return the status of keys
* 返回: 1bit error flag(MSB) + 31bit status pattern
a negative number, some errors happen but the pattern is still
available.
a positive number or zero, a 31bit pattern corresponds to the
status of keys. So the maximum number of keys is 31.
status bit = 1, which means this key button is pressed down.
status bit = 0, which means this key button is released.
* 参数:
--------------------------------------------------------------------------*/
S32 Hyc_drvKeyb_Scan( void )
{
S32 s32KeyStatus=0;
U32 status;
U32 AdcKeyLev;
//--------------GPIO按键--------------
status=Hyc_hyhwGpio_Read(KEYB_GPIO_PLAY);
if (status == 0)
s32KeyStatus |= KEYB_BIT_PLAY;
status=Hyc_hyhwGpio_Read(KEYB_GPIO_RECORD);
if (status == 1)
s32KeyStatus |= KEYB_BIT_RECORD;
//ADC按键
if (Hyc_hyhwAdc_DetectKeyPad())
{//有按键
//----------------ADCCHANNEL0_KEY----------------
Hyc_hyhwAdc_CompulsoryRead(ADC_CHANNEL_0,&AdcKeyLev);
if(AdcKeyLev>= ADC_KEYB_MENU_MIN &&
AdcKeyLev<=ADC_KEYB_MENU_MAX)
{//MENU
s32KeyStatus |= KEYB_BIT_MENU;
}
else if(AdcKeyLev>=ADC_KEYB_EQVOLDOWN_MIN &&
AdcKeyLev<=ADC_KEYB_EQVOLDOWN_MAX)
{//EQVOLDOWN
s32KeyStatus |= (KEYB_BIT_EQ|KEYB_BIT_VOLDOWN);
}
else if(AdcKeyLev>=ADC_KEYB_VOLDOWN_MIN &&
AdcKeyLev<=ADC_KEYB_VOLDOWN_MAX)
{//VOLDOWN
s32KeyStatus |= KEYB_BIT_VOLDOWN;
}
else if(AdcKeyLev>=ADC_KEYB_EQVOLUP_MIN &&
AdcKeyLev<=ADC_KEYB_EQVOLUP_MAX)
{//EQVOLUP
s32KeyStatus |= (KEYB_BIT_EQ|KEYB_BIT_VOLUP);
}
else if(AdcKeyLev>=ADC_KEYB_EQ_MIN &&
AdcKeyLev<=ADC_KEYB_EQ_MAX)
{//EQ
s32KeyStatus |= KEYB_BIT_EQ;
}
else if(AdcKeyLev>=ADC_KEYB_VOLUP_MIN &&
AdcKeyLev<=ADC_KEYB_VOLUP_MAX)
{//VOLUP
s32KeyStatus |= KEYB_BIT_VOLUP;
}
}
if(Hyc_hyhwAdc_DetectTouchSreen())
{
//----------------ADCCHANNEL1_KEY----------------
Hyc_hyhwAdc_CompulsoryRead(ADC_CHANNEL_1,&AdcKeyLev);
if (AdcKeyLev>=ADC_KEYB_ESC_MIN &&
AdcKeyLev<=ADC_KEYB_ESC_MAX)
{//ESC
s32KeyStatus |= KEYB_BIT_ESC;
}
else if(AdcKeyLev>=ADC_KEYB_MODENEXT_MIN &&
AdcKeyLev<=ADC_KEYB_MODENEXT_MAX)
{//MODENEXT
s32KeyStatus |= (KEYB_BIT_MODE|KEYB_BIT_NEXT);
}
else if(AdcKeyLev>=ADC_KEYB_NEXT_MIN &&
AdcKeyLev<=ADC_KEYB_NEXT_MAX)
{//NEXT
s32KeyStatus |= KEYB_BIT_NEXT;
}
else if(AdcKeyLev>=ADC_KEYB_MODEPREV_MIN &&
AdcKeyLev<=ADC_KEYB_MODEPREV_MAX)
{//MODEPREV
s32KeyStatus |= (KEYB_BIT_MODE|KEYB_BIT_PREV);
}
else if (AdcKeyLev>=ADC_KEYB_MODE_MIN &&
AdcKeyLev<=ADC_KEYB_MODE_MAX)
{//MODE
s32KeyStatus |= KEYB_BIT_MODE;
}
else if(AdcKeyLev>=ADC_KEYB_PREV_MIN &&
AdcKeyLev<=ADC_KEYB_PREV_MAX)
{//PREV
s32KeyStatus |= KEYB_BIT_PREV;
}
}
return s32KeyStatus;
} // drvKeyb_Scan()
/*============================ History List ================================
1. Rev 1.00.00.0000, 2004/02/02 10:24 HYCZJ
2. Seperate the GPIO15(line play key) from Main machine to Line in key
3. add #ifdef to compile different keyboard
============================================================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -