一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 4708|回复: 17
收起左侧

带长短按功能的按键扫描程序

[复制链接]
发表于 2013-5-27 00:59 | 显示全部楼层 |阅读模式
本帖最后由 chjj0 于 2013-5-27 01:00 编辑

该状态机是一个3状态的有限状态机,用于单片机的按键扫描。

状态机示意图

状态机示意图


程序如下:
  1. /*------------------------
  2.   10ms timmer isr
  3. --------------------------*/
  4. void tm2_isr() interrupt 5
  5. {
  6.   TF2 = 0;
  7.   if(++time_counter == 5)
  8.   {
  9.     keyboard_mode = KEYBOARD_DOWN;
  10.   }
  11. }

  12. /*-----------------------
  13.   Turn on a timmer, which
  14. leads to a 10ms interrupt.
  15. -------------------------*/
  16. void timmer_begin(void)//10ms @ 11.0592M
  17. {
  18.         T2MOD = 0;
  19.         T2CON = 0;
  20.         TL2 = 0x00;
  21.         TH2 = 0xD8;
  22.         RCAP2L = 0x00;
  23.         RCAP2H = 0xD8;
  24.         ET2 = 1;
  25.         TR2 = 1;
  26. }

  27. /*------------------------
  28.   返回值:
  29. 0、调用此函数会返回一个按键值;
  30. 1、按键按下0-50ms,返回0;
  31. 2、按键按下50ms-500ms,若不放手,返回0;
  32. 3、按键按下50ms-500ms,若放手,返回按键;
  33. 4、按键按下500ms以上不放手,第500ms后返回1次按键值;
  34. 5、往后的每100毫秒,100毫秒内查询返回0;100毫秒后查询返回按键值。

  35. 例如:
  36. 按键按着不松会发生什么情况:
  37. 0-499ms查询,返回0;
  38. 500ms后(如522毫秒查询,返回该按键值);
  39. 523ms-599毫秒查询,返回0;
  40. 500ms后(如622毫秒查询,返回该按键值);
  41. 623ms-699毫秒查询,返回0;
  42. ……
  43. 如此类推
  44. --------------------------*/

  45. unsigned char scan_keyboard()
  46. {
  47.   static unsigned char prikey=0;
  48.   unsigned char key=0;

  49.   switch(keyboard_mode)
  50.   {
  51.     case KEYBOARD_IDEL:
  52.         {
  53.           if( prikey = getKey() )
  54.           {
  55.             timmer_begin();
  56.                 keyboard_mode = KEYBOARD_YET_TO_CONFIRM;
  57.           }
  58.           break;
  59.         }

  60.         case KEYBOARD_YET_TO_CONFIRM:
  61.         {
  62.           if(getKey() != prikey)
  63.           {
  64.                   TR2 = 0;
  65.                   TF2 = 0;
  66.                   ET2 = 0;
  67.                   time_counter = 0;
  68.                   prikey = 0;
  69.                   keyboard_mode = KEYBOARD_IDEL;
  70.           }
  71.           break;
  72.         }

  73.         case KEYBOARD_DOWN:
  74.         {
  75.           if(getKey() == prikey)
  76.           {
  77.             if(time_counter >= 50)
  78.                 {
  79.                   time_counter = 40;
  80.                   key = prikey;
  81.                 }
  82.           }
  83.           else
  84.           {
  85.             TR2 = 0;
  86.                 TF2 = 0;
  87.                 ET2 = 0;
  88.                 time_counter = 0;
  89.                 key = prikey;
  90.                 prikey = 0;
  91.                 keyboard_mode = KEYBOARD_IDEL;
  92.           }
  93.           break;
  94.         }
  95.   }
  96.   return(key);
  97. }
复制代码
 楼主| 发表于 2013-5-27 01:09 | 显示全部楼层
代码开放,本人定义为自由软件一类:
1、免费;
2、可任意修改。

希望能帮助到电子爱好者。
发表于 2013-5-27 07:51 | 显示全部楼层
学习学习
发表于 2013-5-27 08:11 来自手机 | 显示全部楼层
好好学习,每天向上!
发表于 2013-5-27 08:28 | 显示全部楼层
要实现“长短按功能的按键”的关键是要先改变观念,想明白按键不是按下有效,而是弹起时有效。(也可以增加 按下时间到多少时有效)

没必要单独开个定时器,定时扫描计数次数也一样。
 楼主| 发表于 2013-5-27 08:50 | 显示全部楼层
xwj 发表于 2013-5-27 08:28
要实现“长短按功能的按键”的关键是要先改变观念,想明白按键不是按下有效,而是弹起时有效。(也可以增加 ...

那当然,人家的代码在移植的过程中可以有适应自己的修改。
例如您提到的没必要新开一个计时器,在移植的过程中可以由你自己程序的节拍发生器里面计数(分频)得到程序需要的50ms和500ms。

发表于 2013-5-27 10:21 | 显示全部楼层
有没有相关的测试程序呢,变量的定义没有给出。,
发表于 2013-5-27 13:22 | 显示全部楼层
转一个  新型的按键扫描程序,仅三行程序
http://www.amobbs.com/thread-4308630-1-2.html
 楼主| 发表于 2013-5-27 13:27 | 显示全部楼层
shgdd520com 发表于 2013-5-27 10:21
有没有相关的测试程序呢,变量的定义没有给出。,

程序片段我已经在用了,你重写里面的 getKey() 函数就行。
例如我这个程序的 getKey() 是读取PT6311的键盘的,
如果你是单按键的就更简单,(假如按键接在P3_0引脚),
可以这样:
  1. unsigned char getKey()
  2. { return P3_0?1:0;
  3. }
复制代码
相反,重点不是代码,是图,应当理解。

 楼主| 发表于 2013-5-27 13:32 | 显示全部楼层
zljcat 发表于 2013-5-27 13:22
转一个  新型的按键扫描程序,仅三行程序
http://www.amobbs.com/thread-4308630-1-2.html

听起来十分牛b,有需要时试一试。

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-25 06:41 , Processed in 0.069900 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表