📄 key.c
字号:
/*--------------------------------------------------------------------*-
key.C (V1.00)
-*---------------------------------------------------------------------*/
/*
* Copyright (c) 2006,wsl
* All rights reserved
*
* 文件名称: key.C
* 功能描述:
* 其它说明:
*
* 当前版本: V1.0 * 取代版本:
* 作 者: wsl * 修 改:
* 版本信息: 2006-12-16 * 修改信息: :
*/
//***********************************************************************
#include "main.h"
#include "Port.h"
#include "key.h"
#include "OS_Basic_Func.H"
#include "DisplayDir.h"
#include "Menu.h"
//----------------------------------------------------------------------
// 定义键盘扫描程序返回数据类型
typedef struct{
uint8_t FunctionValue; // 存放最后扫描到的功能键键值
uint8_t FunctionCnt; // 统计击键个数
}Str_KeyRet;
// 定义以下键值允许连击
#define DOUBLE_KEY_1 K_Up
#define DOUBLE_KEY_2 'B'
// 按键年龄上限
#define KEYAGE (2)
#define MAXRATE (102) // 重复前的延迟值 1000 MS
#define MINRATE (30) // 连击速度 300 MS
//-----------------------------------------------------------------------
static uint8_t FunctionBuffer = 0;
static uint8_t KeyAgeCnt; // 按键年龄计数器
static bool bKeyState = 1; // 按键状态指示: 为 1 时按键处于去抖动期间
static bool bKeyESC; // 按键释放标志: 为 0 时已释放
static bool bKeydone = 1; // 按键任务完成标志: 为 1 时已完成
static bool bKeyProcess; // 按键有效标志: 为 1 时对按键执行
// 私有函数
static void KeyPadScan(Str_KeyRet *pKey);
/*---------------------------------------------------------*-
* 函数名称: KeyPad()
* 参 数:
* 返 回:
* 函数功能: 按键处理
*
* 说 明:
*
* 当前版本: V1.0 * 取代版本:
* 作 者: wsl * 修 改:
* 版本信息: 2006-12-16 * 修改信息:
-*---------------------------------------------------------*/
void KeyPad(void)
{
Str_KeyRet Keytemp = {0x00, 0x00};
if ( !bKeydone ) //按键任务没有完成
return;
// 扫描按键
KeyPadScan(&Keytemp);
// 若无键按下或多个键按下,程序将作按键无效处理
if ( (0x00 == Keytemp.FunctionCnt) || (Keytemp.FunctionCnt > 0x01) )
{
KeyAgeCnt = 0; // 按键年龄计数器清"0"
FunctionBuffer = 0; // 上次功能键缓冲区清"0"
bKeyESC = 0; // 清按键释放标志
bKeyState = 1; // 置位按键状态
return;
}
// 若是上次按键末释放则返回
if (bKeyESC)
return;
// 若本次键不同,则用本次键值更新上次键值
if ( FunctionBuffer != Keytemp.FunctionValue )
{
FunctionBuffer = Keytemp.FunctionValue;
KeyAgeCnt = 0; // 按键年龄计数器清"0"
bKeyState = 1; // 置位第一次按下标志
}
KeyAgeCnt++; // 键值和上次相同,按键年龄加1
if (bKeyState) // 是单击
{
if ( KeyAgeCnt == KEYAGE ) // 按键有效?
{ // 确定有效
bKeyProcess = 1; // 对按键解析执行
bKeydone = 0; // 清按键任务完成标志(表当前任务正在执行)
bKeyState = 0; // 清第一次按下标志
KeyAgeCnt = 0; // 置位按键年龄计数器
if ( (Keytemp.FunctionValue == DOUBLE_KEY_1) || (Keytemp.FunctionValue == DOUBLE_KEY_2) )
{
bKeyESC = 0; // 该功能键允许连击
}
else
{ // 不允许连击
bKeyESC = 1; // 置位bKeyESC标志,等待按键释放
}
}
}
else // 是连击键.判断按键年龄是否等于重复的延缓时间,不等于则返回.
{
if (KeyAgeCnt == MAXRATE)
{ // 进入连击状态
KeyAgeCnt = KeyAgeCnt - MINRATE; // 按键年龄减重复速度
bKeyProcess = 1; // 对按键解析执行
bKeydone = 0; // 清按键任务完成标志(表当前任务正在执行)
}
}
if (bKeyProcess)
{
StartBuzzer(); // 开背光,键音
}
}
/*---------------------------------------------------------*-
* 函数名称: KeyPadScan()
* 参 数:
* 返 回:
* 函数功能: 按键扫描
*
* 说 明: 扫描引导键/功能键键值及个数
*
* 当前版本: V1.0 * 取代版本:
* 作 者: wsl * 修 改:
* 版本信息: 2006-12-16 * 修改信息:
-*---------------------------------------------------------*/
void KeyPadScan(Str_KeyRet *pKey)
{
K1 = 1;
K2 = 1;
K3 = 1;
K4 = 1;
if ( !K1 )
{
(*pKey).FunctionValue = K_Set;
(*pKey).FunctionCnt++;
}
if ( !K2 )
{
(*pKey).FunctionValue = K_Enter;
(*pKey).FunctionCnt++;
}
if ( !K3 )
{
(*pKey).FunctionValue = K_Right;
(*pKey).FunctionCnt++;
}
if ( !K4 )
{
(*pKey).FunctionValue = K_Up;
(*pKey).FunctionCnt++;
}
}
/*---------------------------------------------------------*-
* 函数名称: KeyProcess()
* 参 数:
* 返 回:
* 函数功能: 键值处理
*
* 说 明:
*
* 当前版本: V1.0 * 取代版本:
* 作 者: wsl * 修 改:
* 版本信息: 2006-12-16 * 修改信息:
-*---------------------------------------------------------*/
void KeyProcess(void)
{
// 若无按键请求则返回
if ( !bKeyProcess )
return;
Menu_Change(FunctionBuffer);
bKeyProcess = 0; // 清按键有效标志
bKeydone = 1; // 置位按键任务完成标志
}
/*****************************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -