我的按键程序设计,可以处理加速键、一键多功能等情况 后面有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 // //--------------------------------------------------------------------------// #i nclude <reg52.h> #i nclude "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_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);
|