17945|11

54

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

分析一个按键程序(长按 短按 双击) [复制链接]

如果我们要分析什么,我们就要身临其境地把自己想成是什么。

对于按键:我们需要思考的问题有:

1> 按键本身有哪几个状态?

   闲置 按下 弹起 state_kidel state_kdown state_kup

按键在任何情况下,都只有这3中状态,值得注意的是闲置和弹起本质上是有很大的区别的。

2 > 人对于按键有什么划分?人是怎么看按键的呢?

   不按 短按 双击 长按

那么,我们程序中要处理的就是 短按 双击 和 长按。

LONG_KEY   TWICE_KEY   LONG_KEY_UP 

而区分这些状态,需要一个用于参考的时间:

 KEY_LONGTIME  KEY_TWICETIME

当我们的头脑中有了这样的分析以后呢?就要开始准备程序了。

按键:每隔一定时间,扫描一次。扫描标志(gbKeyScanInt_Flag

(1)判断是键盘还是触摸

如果是键盘,按键按下是的电平是1变成0Keyportkey_data取反(在汇编中,是求补并加1

(2)状态机

按键的进程:闲置 —按下 —弹起

key.c.doc

3.67 KB, 下载次数: 649

最新回复

赞一个   详情 回复 发表于 2016-11-5 11:03
点赞(1) 关注

回复
举报

54

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
STATE_KIDEL:
如果有按键,查表,看是第几个按键。(排除8个IO口中,你不用做按键的那些IO。另外也是keyport中是从0开始的,而记在temp中是从0开始的)。
     Key_ThisValue=temp+1;       当前键值
     KeyState=STATTE_KDOWN;   按键状态
     KeyDn_Cnt=KEY_LONGTIME; 按键按下持续时间置为KEY_LONGTIME,减到0就表示长按时间到了。
如果没有按键,break跳出。
STATE_KDOWN:
如果按键松开了,判断长按时间到。
     --> 如果长按时间到了,
     Key_OldValue=0;
     KeyState=STATE_KIDEL;回到闲置状态
     gKeyBuf=Key_ThisValue+LONG_KEY_UP;
     gbHaveKey=TRUE;
     ——————> 长按
     --> 如果长按时间还没有到,如果按键抬起了,有可能是双击。
     KeyState=STATE_KUP;设置了KeyState为STATE_UP,如果时间到了,表示按键按下后,又弹起,弹起的时间够了。
     KeyUp)Cnt=KEY_TWICETIME;
     如果按键没有松开
     --> 如果长按时间到了
     Key_ThisValue+=LONG_KEY;
     gKeyBuf=Key_ThisValue;
      gbHaveKey=TRUE;
      ———————>长按
      -->如果长按时间没有到,按键还按着的话,就自减1.
       KeyDn_Cnt--;
STATE_KUP:
如果按键抬起时间到了
     -->如果 旧的键值=当前键值
       Key_ThisValue+=TWICE_KEY;     当前Key值+Twice_key
       Key_OldValue=0;                 j
       KeyState=STATE_KIDEL;   
       gKeyBuf=Key_ThisValue;
       gbHaveKey=TRUE;   
     —————————>双击
     -->如果 旧的键值 !=当前键值
       KeyState=STATE_KIDEL;
             gKeyBuf = Key_ThisValue;
           gbHaveKey = TRUE;                // ------有键值       
     ——————————>有短按
如果按键抬起时间没有到
       KeyUp_Cnt--;
      -->如果KeyPort!=0
       KeyState=STATE_KIDEL;
       Key_OldValue=Key_ThisValue;
        ———————————>有新按键  
       
        接下来,我们来具体分析几个可能出现的例子。
        1> 按键由闲置进入按下,
        -->STATE_KIDEL
        -->STATE_KDOWN
        刚按下时,键盘没有松开,长按等待时间也还没有到,就KeyDn_Cnt--;
        (1)如果KeyDn_Cnt减到了0,此时按键还没有松开,就是长按了,进行处理后,向上提交长按键值。
        (2)过了很久,键盘松开了。仍然在STATE_KDOWN中
进入 按键已松开,长按时间到,有些东西归位,进行处理后,向上提交长按抬起键值。
        (3)如果长按等待时间还没有到,按键松开了
更改按键状态 -->STATE_KUP,并使用KeyUp_Cnt为KEY_TWICETIME。
   进入按键抬起状态
如果按键刚刚弹起了,双击等待时间还没有到,就KeyUp_Cnt--;
        如果这时,又有按键按下,扫描到KeyPort!=0
则又进入-->STATE_KIDEL,然后Key_OldValue=Key_ThisValue,
又重新开始,如果是按下同样的键,如果这个同样的键按下的时间达到了长按时间,则丢弃之前的Key_OldValue,向上提交长按按键或长按抬起按键。
如果这个同样的键按下的时间不够长按时间,就抬起了。则进入STATE_KUP,如果在
KEY_TWICETIME之内,没有新的按键,则双击等待时间为0以后,判断Key_OldValue==Key_ThisValue,一定是等于的,则进行处理后,向上提交双击键值。
      (2)如果这时,双击等待时间到了,keyPort=0,中间没有按键。
         则比较Key_OldValue=0,不等于Key_ThisValue。有些东西归位,处理后向上提交短按键值

还有一点啊:如果你;连续的按按键,那么本程序处理的只是最后两个按键,或一个按键。
 
 

回复

174

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
泪奔一次。。。。支持一下。
 
 
 

回复

33

帖子

0

TA的资源

一粒金砂(中级)

4
 
不错的分析
 
 
 

回复

1173

帖子

3

TA的资源

五彩晶圆(初级)

5
 
这个真的很不错
 
 
 

回复

1149

帖子

3

TA的资源

五彩晶圆(初级)

6
 
支持一下,确实不错,讲解的比较清楚,也比较使用!:carnation:
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
不错的程序,有收获
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

8
 
顶学习了
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

9
 
很好的资料,谢谢
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

10
 
分析的很好,受到启发
 
 
 

回复

7

帖子

2

TA的资源

一粒金砂(初级)

11
 
不错的程序,有收获
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
赞一个
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表