MCU通用资源
返回
登录/注册
按键程序设计-处理加速键和一键多功能等情况
楼主
DC 于 2007-03-07 13:57:31
按键程序设计-处理加速键和一键多功能等情况
[COLOR=blue]作者:徐文军[/COLOR]
我的按键程序设计,可以处理加速键、一键多功能等情况
1、一般都不在键盘程序中延时,而是通过隔一段时间调用(比如10毫秒)来扫描按键,以尽量释放CPU资源;
2、所有键盘程序基本上都是一个模式,可以处理加速键、一键多功能等情况;
3、对外接口只有2个,换用不同硬件的键盘只需把该键盘程序加入工程编译即可,其他不需要作任何改动,非常方便。
[CODE]基本上都是一个模式:
有键?--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口行列式键盘程序 //
//声 明: //
#i nclude <reg52.h>
#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) //检查有无按键
{ KeyScan(); //键扫描
return(key_ok);
}
[/CODE]
回复
1楼
lntv88 于 2007-03-14 11:29:06
收下,慢慢看!!!
回复
2楼
lfzwb 于 2007-03-30 10:02:04
代码简洁,试一下
回复
3楼
yyc 于 2007-04-06 14:11:37
找到了与我毕业设计相关的
回复
4楼
tallahassee 于 2007-06-08 09:44:44
請問程式中的 key_data=fnKeycode(key_temp);
fnKeycode副程式在哪找不到??可寄給我原版的代碼嗎??
tallaha1102@yahoo.com.tw
回复
5楼
bluespace168 于 2007-11-10 16:40:05
很好,给别人一种授人以渔的感觉,我有个问题请问斑竹:在现在的开发中经常有关于遥控器的编程,用单片机接收控制的,比如第一次按下某个键,单片机系统在一定时间内比如4S内收到的话就把它写入93C46,此为学习按键,我们常说的学习遥控器,下次就可以要遥控器来对单片机系统进行控制,第二次如果学习的是遥控器上的同一个按键,则删除这个学习到的键,用的是无线RF通讯方式,RF解码怎么实现?你能给我详细讲讲这些问题吗?谢谢!
回复
1
电脑版
Page created in 0.8750 seconds width 3 queries.