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

📄 drvkeybscan_f026.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"
#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 + -