📄 hw_matrixkey.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 + -