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

📄 hw_matrixkey.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 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.7  2008/07/10 02:00:13  DDL
增加对RK2708sdkdemo的支持  由宏RK2708_SDKDEMO隔离

dengdl

Revision 1.6  2008/06/25 06:24:02  HSL
修改按键检测流程,按键检测统一集中在 RockKeyScanning 函数里面.

Revision 1.5  2008/06/23 09:54:05  HSL
增加 AD按键的支持,修改按键消息发送和长按检测接口.

Revision 1.4  2008/06/19 04:43:32  Administrator
代码整理!

Revision 1.3  2008/06/12 10:17:59  HSL
根据新的按键检测流程修改驱动部分接口.

Revision 1.2  2008/05/15 08:03:27  HXY
将MatrixKey_PowerOnInit中的IO设置移到GPIO_PowerOnInit中,避免重复设置

Revision 1.1.1.1  2008/05/07 04:15:08  Administrator
no message

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)

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


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)
{
// 矩阵扫描的行列IO口初始化配置移到GPIO_PowerOnInit中完成,此处不重复做IO口初始化配置

}

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

    INT32U  haveKeyPress = 0;    //080605,huangsl,
    /*
              COL1  COL2  COL3
       ROW1 ----|----|----|---
       ROW2 ----|----|----|---
       ROW3 ----|----|----|---

    */
    // 行扫描
#if ( BOARDTYPE == RK2700_SDKDEMO )
    //  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 ( BOARDTYPE == RK2706_SDKDEMO )
    for (i = 0; i < 3; i++)   // i = 0~2 为行
#elif ( BOARDTYPE == RK2708_SDKDEMO )
    for ( i = 0; i < 2; i++ )
#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管脚状态
#if ( BOARDTYPE == RK2700_SDKDEMO ) // gKeyPortValue[0][i]为当前COL_1\COL_2\COL_3管脚状态
        gKeyPortValue[0][i] = GPIO_GetPinLevel(MatrixKey_COL_1) << 2 | GPIO_GetPinLevel(MatrixKey_COL_2) << 1 | GPIO_GetPinLevel(MatrixKey_COL_3);
#elif ( BOARDTYPE == RK2706_SDKDEMO ) // gKeyPortValue[0][i]为当前COL_1\COL_2管脚状态
        gKeyPortValue[0][i] = GPIO_GetPinLevel(MatrixKey_COL_1) << 1 | GPIO_GetPinLevel(MatrixKey_COL_2);
#elif ( BOARDTYPE == RK2708_SDKDEMO ) // gKeyPortValue[0][i]为当前COL_1\COL_2管脚状态
        gKeyPortValue[0][i] = GPIO_GetPinLevel(MatrixKey_COL_1) | (GPIO_GetPinLevel(MatrixKey_COL_2)<<1) | (GPIO_GetPinLevel(MatrixKey_COL_3)<<2);
#endif

        if (gKeyPortValue[0][i])
            haveKeyPress = 1;
        //have key chang !
        GPIO_SetPinLevel(gMatrixKeyPin[i], GPIO_LOW);
        keys = gKeyPortValue[0][i] ^ gKeyPortValue[1][i];    // 准延时
        GPIO_SetPinDirection(gMatrixKeyPin[i], GPIO_IN);
        if (keys)
        {
#if (( BOARDTYPE == RK2700_SDKDEMO ) || ( BOARDTYPE == RK2708_SDKDEMO ))
            for (j = 0 ; j < 3 ; j ++)  // j为列,输入管脚,感受key按下
#elif ( BOARDTYPE == RK2706_SDKDEMO )
            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按键按下
    {
        haveKeyPress = 1;
        if (gKeyPlayOnState == 0)  // 原来是弹起状态
        {
            gKeyPlayOnState = 1;
            RockKeySendKeyMsg(1, 9 );
        }
    }
    else
    {
        if (gKeyPlayOnState == 1)  // 原来是按下状态
        {
            gKeyPlayOnState = 0;
            RockKeySendKeyMsg(0, 9 );
        }
    }
    
#if (ADKEY_SUPPORT) //如果支持AD按键,增加 AD按键扫描接口.
    haveKeyPress |= ADKeyScanning( AdcValue[KEYBOARD_ADC] );
#endif    
    
    //080612,huangsl,用于产生长按键和 弹起检测.
    RockKeyTimerCallback(haveKeyPress);
}

/**************************************************************************
* 函数描述: 矩阵按键反初始化
* 入口参数: 无
* 出口参数: 无
* 返回值:   无
***************************************************************************/
void RockKey_PowerOffDeinit(void)
{

}

#endif

⌨️ 快捷键说明

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