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

📄 drvkeybscan_f035.c

📁 可以学习
💻 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 + -