keyscan.c
来自「cs5460a做功率表用 cs5460a做功率表用 cs5460a做功率表」· C语言 代码 · 共 124 行
C
124 行
/********************************************
公司名称:
文 件 名:
版 本 号:
程序设计:
说 明:
完成日期:
修改日期:
功能摘要:
**********************************************/
#define _KeyScanV20
#include "includes.h"
//---------------------------------------------
uint8 KeyVal;
WAIT_TIME_STRUCT KeyScan = {0,_10MS};
WAIT_TIME_STRUCT WatchKeyTime = {0,0};
void WatchKey(void);
void ScanKey_MainLoop(void)
{
static uint8 KeyState = 0; //按键状态
static uint8 OldKeyCode = 0; //老键值缓存
static uint8 KeyCount = 0; //按键按下的时间,用于连击处理
uint8 GETKEY = 0;
if (!KeyScan.fGetTime)
{ KeyVal = 0; }
else
{ //系统时间到进行按键扫描
KeyScan.fGetTime = 0;
KeyScan.WaitTime = _10MS;
if (!SET_KEY) GETKEY |= 0x04;
if (!UP_KEY) GETKEY |= 0x02;
if (!DN_KEY) GETKEY |= 0x01;
switch (KeyState) //根据按键不同的状态进行处理
{
case 0:
if (GETKEY)
{
OldKeyCode = GETKEY;
KeyState = 1;
}
KeyVal = 0;
break;
case 1:
KeyState = 2; //按键消抖20ms
break;
case 2:
if (OldKeyCode == GETKEY)
{
KeyState = 3; //按键按下
KeyVal = OldKeyCode; //传递键值
WatchKeyTime.WaitTime = _60S;
}
else
{ KeyState = 0; } //抖动
break;
case 3:
if (OldKeyCode == GETKEY)
{
KeyCount++;
if (KeyCount >= 250) //按键时间大于250MS吗?
{
if (TaskID)
{
SaveFunData(); //常按保存数据
while(1);
}
else
{
KeyVal = 6;
KeyCount = 0; //常按进入功能参数设定
IO_HighAlarm = ON;
fH_Alarm = OFF; //关闭报警
L_Alarm = ON;
fL_Alarm = OFF;
break;
}
}
else if ((KeyCount >= 15) && (OldKeyCode != 0x04))
{
WatchKeyTime.WaitTime = _60S;
if (fDOKEY)
{
KeyCount = 0;
KeyVal = 0;
}
else
{
KeyCount -= 15;
KeyVal = OldKeyCode;
}
}
else
{ KeyVal = 0; }
}
else
{
KeyState = 0; //按键松开
KeyCount = 0;
fDOKEY = 0;
KeyVal = 0;
}
break;
default:
break;
}
}
}
//--------------------------------------------------
void WatchKey(void)
{
if ((TaskID) && (WatchKeyTime.fGetTime))
while (1);
}
//--------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?