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

📄 key.c

📁 凌阳单片机的录音,方音程序,用c语言边的,可用性强.
💻 C
字号:
//======================================================
// 文件名称:	KEY.c
// 功能描述:	按键处理
// 维护记录:	2006-9-18	v1.0	by lijian
// 说明:		
//======================================================
#include "Key.h"

unsigned int ui_KeyScanState;
unsigned int ui_KeyState;
unsigned int ui_KeyID;
unsigned int ui_KeyCount;
unsigned int ui_KeyCountBK;
unsigned int ui_RepeatCount;
unsigned int ui_RepeatEvent;

//=============================================================
// 语法格式:	void KeyScan_Init(void)
// 实现功能:	按键初始化
// 参数:		无
// 返回值:		无
//=============================================================
void KeyScan_Init(void)
{
	ui_KeyScanState = C_KeyStateFirst;
	ui_KeyState = C_NullKey;
	ui_KeyCount = 0;
	ui_KeyCountBK = 0;
	ui_KeyID = C_Null;
	ui_RepeatEvent = 0;
	ui_RepeatCount = 0;
	DrvKeyInit();
}

//=============================================================
// 语法格式:	unsigned int KeyScan_GetKey(unsigned int *KeyType)
// 实现功能:	获取键值和按键类型
// 参数:		KeyType	-	该变量返回按键类型
// 返回值:		键值
//=============================================================
unsigned int KeyScan_GetKey(unsigned int *KeyType)
{
	unsigned int Key;
	if(C_NullKey == ui_KeyState)
		Key = C_Null;
	else
		Key = ui_KeyID;
	*KeyType = ui_KeyState;
	if(C_KeyStateFirst == ui_KeyScanState)
	{
		ui_KeyID = C_Null;
		ui_KeyState = C_NullKey;
	}
	return(Key);
}

//=============================================================
// 语法格式:	unsigned int KeyScan_CheckRepeat()
// 实现功能:	检查是否有Repeat键按下
// 参数:		无
// 返回值:		有则返回1,否则返回0
//=============================================================
unsigned int KeyScan_CheckRepeat()
{
	if(ui_RepeatEvent)
	{
		ui_RepeatEvent = 0;
		return 1;
	}
	return 0;
}

//=============================================================
// 语法格式:	void KeyScan_ServiceLoop(void)
// 实现功能:	键盘扫描服务程序
//				注意,此函数需安置在1KHz时基中断中
//				如需安置在其他中断,请自行修改KEY.h中定义的相关时间设置
// 参数:		无
// 返回值:		无
//=============================================================
void KeyScan_ServiceLoop(void)
{
	switch(ui_KeyScanState)
	{
		case C_KeyStateFirst:
			if(C_Null != DrvGetKeyID())
			{
				ui_KeyID = DrvGetKeyID();
				ui_KeyScanState = C_KeyStateDebounce;
				ui_KeyCount = 0;
				ui_RepeatEvent = 0;
				ui_RepeatCount = 0;
			}
			break;
		case C_KeyStateDebounce:
			if(ui_KeyCount > C_DebounceLimit)
			{
				if(C_Null != DrvGetKeyID())
				{
					if(DrvGetKeyID() == ui_KeyID)
					{
						ui_KeyState = C_SKeyState;
						ui_KeyScanState = C_KeyStateRepeat;
					}
					else
					{
						ui_KeyScanState = C_KeyStateFirst;
					}
				}
				else
				{
					ui_KeyScanState = C_KeyStateFirst;
//					ui_KeyCount = 0;
				}
			}
			else
			{
				ui_KeyCount++;
			}
			break;
		case C_KeyStateRepeat:
			if(C_Null != DrvGetKeyID())
			{
				if(DrvGetKeyID() == ui_KeyID)
				{
//					if(ui_KeyCount > C_FirstRepeatTim - C_RepeatTim)
//					{
//						if(++ui_RepeatCount >= C_RepeatTim)
//						{
//							ui_RepeatCount = 0;
//							ui_RepeatEvent = 1;
//						}
//					}
					if(ui_KeyCount > C_LKeyLimit)
					{
						ui_KeyScanState = C_KeyStateAfterLKey;
						ui_KeyState = C_LKeyState;
					}
					else
					{
						ui_KeyCount++;
					}
				}
				else
				{
					ui_KeyScanState = C_KeyStateFirst;
				}
			}
			else
			{
				ui_KeyScanState = C_KeyStateReleaseDebounce;
				ui_KeyCountBK = ui_KeyCount;
				ui_KeyCount = 0;
			}
			break;
		case C_KeyStateReleaseDebounce:
			if(ui_KeyCount > C_DebounceLimit)
			{
				if(C_Null == DrvGetKeyID())
				{
					ui_KeyScanState = C_KeyStateFirst;
					if(C_SKeyState == ui_KeyState)
						ui_KeyState = C_SReleaseKeyState;
					else if(C_LKeyState == ui_KeyState)
						ui_KeyState = C_LReleaseKeyState;
				}
				else
				{
					ui_KeyCount = ui_KeyCountBK;
					ui_KeyScanState = C_KeyStateRepeat;
				}
			}
			else
			{
				ui_KeyCount++;
			}
			break;
		case C_KeyStateAfterLKey:
			if(++ui_RepeatCount >= C_RepeatTim)
			{
				ui_RepeatCount = 0;
				ui_RepeatEvent = 1;
			}
			if(C_Null == DrvGetKeyID())
			{
				ui_KeyScanState = C_KeyStateReleaseDebounce;
			}
			else if(DrvGetKeyID() != ui_KeyID)
			{
				ui_KeyScanState = C_KeyStateFirst;
			}
			break;
		default:
			break;
	}
}

⌨️ 快捷键说明

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