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

📄 hw_adckey.c

📁 RK27驱动
💻 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 + -