我的按键扫描比较简单.但思路很清晰; /*-------------------------------------------------------*-
key.H (V1.0)
-*-------------------------------------------------------*/
/* * Copyright (c) 2006, * All rights reserved * * 文件名称: key.h * 文件标识: * 摘 要: * * 当前版本: V1.0 * 取代版本: * 作 者: wsl * 修 改: * 版本信息: 2006-12-16 * 修改信息: */
//********************************************************
#ifndef _key_H_ #define _key_H_
/*定义键值*/ typedef enum { K_Set = 0x00, K_Right, K_Up, K_Enter };
// 公用函数 extern void KeyPad(void);
#endif
//******************end of file***************************
/*--------------------------------------------------------------------*-
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 "message.h" //---------------------------------------------------------------------- // 定义键盘扫描程序返回数据类型 typedef struct{ unsigned char FunctionValue; // 存放最后扫描到的功能键键值 unsigned char FunctionCnt; // 统计功能键的个数 }keyret;
// 按键年龄上限 #define KEYAGE (2) // 2~10都可以
//---------------------------------------------------------------------- // 私有函数 static void KeyPadScan(keyret *pKey);
//----------------------------------------------------------------------- // 存放上次功能键和引导档的键值 static unsigned char FunctionKeyBuffer; static unsigned char KeyAge; // 按键年龄计数器 static bit bKeyESC; // 按键释放标志: 为 0 时已释放
/*---------------------------------------------------------*- * 函数名称: KeyPad() * 参 数: * 返 回: * 函数功能: 按键处理 * * 说 明: * * 当前版本: V1.0 * 取代版本: * 作 者: wsl * 修 改: * 版本信息: 2006-12-16 * 修改信息: -*---------------------------------------------------------*/ void KeyPad(void) { keyret keytemp = {0xff, 0xff}; // 按键无效值 KeyPadScan(&keytemp); // 扫描按键 // 若无功能键按下或多于一个功能键按下,程序将作按键无效处理 if ( (0xff == keytemp.FunctionCnt) || (keytemp.FunctionCnt > 0x01) ) { FunctionKeyBuffer = 0; // 上次功能键缓冲区清"0" KeyAge = 0; // 按键年龄计数器清"0" bKeyESC = 0; // 清按键释放标志 return; } // 若是上次按键末释放则返回 if (bKeyESC) return; // 若本次功能键/引导键不同,则用本次键值更新上次键值 if ( FunctionKeyBuffer != keytemp.FunctionValue ) { FunctionKeyBuffer = keytemp.FunctionValue; KeyAge = 0; // 按键年龄计数器清"0" } KeyAge++; // 按键年龄加1
if ( KeyAge == KEYAGE ) { // 确定按键按下 KeyAge = 0; // 置位按键年龄计数器 bKeyESC = 1; // 置位bKeyESC标志,等待按键释放 msg_send_msg(MSG_KEY, FunctionKeyBuffer); // 发送按键消息及键值 } }
/*---------------------------------------------------------*- * 函数名称: KeyPadScan() * 参 数: * 返 回: * 函数功能: 按键扫描 * * 说 明: 扫描引导键/功能键键值及个数 * * 当前版本: V1.0 * 取代版本: * 作 者: wsl * 修 改: * 版本信息: 2006-12-16 * 修改信息: -*---------------------------------------------------------*/ void KeyPadScan(keyret *pKey) { RL0 = 1; RC0 = 1; if (!RL0) { pKey->FunctionCnt++; pKey->FunctionValue = K_Set; }
if (!RC0) { pKey->FunctionCnt++; pKey->FunctionValue = K_Right; }
RL0 = 1; RC0 = 0; if (!RL0) { pKey->FunctionCnt++; pKey->FunctionValue = K_Up; }
RL0 = 0; RC0 = 1; if (!RC0) { pKey->FunctionCnt++; pKey->FunctionValue = K_Enter; }
RL0 = 1; RC0 = 1; } |