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

📄 hw_r2424key.c

📁 RK27驱动
💻 C
字号:
/******************************************************************/
/*   Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved.  */
/*******************************************************************
File	:  hw_keyboard.c
Desc	:  扫描按键消息\接口函数的实现
		  
Author	: huangxinyu
Date	: 2007-07-05
Notes	: 

$Log: hw_Rm970key.c,v $
Revision 1.1.1.1  2007/12/21 02:34:33  Lingzhaojun
12.21

Revision 1.2  2007/12/14 15:09:29  Hanjiang
rm972 pp后的版本上传

Revision 1.1.1.1  2007/12/11 14:19:29  cvsadmin
no message

Revision 1.1.1.1  2007/12/01 01:30:06  Lingzhaojun
no message

Revision 1.1  2007/11/26 14:30:11  Huangxinyu
改变matrixkey目录

Revision 1.10  2007/11/23 07:32:10  Huangshilin
no message

Revision 1.9  2007/11/07 13:28:05  Huangxinyu
两个按键同时按下问题的修改

Revision 1.8  2007/11/01 01:46:14  Huangxinyu
增加RK2706的兼容性

Revision 1.7  2007/10/24 09:20:06  Huangxinyu
根据LCD管脚冲突情况重新修改阵列按键

Revision 1.6  2007/10/20 04:46:31  Huangshilin
for RK2700

Revision 1.5  2007/10/16 04:16:49  Huangxinyu
阵列键盘调试完成提交

Revision 1.4  2007/10/15 09:16:37  Huangxinyu
根据RK27提交修改driver

Revision 1.3  2007/10/08 02:38:45  Lingzhaojun
添加版本自动注释脚本

*********************************************************************/

#include "include.h"
#include "hw_include.h"
#include "hw_R2424key.h"
#include "hw_gpio.h"
#include "hw_serial.h"
#include "hwapi_adc.h"

#include "hw_timer.h"

#if (KEY_TYPE == R2424KEY)

static  UINT8   gKeyPioState;                                                   /*  用于记录GPIO口用作keyboard之前的状态,在反初始化时可恢复 */
// gKeyPortValue[x][y] 的 x 用于记录上次按键和本次按键的状态 , y 用于记录MatrixKey_COL_1\MatrixKey_COL_2\MatrixKey_COL_3的按下值
UINT8   gKeyPortValue[2][3] = { {0x00,0x00,0x00},{0x00,0x00,0x00} };                /*	用于记录 按键 PIO 的状态,相应位为高表示按下,相应位为低表示没有按下或弹起 */
UINT8   gKeyPlayOnState = 0 ;

#if (CHIPTYPE == RK2700)
#define MatrixKey_ROW_1     GPIOPortA_Pin7    
#define MatrixKey_ROW_2     GPIOPortC_Pin6
#define MatrixKey_ROW_3     GPIOPortC_Pin5
#define MatrixKey_COL_1     GPIOPortC_Pin4
#define MatrixKey_COL_2     GPIOPortC_Pin3
#define MatrixKey_COL_3     GPIOPortC_Pin2
#define MatrixKey_COL_PORT      GPIOPortC
#define MatrixKey_COL_SHIFT      2
#define MatrixKey_COL_MASK       0x7
#elif(CHIPTYPE == RK2706)
#define MatrixKey_ROW_1     GPIOPortC_Pin4    
#define MatrixKey_ROW_2     GPIOPortC_Pin5
#define MatrixKey_ROW_3     GPIOPortC_Pin6
#define MatrixKey_COL_1     GPIOPortC_Pin3
#define MatrixKey_COL_2     GPIOPortC_Pin2
#define MatrixKey_COL_3     
#define MatrixKey_COL_PORT      GPIOPortC
#define MatrixKey_COL_SHIFT      2
#define MatrixKey_COL_MASK       0x3
#elif defined(LDK)
#define MatrixKey_ROW_1     GPIOPortA_Pin4    
#define MatrixKey_ROW_2     GPIOPortA_Pin5
#define MatrixKey_ROW_3     GPIOPortA_Pin6
#define MatrixKey_COL_1     GPIOPortA_Pin3
#define MatrixKey_COL_2     GPIOPortA_Pin2
#define MatrixKey_COL_3     GPIOPortA_Pin1
#define MatrixKey_COL_PORT      GPIOPortA
#define MatrixKey_COL_SHIFT      1
#define MatrixKey_COL_MASK       0x7
#else
#define MatrixKey_ROW_1
#define MatrixKey_ROW_2
#define MatrixKey_ROW_3
#define MatrixKey_COL_1
#define MatrixKey_COL_2
#define MatrixKey_COL_3
#define MatrixKey_COL_PORT
#define MatrixKey_COL_SHIFT
#define MatrixKey_COL_MASK
#endif

static UINT8 gMatrixKeyPin[] = {MatrixKey_ROW_1,MatrixKey_ROW_2,MatrixKey_ROW_3,MatrixKey_COL_1,MatrixKey_COL_2,MatrixKey_COL_3};
#ifdef ADC_KEY_EN	
static	INT16U		gKeyScanCode;	    /*	扫描码 */
static  INT16U		gKeyDownMsgSend;
extern unsigned short   AdcValue[4];
extern unsigned char 	AdcCurrChn;
#endif
extern UINT16 gSysState;
/**************************************************************************
* 函数描述: 矩阵按键初始化
* 入口参数: 无
* 出口参数: 无
* 返回值:   无
***************************************************************************/
extern INT16U			gKeyDownMsgSend;
void RockKey_PowerOnInit(void)
{
    gKeyPioState = GPIO_GetPortDirection(PIO_KEY);

 // 增加单独PC1口做PlayOn按键,设置为输入
    GPIO_SetPinDirection(GPIOPortC_Pin1, GPIO_IN);
    GPIO_SetPinDirection(GPIOPortC_Pin2, GPIO_IN);
    GPIO_SetPinDirection(GPIOPortC_Pin3, GPIO_IN);
    GPIO_SetPinDirection(GPIOPortC_Pin4, GPIO_IN);
//  GPIO_SetPinDirection(GPIOPortC_Pin5, GPIO_IN);
    GPIO_SetPinDirection(GPIOPortC_Pin6, GPIO_IN);

    GPIO_SetPinLevel(GPIOPortC_Pin1,GPIO_LOW);
    GPIO_SetPinLevel(GPIOPortC_Pin2,GPIO_LOW);
    GPIO_SetPinLevel(GPIOPortC_Pin3,GPIO_LOW);
    GPIO_SetPinLevel(GPIOPortC_Pin4,GPIO_LOW);
    GPIO_SetPinLevel(GPIOPortC_Pin6,GPIO_LOW);
	gKeyDownMsgSend = 0;
	#ifdef		ADC_KEY_EN
    //StartHWTimer(1/*timer1*/, 5/*mstick*/, ADC_KEY_TimerISR);
	#endif

}
/**************************************************************************
* 函数描述: 发送按键消息
*           
* 入口参数: UINT16 press , UINT16 KeyNo
* 出口参数: 无
* 返回值:   无
***************************************************************************/
void  FieldRockKeySendMsg(UINT16 press , UINT16 KeyNo)
{
	if(gSysState&SYS_LCD_OFF)	//黑屏先唤醒
	{
		if(KeyNo == 10)			//HOLD键另外处理
		{
			RockKeySendKeyMsg(press, KeyNo);
			return;
		}
		if(press == 1)
			return;
		else
			RockKeySendKeyMsg(press, 11);	//发送无效消息
		return;
	}
	else
	{
        RockKeySendKeyMsg(press, KeyNo);
		return;
	}
}
/**************************************************************************
* 函数描述: 矩阵按键硬件检测
*           矩阵扫描对于处于十字位置的3键不能检测
* 入口参数: 无
* 出口参数: 无
* 返回值:   无
***************************************************************************/

unsigned int	Key_Test_Value=0;

void RockKeyScanning( void )
{
	UINT8	keys;
	UINT8	press;
	UINT8   i,j;    
	UINT8   pioData;
#ifdef ADC_KEY_EN	
	if(!PowerOnOK) return;
#endif

//========================================================
#if	1//(KEY_NUM==FIVE_KEY)
pioData=0;
pioData=GPIO_GetPortLevel(GPIOPortC)&0x5e;
switch(pioData)
{
	case 0x02:
		pioData=1;
		break;
	case 0x04:
		pioData=2;
		break;
	case 0x08:
		pioData=3;
		break;
	case 0x10:
		pioData=4;
		break;
	default:
		pioData=0;
		break;
}
     if( pioData > 0)    // 检测到PlayOn按键按下
     {
          if( gKeyPlayOnState == 0)  // 原来是弹起状态
            {
               gKeyPlayOnState = pioData;             
				FieldRockKeySendMsg(1, pioData);
            }
     } 
     else
    {
          if( gKeyPlayOnState >pioData)  // 原来是按下状态
            {
               FieldRockKeySendMsg(0, gKeyPlayOnState);
               gKeyPlayOnState = 0;
            }
    } 
  #endif
//========================================================
#ifdef ADC_KEY_EN	
{

			UINT16  adcValue;	
		    adcValue = AdcValue[KEYBOARD_ADC];		   	   
			Key_Test_Value=adcValue;
			if( adcValue< 90+60 )//110
			{	

				if(gKeyDownMsgSend==0)
				{
					gKeyDownMsgSend = 1;
					gKeyScanCode = 5;
					FieldRockKeySendMsg(1, gKeyScanCode);
				}		
								
			}		    			
			else if( adcValue< 245+80 )//110
			{
				if(gKeyDownMsgSend==0)
				{
					gKeyDownMsgSend = 1;
					gKeyScanCode = 6;
					FieldRockKeySendMsg(1, gKeyScanCode);
				}				
								
			}
			else if( adcValue< 452+80 )//233
			{
				if(gKeyDownMsgSend==0)
				{
					gKeyDownMsgSend = 1;								
					gKeyScanCode = 7;
					FieldRockKeySendMsg(1, gKeyScanCode);
				}				
			}
			else if( adcValue< 635+40 )//365
			{
				if(gKeyDownMsgSend==0)
				{
					gKeyDownMsgSend = 1;													
					gKeyScanCode = 8;
					FieldRockKeySendMsg(1, gKeyScanCode);
				}				
			}
			else if( adcValue < 850+40)//608
			{
				if(gKeyDownMsgSend==0)
				{
					gKeyDownMsgSend = 1;								
					gKeyScanCode = 9;
					FieldRockKeySendMsg(1, gKeyScanCode);
				}				
			}
			else // 960
			{
				if(gKeyDownMsgSend)
				{
					gKeyDownMsgSend = 0;
					FieldRockKeySendMsg(0, gKeyScanCode);
					gKeyScanCode = 0;
				}
			} 
			
}
#endif			
}
//========================================================================
extern unsigned char AdcCurrChn = 0;
/**************************************************************************
* 函数描述: 读取通道AB的值和AD键数值
*           
* 入口参数: 无
* 出口参数: 无
* 返回值:   无
***************************************************************************/
void  ADC_KEYSCAN_READ(void)
{
    unsigned short adctemp;
 
//********************AD键读入判断*******************************   

    if(ADC_ReadData(&adctemp))
        AdcValue[AdcCurrChn] = adctemp;
    AdcCurrChn++;
    if(AdcCurrChn>=Adc_channel_max)
        AdcCurrChn = Adc_channel0;
    ADC_Start(AdcCurrChn,NULL);	
}	

/**************************************************************************
* 函数描述: 矩阵按键反初始化
* 入口参数: 无
* 出口参数: 无
* 返回值:   无
***************************************************************************/
void RockKey_PowerOffDeinit(void)
{
    GPIO_SetPortDirection(PIO_KEY,gKeyPioState); // restore key port 
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -