微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 按键程序设计,可以处理加速键、一键多功能等情况

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

时间:11-22 来源:互联网 点击:
我的按键程序设计,可以处理加速键一键多功能等情况
后面有P1口行列式键盘程序实例
xwj发表于2005-4-1516:36单片机←返回版面举报该贴

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

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;--退出

所有键盘程序对外接口:
unsignedcharKeyGetcode(void)//返回按键码
{
key_ok=0;
return(key_data);
}

bitKeyTest(void)//检查有无按键
{
KeyScan();//键扫描
return(key_ok);
}



//--------------------------------------------------------------------------//
//源程序大公开//
//(c)Copyright2001-2005xuwenjun//
//AllRightsReserved//
//V1.00//
//--------------------------------------------------------------------------//
//标 题:P1口行列式键盘程序//
//文件名:xwj_hlkey.c//
//版 本:V1.00//
//修改人:徐文军E-mail:xuwenjun@21cn.com//
//日 期:05-05-13//
//描 述:P1口行列式键盘程序//
//声 明://
//以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处.//
//如用于商业用途请与作者联系.E-mail:xuwenjun@21cn.com//
//有问题请mailtoxuwenjun@21cn.com欢迎与我交流!//
//--------------------------------------------------------------------------//
//老版本:老版本文件名://
//创建人:徐文军E-mail:xuwenjun@21cn.com//
//日 期:05-05-13//
//--------------------------------------------------------------------------//
#i nclude
#i nclude"xwj_hlkey.h"//P1口行列式键盘//
//#i nclude"xwj_bp.h"//峰鸣器

#defineKEYDELAY25
#defineKEYLOOP10
unsignedcharkey_bak;
unsignedcharkey_temp;
unsignedcharkey_old;
unsignedcharkey_data;
bitkey_ok;

//P1口行列式键盘//
#defineKEYPIN_LP1//定义键扫描列端口为P1低四位输入//
#defineKEYPIN_HP1//定义键扫描行端口为P1高四位扫描输出//

//内部私有函数//
unsignedcharfnKeycode(unsignedcharkey);//根据键盘映射表输出顺序键值//

//P1口行列式键盘//
//---------------------------------------------------------------------------//
voidKeyScan(void)//键扫描
{
unsignedcharsccode,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);//键解码

}
key_old=0;
}
KEYPIN_H=KEYPIN_H|0xf0;
}

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

unsignedcharKeyGetcode(void)//返回按键码
{
key_ok=0;
return(key_data);
}

bitKeyTest(void)//检查有无按键
{
KeyScan();//键扫描
return(key_ok);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top