1、按键程序设计-处理加速键、一键多功能等情况作者:徐文军我的按键程序设计,可以处理加速键、一键多功能等情况 1、一般都不在键盘程序中延时,而是通过隔一段时间调用(比如 10毫秒)来扫描按键,以尽量释放 CPU资源;2、所有键盘程序基本上都是一个模式,可以处理加速键、一键多功能等情况;3、对外接口只有 2个,换用不同硬件的键盘只需把该键盘程序加入工程编译即可,其他不需要作任何改动,非常方便。基本上都是一个模式:有键?YES和上次相同?NoKeyold=0;退出 | | YESKeyold+;| | Keyold=首键延时 KEYDELAY?No退出| | YESKeyok=1; /按下不放一定时间
2、发首键,后面发加速键| 保存键值到 Keydata;(必要时译码)| Keyold=KEYDELAY-KEYLOOP(按住不放的延时);退出|NoKeyold=0?YES退出|N0Keyok=1; /不为 0说明按了键再放开,当然作按键有效处理保存键值到 Keydata;(必要时译码)Keyold=0;退出所有键盘程序对外接口:unsigned char KeyGetcode(void) /返回按键码key_ok=0;return(key_data);bit KeyTest(void) /检查有无按键KeyScan(); /键扫描return(key_ok);/-/ 源程序大公开 / (c)
3、Copyright 20012005 xuwenjun / All Rights Reserved / V1.00 /-/标 题: P1 口行列式键盘程序 /文件名: xwj_hlkey.c /版 本: V1.00 /修改人: 徐文军 E-mail: /日 期: 05-05-13 /描 述: P1 口行列式键盘程序 /声 明: /#i nclude #i nclude “xwj_hlkey.h“ / P1口行列式键盘 /#include “xwj_bp.h“ /峰鸣器#define KEYDELAY 25 /*首键延迟次数*/#define KEYLOOP 10 /*连续键间隔次数,需小于 K
4、EYDELAY*/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
5、(void) /键扫描unsigned char sccode,recode;KEYPIN_L = KEYPIN_L|0x0f; /P1低四位为列线输入/KEYPIN_H = KEYPIN_H /P1高四位为行线发全零扫描码/if (KEYPIN_L /键扫描,获得键值if (key_temp = key_bak)key_old+;if (key_old=KEYDELAY) /连续键,不要则把此 if屏蔽key_ok=1;key_data=fnKeycode(key_temp); /键解码key_old=KEYDELAY-KEYLOOP;elsekey_old=0;key_bak=key_te
6、mp;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);