📄 drvkeybscan_f035.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"
#define KEYB_GPIO_PLAY GPIO_14
#define KEYB_GPIO_MODE GPIO_4
#define KEYB_ALL_GPIO (KEYB_GPIO_PLAY|KEYB_GPIO_MODE)
#define MAIN_KEYBOARD_LOCK 0x80
#define KEY_DURATION_LONG_PRESS 15//有效长按保持时间
//ADCIN0支持4个按键+2个组合键:
//电压分别为: S4(UP) 2.25V; S5(DOWN)1.29V;S8(Menu) 1.93V;
//ADCIN1支持3个按键+2个组合键:
//电压分别为: S6(Left) 2.25V; S7(Right)1.29V;
//ADC_CHANNEL_0
#define ADC_KEYB_MENU_MAX 0x0032 //MENU
#define ADC_KEYB_MENU_MIN 0x0000
//ADC_CHANNEL_1
#define ADC_KEYB_PREV_MAX 0x0332
#define ADC_KEYB_PREV_MIN 0x02CE
#define ADC_KEYB_NEXT_MAX 0x01EA
#define ADC_KEYB_NEXT_MIN 0x0186
//the key code must be continous to facilitate the software
#define KEYB_BIT_PLAY 0x000000001
#define KEYB_BIT_MODE 0x000000002
#define KEYB_BIT_MENU 0x000000004
//ADC_CHANNEL_1
#define KEYB_BIT_PREV 0x000000008
#define KEYB_BIT_NEXT 0x000000010
// 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_Mode,
Keyb_Code_Menu,
Keyb_Code_Prev,
Keyb_Code_Next
};
/*-------------------------------------------------------
* 函数: 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_hyhwGpio_Read(KEYB_GPIO_MODE))
{
KeyStatus |= KEYB_BIT_MODE;
}
if (Hyc_hyhwAdc_DetectKeyPad())
{//有按键
//----------------ADCCHANNEL0_KEY----------------
Hyc_hyhwAdc_CompulsoryRead(ADC_CHANNEL_0,&AdcKeyLev);
if(AdcKeyLev>=ADC_KEYB_NEXT_MIN &&
AdcKeyLev<=ADC_KEYB_NEXT_MAX)
{//NEXT
KeyStatus |= KEYB_BIT_NEXT;
}
}
if((KeyStatus&KEYB_BIT_MODE)&&(KeyStatus&KEYB_BIT_NEXT))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
--------------------------------------------------------------------------*/
S32 Hyc_drvKeyb_Scan(void)
{
S32 s32KeyStatus=0;
U32 status;
U32 AdcKeyLev;
//GPIO按键
status=Hyc_hyhwGpio_Read(KEYB_GPIO_PLAY);
if (status == 0)//PLAY
s32KeyStatus |= KEYB_BIT_PLAY;
status=Hyc_hyhwGpio_Read(KEYB_GPIO_MODE);
if (status == 1)//RECORD
s32KeyStatus |= KEYB_BIT_MODE;
//ADC按键
if (Hyc_hyhwAdc_DetectKeyPad())
{//有按键
//----------------ADCCHANNEL0_KEY----------------
Hyc_hyhwAdc_CompulsoryRead(ADC_CHANNEL_0,&AdcKeyLev);
if(AdcKeyLev>=ADC_KEYB_NEXT_MIN &&
AdcKeyLev<=ADC_KEYB_NEXT_MAX)
{//NEXT
s32KeyStatus |= KEYB_BIT_NEXT;
}
else if(AdcKeyLev>=ADC_KEYB_MENU_MIN &&
AdcKeyLev<=ADC_KEYB_MENU_MAX)
{//MENU
s32KeyStatus |= KEYB_BIT_MENU;
}
else if(AdcKeyLev>=ADC_KEYB_PREV_MIN &&
AdcKeyLev<=ADC_KEYB_PREV_MAX)
{//VOLUP
s32KeyStatus |= KEYB_BIT_PREV;
}
}
return s32KeyStatus;
}
/*============================ History List ================================
1. Rev 1.00.00.0000, 2004/02/02 10:24 HYCZJ
============================================================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -