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

📄 key.c

📁 proteus电子钟(带闹钟数码管显示)
💻 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 + -