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