📄 hw_adckey.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : hw_adckey.c
Desc : ADC Keyboard接口函数的实现
Author : huangxinyu
Date : 2007-09-20
Notes :
$Log: hw_adckey.c,v $
Revision 1.1.1.1 2008/03/06 13:29:05 Lingzhaojun
no message
Revision 1.1 2007/11/26 14:29:40 Huangxinyu
改变adckey目录
*********************************************************************/
#include "include.h"
#include "hw_include.h"
#include "hwapi_adc.h"
#include "hw_adckey.h"
#include "hwapi_keyboard.h"
#include <stdlib.h>
static INT16U gKeyScanCnt; /* 按键扫描次数。*/
static INT16U gKeyScanCode; /* 扫描码 */
static INT16U gKeyScanAdValue = ADV_KEYMAX; /* AD按键采样值 */
static INT16U gKeyDownMsgSend;
static INT16U skeyAdcValue[] ={
ADV_KEYRETURN , ADV_KEYFFD , ADV_KEYDOWN ,
ADV_KEYFFW , ADV_KEYUP , ADV_KEYMENU
};
/**************************************************************************
* 函数描述: AD按键初始化
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void ADKey_PowerOnInit(void)
{
ADC_PowerOnInit();
}
/**************************************************************************
* 函数描述: AD按键消息发送
* 入口参数: press -- 1(按下) 0(弹起)
* scancode -- 扫描码
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void ADKeySendKeyMsg( UINT16 press , UINT16 scancode )
{
UINT32 keyParam =( press<<16) |(scancode&0xFFFF);
#ifdef DRIVER_ONLY
serial_printf("ADC key keyparam = 0x%x \n ",keyParam);
#else
RockOSSendMsg( MBGUI , MS_ISRGU_KeyInd , (void*)keyParam ); //合并到OS版本上时再打开
#endif
}
/**************************************************************************
* 函数描述: AD按键硬件检测
* 入口参数: adcValue -- AD key的采样值
* 出口参数: 无
* 返回值: 无
* 注释: 此函数被RockAdcScanning调用
* AD Key同一时刻只能有一个按键按下
***************************************************************************/
void ADKeyScanning( unsigned short adcValue )
{
if( adcValue > ADV_KEYFREE ) // 当AD采样值大于ADV_KEYFREE时需要判断是没有按键按下还是按键按下后弹起
{
// AD Key采样值无效
if( (gKeyScanCnt > 0 && gKeyScanCnt < KEY_SCAN_TOTAL)) // 没有按键按下
{
goto KeyScanInvalidExit;
}
if( gKeyScanCnt == (KEY_SCAN_TOTAL+KEY_SCAN_REALEASE) ) // 按下后弹起
{
gKeyDownMsgSend = 0;
ADKeySendKeyMsg( 0 , gKeyScanCode );
goto KeyScanInvalidExit;
}
else
{
// 当gKeyScanCnt == KEY_SCAN_TOTAL并且落在误差范围内时发按键按下消息
// 在此基础上继续增加KEY_SCAN_REALEASE来判断弹起
gKeyScanCnt++;
}
return ;
}
// 上次按下按键后只能检测弹起,不再检测按下,否则会不断发送相同的按下消息
if( gKeyDownMsgSend )
return;
if( gKeyScanCnt < KEY_SCAN_OMIT ) /* 先丢掉几个数据, 去抖动 */
{
gKeyScanCnt++ ;
return ;
}
if( gKeyScanCnt < KEY_SCAN_TOTAL )
{
gKeyScanCnt++ ;
if( gKeyScanAdValue > adcValue ) /* 记录最小的值为可靠按下值 */
{
gKeyScanAdValue = adcValue;
}
if( gKeyScanCnt == KEY_SCAN_TOTAL ) /* 完成一次扫描,并且还没有发送按键按下消息 */
{
gKeyScanCode = 0;
while(gKeyScanCode <= KEY_SCAN_PLAY )
{
if( abs( gKeyScanAdValue - skeyAdcValue[gKeyScanCode] ) < ADV_KEYSHIFT )
{
ADKeySendKeyMsg( 1 , gKeyScanCode );
gKeyDownMsgSend = 1;
return;
}
gKeyScanCode++;
}
/* 否则AD值无效*/
goto KeyScanInvalidExit;
}
return;
}
else
{
gKeyScanCnt = KEY_SCAN_TOTAL;
return;
}
KeyScanInvalidExit:
gKeyScanCnt = 0;
gKeyScanAdValue = ADV_KEYMAX;
}
/**************************************************************************
* 函数描述: AD按键反初始化
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void ADKey_PowerOffDeinit(void)
{
ADC_Deinit();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -