keydeb.c

来自「* KeyDebounce Accept new key reading, ha」· C语言 代码 · 共 131 行

C
131
字号
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *
 *  Copyright (c) 2007 by Qu chun lei watt@vip.163.com
 *
 *  File name:          KEYDEB.C
 *  Module number:      1201C
 *  Language:           ANSI C
 *  $Revision: 15 $
 *
 *  Source code for a key debounce and slewing module which is described
 *  in keydeb.h.
 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#ifndef KEYDEB_C
#define KEYDEB_C

/*------------------------*
 |  Include header files
 *------------------------*/

#include    "keydeb.h"

/*----------------*
 |  Private data
 *----------------*/

static UINT8 keyDebounced;		/* ID of key currently being debounced */
static UINT8 keyLast;				/* key ID given for last call to KeyDebounce */
static UINT8 keyDebounceTimer;	/* time remaining before a key will be debounced */
static UINT16 keySlewTime;		/* time between slew events or 0 if not slewing */
static UINT16 keySlewTimer;		/* time since last key event */

/*--------------------*
 |  Public functions
 *--------------------*/

/*---------------------------------------------------------------------------*
 |  KeyDebounce
 |
 |  Accept new key reading and handle timing for debounce and slewing
 |
 |  Entry:   Input key reading
 |
 |  Exit:    Return event
 *---------------------------------------------------------------------------*/

TKeyDebounceEvent KeyDebounce(UINT8 keyReading)
{

TKeyDebounceEvent event = KEY_DEBOUNCE_EVENT_NONE;

   if(keySlewTimer < 0xFFFF)
	   keySlewTimer++;


	if (keyReading == keyLast)
	{
		if (keyDebounceTimer != 0)
		{
			keyDebounceTimer--;
			if (keyDebounceTimer == 0)
			{
				keyDebounced = keyReading;
				keySlewTimer = 0;
				keySlewTime = 0;
				if (keyReading == 0)
					event = KEY_DEBOUNCE_EVENT_RELEASE;
				else
					event = KEY_DEBOUNCE_EVENT_PRESS;
			}
		}
	}
	else
	{
		if (keyReading == keyDebounced)
			keyDebounceTimer = 0;
		else
			keyDebounceTimer = KEY_DEBOUNCE_TIME;
	}

	if (keySlewTime != 0)
	{
		if (keySlewTimer >= keySlewTime)
		{
			keySlewTimer = 0;
			keySlewTime  = 0;
			event = KEY_DEBOUNCE_EVENT_SLEW;	
		}
	}

	keyLast = keyReading;

	return(event);
}

#if KEYID_REPORTING

/*---------------------------------------------------------------------------*
 |  KeyId
 |
 |  Report which key is currently pressed
 |
 |  Entry:   No inputs
 |
 |  Exit:    Return key ID
 *---------------------------------------------------------------------------*/

UINT8 KeyId(void)
{
	return(keyDebounced);
}
#endif

/*---------------------------------------------------------------------------*
 |  KeySlewTimeSet
 |
 |  Accept slew time for currently pressed key
 |
 |  Entry:   Input slew time
 |
 |  Exit:    Returns nothing
 *---------------------------------------------------------------------------*/

void KeySlewTimeSet(UINT16 slewTime)
{
	keySlewTime = slewTime;
}

#endif

⌨️ 快捷键说明

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