网站导航: 首页 > 设计参考 > 正文 文章搜索
可以处理加速键、一键多功能等情况的按键程序设计实例
 
文章编号:
090106162354
文章分类: 单片机 51系列
点 击:
...
关 键 词: 按键,键盘
文章来源:
网络
摘 要:
我的按键程序设计,可以处理加速键、一键多功能等情况,后面有P1口行列式键盘程序实例...

我的按键程序设计,可以处理加速键、一键多功能等情况
后面有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;--退出

所有键盘程序对外接口:

 
  1. unsigned char KeyGetcode(void)        //返回按键码   
  2. {   
  3.     key_ok=0;   
  4.     return(key_data);   
  5. }   
  6.   
  7. bit KeyTest(void)            //检查有无按键   
  8. {   
  9.     KeyScan();            //键扫描   
  10.     return(key_ok);   
  11. }   
  12.   
  13. //--------------------------------------------------------------------------//   
  14. //                                源程序大公开                              //   
  15. //                    (c) Copyright 2001-2005 xuwenjun                     //   
  16. //                            All Rights Reserved                           //   
  17. //                                    V1.00                                 //   
  18. //--------------------------------------------------------------------------//   
  19. //标 题: P1口行列式键盘程序                                                //   
  20. //文件名: xwj_hlkey.c                                                       //   
  21. //版 本: V1.00                                                             //   
  22. //修改人: 徐文军                         E-mail:xuwenjun@21cn.com           //   
  23. //日 期: 05-05-13                                                          //   
  24. //描 述: P1口行列式键盘程序                                                //   
  25. //声 明:                                                                   //   
  26. //        以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //   
  27. //        如用于商业用途请与作者联系.    E-mail:xuwenjun@21cn.com           //   
  28. //        有问题请mailto xuwenjun@21cn.com   欢迎与我交流!                  //   
  29. //--------------------------------------------------------------------------//   
  30. //老版本: 无                             老版本文件名:                      //   
  31. //创建人: 徐文军                         E-mail:xuwenjun@21cn.com           //   
  32. //日 期: 05-05-13                                                          //   
  33. //--------------------------------------------------------------------------//   
  34. #include <reg52.h>   
  35. #include "xwj_hlkey.h"                //  P1口行列式键盘  //   
  36. //#i nclude "xwj_bp.h"                //峰鸣器   
  37.   
  38. #define KEYDELAY 25    /*首键延迟次数*/   
  39. #define KEYLOOP 10    /*连续键间隔次数,需小于KEYDELAY*/   
  40. unsigned char key_bak;   
  41. unsigned char key_temp;   
  42. unsigned char key_old;   
  43. unsigned char key_data;   
  44. bit key_ok;   
  45.   
  46. //  P1口行列式键盘  //   
  47. #define KEYPIN_L  P1               // 定义键扫描列端口为 P1低四位输入  //   
  48. #define KEYPIN_H  P1              // 定义键扫描行端口为 P1高四位扫描输出  //   
  49.   
  50. //内部私有函数  //   
  51. unsigned char fnKeycode(unsigned char key);     //  根据键盘映射表输出顺序键值            //   
  52.   
  53. //  P1口行列式键盘  //   
  54. //---------------------------------------------------------------------------//   
  55. void KeyScan(void)                    //键扫描   
  56. {   
  57.     unsigned char sccode,recode;   
  58.     KEYPIN_L = KEYPIN_L|0x0f;                    //  P1低四位为列线输入         //   
  59.     KEYPIN_H = KEYPIN_H&0x0f;                    //  P1高四位为行线发全零扫描码 //   
  60.     if ((KEYPIN_L&0x0f) !=  0x0f)    //有键按下   
  61.     {   
  62.         key_temp = 键值;             //键扫描,获得键值   
  63.             if (key_temp == key_bak)   
  64.             {   
  65.                 key_old++;   
  66.                 if (key_old==KEYDELAY)                //连续键,不要则把此if屏蔽   
  67.                 {   
  68.                     key_ok=1;   
  69.                     key_data=fnKeycode(key_temp);    //键解码   
  70.                     key_old=KEYDELAY-KEYLOOP;   
  71.                 }   
  72.             }   
  73.             else  
  74.             {   
  75.                 key_old=0;   
  76.                 key_bak=key_temp;   
  77.             }   
  78.     }   
  79.     else                            //键抬起   
  80.     {   
  81.         if (key_old)   
  82.         {   
  83.             key_ok=1;   
  84.             key_data=fnKeycode(key_temp);    //键解码   
  85.         }   
  86.         key_old=0;   
  87.     }   
  88.     KEYPIN_H = KEYPIN_H|0xf0;   
  89. }   
  90.   
  91. //---------------------------------------------------------------------------//   
  92.   
  93. unsigned char KeyGetcode(void)        //返回按键码   
  94. {   
  95.     key_ok=0;   
  96.     return(key_data);   
  97. }   
  98.   
  99. bit KeyTest(void)                //检查有无按键   
  100. {   
  101.     KeyScan();            //键扫描   
  102.     return(key_ok);   
  103. }   
  104.        

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4