KeilC按键程序设计
2013-03-28
标签: C51 按键

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

后面有P1口行列式键盘程序实例

看到论坛在讨论按键,也把我设计按键程序的思路说说,欢迎大家拍砖

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@21cn.com//

//日 期: 05-05-13//

//描 述: P1口行列式键盘程序//

//声 明://

//以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //

//如用于商业用途请与作者联系.E-mail:xuwenjun@21cn.com//

//有问题请mailto xuwenjun@21cn.com欢迎与我交流!//

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

//老版本: 无老版本文件名://

//创建人: 徐文军E-mail:xuwenjun@21cn.com//

//日 期: 05-05-13//

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

#include

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

//#i nclude "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_LP1// 定义键扫描列端口为 P1低四位输入//

#define KEYPIN_HP1// 定义键扫描行端口为 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)//检查有无按键

{

KeyScan();//键扫描

return(key_ok);

}

可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号