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

📄 hw_matrixkey.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_matrixkey.c,v $
Revision 1.1.1.1  2008/03/06 13:29:05  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_matrixkey.h"
#include "hw_gpio.h"
#include "hw_serial.h"

#include "hw_timer.h"

#if (KEY_TYPE == MATRIXKEY)

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};

/**************************************************************************
* 函数描述: 矩阵按键初始化
* 入口参数: 无
* 出口参数: 无
* 返回值:   无
***************************************************************************/
void RockKey_PowerOnInit(void)
{
    gKeyPioState = GPIO_GetPortDirection(PIO_KEY);
#if (CHIPTYPE == RK2700)
    // 行扫描配置  
    GPIO_SetPinDirection(MatrixKey_ROW_1, GPIO_OUT);     // 不扫描第0行
    GPIO_SetPinDirection(MatrixKey_ROW_2, GPIO_OUT);
    GPIO_SetPinDirection(MatrixKey_ROW_3, GPIO_OUT);
    GPIO_SetPinDirection(MatrixKey_COL_1, GPIO_IN);
    GPIO_SetPinDirection(MatrixKey_COL_2, GPIO_IN);
    GPIO_SetPinDirection(MatrixKey_COL_3, GPIO_IN);
    GPIO_SetPinLevel(MatrixKey_ROW_1,GPIO_LOW);
    GPIO_SetPinLevel(MatrixKey_ROW_2,GPIO_LOW);
    GPIO_SetPinLevel(MatrixKey_ROW_3,GPIO_LOW);
    GPIO_SetPinLevel(MatrixKey_COL_1,GPIO_LOW);
    GPIO_SetPinLevel(MatrixKey_COL_2,GPIO_LOW);
    GPIO_SetPinLevel(MatrixKey_COL_3,GPIO_LOW);
#elif (CHIPTYPE == RK2706)
    // 行扫描配置  
    GPIO_SetPinDirection(MatrixKey_ROW_1, GPIO_IN);    
    GPIO_SetPinDirection(MatrixKey_ROW_2, GPIO_IN);
    GPIO_SetPinDirection(MatrixKey_ROW_3, GPIO_IN);
    GPIO_SetPinDirection(MatrixKey_COL_1, GPIO_IN);
    GPIO_SetPinDirection(MatrixKey_COL_2, GPIO_IN);
    GPIO_SetPinLevel(MatrixKey_ROW_1,GPIO_LOW);
    GPIO_SetPinLevel(MatrixKey_ROW_2,GPIO_LOW);
    GPIO_SetPinLevel(MatrixKey_ROW_3,GPIO_LOW);
    GPIO_SetPinLevel(MatrixKey_COL_1,GPIO_LOW);
    GPIO_SetPinLevel(MatrixKey_COL_2,GPIO_LOW);
#endif
 // 增加单独PC1口做PlayOn按键,设置为输入
    GPIO_SetPinDirection(GPIOPortC_Pin1, GPIO_IN);

}

/**************************************************************************
* 函数描述: 矩阵按键硬件检测
*           矩阵扫描对于处于十字位置的3键不能检测
* 入口参数: 无
* 出口参数: 无
* 返回值:   无
***************************************************************************/
void RockKeyScanning( void )
{
	UINT8	keys;
	UINT8	press;
	UINT8   i,j;    
	UINT8   pioData;

   /* 
             COL1  COL2  COL3
      ROW1 ----|----|----|---
      ROW2 ----|----|----|---
      ROW3 ----|----|----|---

   */	
   // 行扫描  
#if (CHIPTYPE == RK2700)
  //  for ( i = 0; i < 3; i++ ) // i = 0~2 为行
    for ( i = 1; i < 3; i++ ) // i = 1~2 为行 , 由于第0行GPIOPortA_Pin7和LCD_VSync冲突,暂时不扫描第0行
#elif (CHIPTYPE == RK2706)
    for ( i = 0; i < 3; i++ ) // i = 0~2 为行
#endif
     {    
      
       GPIO_SetPinLevel(gMatrixKeyPin[i],GPIO_HIGH); // 依次设置ROW_1\ROW_2\ROW_3输出高电平
       GPIO_SetPinDirection(gMatrixKeyPin[i], GPIO_OUT);
    //   USDELAY(5);
       gKeyPortValue[0][i] = ( GPIO_GetPortLevel(MatrixKey_COL_PORT)>>MatrixKey_COL_SHIFT)& MatrixKey_COL_MASK; // gKeyPortValue[0][i]为当前COL_1\COL_2\COL_3管脚状态
     //  serial_printf("gKeyPortValue[0][%d] = %d \n",i,gKeyPortValue[0][i]);
        //have key chang !
        GPIO_SetPinLevel(gMatrixKeyPin[i],GPIO_LOW);  
        keys = gKeyPortValue[0][i] ^ gKeyPortValue[1][i];    // 准延时     
        GPIO_SetPinDirection(gMatrixKeyPin[i], GPIO_IN); 
        if( keys )
          {   
      //     TR("gKeyPortValue[0][%d] = %d, keys =%d", i,gKeyPortValue[0][i],keys);
            #if (CHIPTYPE == RK2700)
             for( j = 0 ; j < 3 ; j ++ ) // j为列,输入管脚,感受key按下
            #elif (CHIPTYPE == RK2706)
             for( j = 0 ; j < 2 ; j ++ ) // j为列,输入管脚,感受key按下
            #endif
                {
                if( keys & (0x01<<j) ) 
                    {
                    if( gKeyPortValue[0][i] & (0x01<<j) ) // 位于当前行j列的按键按下
                        press = 1;
                    else
                        press = 0;                 
                    RockKeySendKeyMsg(press, 0 + (i*3+j) );   // keys = (i)*3 + j                
                    }
                }
          gKeyPortValue[1][i] = gKeyPortValue[0][i]; // gKeyPortValue[1][i]保存此次COL_1\COL_2\COL_3管脚状态供下一次使用
          } 
     }

     // 增加单独PC1口做PlayOn按键, 扫描键值暂定为9
     pioData = GPIO_GetPinLevel(GPIOPortC_Pin1); 
     if( pioData == 1)    // 检测到PlayOn按键按下
        {
          if( gKeyPlayOnState == 0)  // 原来是弹起状态
            {
               gKeyPlayOnState = 1;
               RockKeySendKeyMsg(1, 9);
            }
        }
     else
        {
          if( gKeyPlayOnState == 1)  // 原来是按下状态
            {
               gKeyPlayOnState = 0;
               RockKeySendKeyMsg(0, 9);
            }
        }
        
     
}

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

#endif

⌨️ 快捷键说明

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