网站导航: 首页 > 设计参考 > 正文 文章搜索
键盘译码程序
 
文章编号:
090106100051
文章分类: 单片机 51系列
点 击:
...
关 键 词: 键盘
文章来源:
网络
摘 要:
键盘译码程序是开发项目中最常用到的程序,它的好坏,直接影响着整个程序!现在介绍一个使用非常广泛的Keil C51键盘译码程序

  键盘译码程序是开发项目中最常用到的程序,它的好坏,直接影响着整个程序!现在介绍一个使用非常广泛的Keil C51键盘译码程序。
 在主程序中不断调用KeyBord(),可以不停地扫描键盘!
 在功能子程序中调用:unsigned charJB_KeyData(),得到键值

 

 
  1. #define TK  8         //主程序执行时间8ms   
  2. #define Timer20ms  (30/TK)   //延时时间20ms   
  3. #define Timer2S     (1200/TK) //延时时间2S   
  4. #define Timer100ms   (1000/TK)  //延时时间100ms   
  5. #define Port P2 //键盘口   
  6. //****************************   
  7. KEY  KeyDat;        //定义数据结构   
  8. //---------------------------   
  9. //5个开关占用的IO脚   
  10. //---------------------------   
  11. sbit ko=Port^0;   
  12. sbit ka=Port^1;   
  13. sbit kb=Port^2;   
  14. sbit kc=Port^3;   
  15. sbit kd=Port^4;   
  16.   
  17. /***************************   
  18. 根据硬件电路不同,只修改这段程序即可!!!   
  19. ***************************/   
  20. unsigned char ReadKey(void){   
  21.     ko=0;   
  22.     if(!ka) return 2;//Ka   
  23.     if(!kb) return 3;//Kb   
  24.     if(!kc) return 4;//Kc   
  25.     if(!kd) return 5;//Kd   
  26.     return 0;   
  27. }   
  28.   
  29. /***************************  
  30. 判别是否有建  
  31. ***************************/  
  32. void GetKey(void){   
  33.     if(ReadKey()!=0){   
  34.     KeyDat.KeyDog=Timer20ms;   
  35.     KeyDat.KeyPower++;   
  36.     }   
  37. }   
  38.   
  39. /***************************  
  40. 延时去抖动  
  41. ***************************/  
  42. void KeyDog(void){   
  43.     if(0==-KeyDat.KeyDog){   
  44.     KeyDat.KeyData=ReadKey(); //读键盘   
  45.     if(KeyDat.KeyData!=0){   
  46.     KeyDat.KeyPower++;   
  47.     KeyDat.KeyDog=Timer3S;   
  48. /***************************  
  49. //    BeepPower=1;//蜂鸣器短鸣  
  50. ***************************/  
  51.     }else{   
  52.     KeyDat.KeyPower=0:   
  53.     KeyDat.KeyData=0;    //返回   
  54.     }   
  55.   }   
  56. }   
  57.   
  58. /***************************  
  59. 判别是否松开  
  60. ***************************/  
  61. void KeyOff1(void){   
  62.   if(ReadKey0==0){    //松开按键   
  63.     KeyDat.KeyPower=0;   
  64.     KeyDat.KeyData |=HaveKey;//定义标志   
  65.     }else{   
  66.     if(0==-KeyDat.KeyDog){ //3秒延时到   
  67.     KeyDat.KeyDog=Timer100ms;   
  68.     KeyDat.KeyPower++;   
  69.     }   
  70.     }   
  71. }   
  72.   
  73. /***************************  
  74. 连击是否松开  
  75. ***************************/  
  76. void KeyOff2(void)   
  77. {   
  78.     if(ReadKey()!=0){   
  79.     if (0==--KeyDat.KeyDog){   
  80.     KeyDat.KeyData |=DubClick | HaveKey;  //连击标志   
  81.     KeyDat.KeyDog=Timer100ms;   
  82. /***************************  
  83. //    BeepPower=1;//发送蜂鸣器短鸣命令  
  84. ***************************/  
  85.     }   
  86.     }else{   
  87.     KeyDat.KeyData=0;  //?|=HaveKey;//一次按键   
  88.     KeyDat.KeyPower=0;   
  89.     }   
  90. }   
  91. /***************************  
  92. 函数指针定义  
  93. ***************************/  
  94. code void(code *SubKey[])()={   
  95.     GetKey,KeyDog,KeyOff1,KeyOff2   
  96. };   
  97. /***************************  
  98. 键处理程序用户在主程序只需不断调用它!  
  99. ***************************/  
  100. void KeyBord(void){   
  101.    (*SubKey[KeyDat.KeyPower])();   
  102.   
  103. /***************************  
  104. 用户在功能函数中调用,返回键处理后清除键值  
  105. ***************************/  
  106. unsigned char JB_KeyData(void){   
  107.     unsigned char i=0;   
  108.     if (KeyDat.KeyData>DubClick){   
  109.     i=KeyDat.KeyData;   
  110.     KeyDat.KeyData=0;   
  111.     }   
  112.     return i;   
  113. }   
  114.   
  115. 以下是头文件:   
  116. /***************************  
  117. 键盘的键值定义  
  118. ***************************/  
  119. #define DubClick 0x40    //连击   
  120. #define HaveKey 0x80    //有键   
  121. #define SeeKey (0x01|HaveKey)   
  122. #define SetKey (0x02|HaveKey)   
  123. #define RRKey (0x03|HaveKey)   
  124. #define UpKey (0x04|HaveKey)   
  125. #define RetKey (0x05|HaveKey)   
  126. #define RLKey (0x02|HaveKey)   
  127.   
  128. //#define UseKey (0x06|HaveKey)   
  129. #define SeeKey_Dub (SeeKey | DubClick | HaveKey)   
  130. #define SetKey_Dub (SetKey | DubClick | HaveKey)//双击   
  131. #define RRKey_Dub (RRKey | DubClick | HaveKey)   
  132. #define UpKey_Dub (UpKey | DubClick | HaveKey)   
  133. #define RetKey_Dub (RetKey | DubClick | HaveKey)   
  134. //#define UseKey_Dub (UseKey | DubClick | HaveKey)   
  135.   
  136. //--------------------------   
  137. typedef struct{   
  138.   unsigned char KeyPower;  //命令字   
  139.   unsigned int KeyDog;//延时   
  140.   unsigned char KeyData;//键值   
  141. }KEY;   

 

 
相关文章:

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




 
  查看更多...  

 

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