按键程序设计-处理加速键和一键多功能等情况

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

按键程序设计-处理加速键、一键多功能等情况

作者:徐文军

我的按键程序设计,可以处理加速键、一键多功能等情况

1、一般都不在键盘程序中延时,而是通过隔一段时间调用(比如10毫秒)来扫描按键,以尽量释放CPU 资源;

2、所有键盘程序基本上都是一个模式,可以处理加速键、一键多功能等情况;

3、对外接口只有2个,换用不同硬件的键盘只需把该键盘程序加入工程编译即可,其他不需要作任何改动,非常方便。

基本上都是一个模式:

有键?--YES——和上次相同?--No--Keyold=0;退出

| |

| YES--Keyold++;

| |

| Keyold==首键延时KEYDELAY?--No--退出

| |

| YES--Keyok=1; //按下不放一定时间发首键,后面发加速键

| 保存键值到Keydata;(必要时译码)

| Keyold=KEYDELAY-KEYLOOP(按住不放的延时);--退出

|

No--Keyold==0?--YES--退出

|

N0--Keyok=1; //不为0说明按了键再放开,当然作按键有效处理

保存键值到Keydata;(必要时译码)

Keyold=0;--退出

所有键盘程序对外接口:

unsigned char KeyGetcode(void) //返回按键码

{

key_ok=0;

return(key_data);

}

bit KeyTest(void) //检查有无按键

{

KeyScan(); //键扫描

return(key_ok);

}

//--------------------------------------------------------------------------//

// 源程序大公开 //

// (c) Copyright 2001-2005 xuwenjun //

// All Rights Reserved //

// V1.00 //

//--------------------------------------------------------------------------// //标题: P1口行列式键盘程序 // //文件名: xwj_hlkey.c // //版本: V1.00 // //修改人: 徐文军 E-mail:xuwenjun@ // //日期: 05-05-13 // //描述: P1口行列式键盘程序 // //声明: //

#i nclude

#i nclude "xwj_hlkey.h" // P1口行列式键盘 //

//#include "xwj_bp.h" //峰鸣器

#define KEYDELAY 25 /*首键延迟次数*/

#define KEYLOOP 10 /*连续键间隔次数,需小于KEYDELAY*/

unsigned char key_bak;

unsigned char key_temp;

unsigned char key_old;

unsigned char key_data;

bit key_ok;

// P1口行列式键盘 //

#define KEYPIN_L P1 // 定义键扫描列端口为 P1低四位输入 //

#define KEYPIN_H P1 // 定义键扫描行端口为 P1高四位扫描输出 //

//内部私有函数 //

unsigned char fnKeycode(unsigned char key); //根据键盘映射表输出顺序键值//

// P1口行列式键盘 //

//---------------------------------------------------------------------------// void KeyScan(void) //键扫描

{

unsigned char sccode,recode;

KEYPIN_L = KEYPIN_L|0x0f; //P1低四位为列线输入//

KEYPIN_H = KEYPIN_H&0x0f; //P1高四位为行线发全零扫描码// if ((KEYPIN_L&0x0f) != 0x0f) //有键按下

{

key_temp = 键值; //键扫描,获得键值

if (key_temp == key_bak)

{

key_old++;

if (key_old==KEYDELAY) //连续键,不要则把此if屏蔽

{

key_ok=1;

key_data=fnKeycode(key_temp); //键解码

key_old=KEYDELAY-KEYLOOP;

}

}

else

{

key_old=0;

key_bak=key_temp;

}

}

else //键抬起

{

if (key_old)

{

key_ok=1;

key_data=fnKeycode(key_temp); //键解码

/*

if (key_old==100) //加上时间,不同时间不同功能,与连续键冲突

{

bp(1);

key_data += 0x10;

}

if (key_old==200)

{

bp(2);

key_data += 0x20;

}

*/

}

key_old=0;

}

KEYPIN_H = KEYPIN_H|0xf0;

}

//---------------------------------------------------------------------------//

unsigned char KeyGetcode(void) //返回按键码

{

key_ok=0;

return(key_data);

}

bit KeyTest(void) //检查有无按键

{

相关文档
最新文档