打印

忙活了一上午,终于做出来了:软件触发器的按键处理程序

[复制链接]
6480|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
XIANSir|  楼主 | 2011-4-12 10:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 XIANSir 于 2011-4-12 10:39 编辑

首先,感谢Jack602大侠,我也是看了他的https://bbs.21ic.com/viewthread.php?tid=217245&page=1#pid1612175帖子,觉得这个算法非常好,很有实用价值,所以才决定把这个算法自己实现一下。
既然是经别人指点完成的,那当然要拿来与大家分享了:
首先,是整个工程的打包(UV3和UV4的工程都有了):
TrigKey.rar (86.54 KB)
下面是运行效果图:




注意:有些串口助手不支持汉字,所以没法显示汉字,比如scom21.exe,推荐使用SSCOM32,可以很好支持汉字。

最后,是实现的关键代码:

相关帖子

沙发
LastNew| | 2011-4-12 10:51 | 只看该作者
友情顶!

使用特权

评论回复
板凳
sunyouyuan| | 2011-4-12 11:49 | 只看该作者
楼主解释一下,软件触发,是怎么触发的?

使用特权

评论回复
地板
XIANSir|  楼主 | 2011-4-12 12:05 | 只看该作者
3# sunyouyuan
软件代码模拟一个触发器:
“stat^save保证只有在按键变化时(有键被按下或释放),trig才有机会为1;而stat&部分则保证只有按键被按下才会置位tirg,而按键被释放则不会”

trig = stat&(stat^save)

要想trig等于1,必须stat和(stat^save)都为1,stat为1要求有按键处于按下状态,(stat^save)为1要求stat与save的值不同,也就是上次测到的引脚值与这次测到的引脚值不同,也就是有按键从按下变成了释放,或者由释放变成了按下。

综合一下两个要求:
1、要求有按键处于按下状态
2、要求有按键从按下变成了释放,或者由释放变成了按下。
只有这两个条件同时满足时,trig才能被置位。

综合一下:要求有按键由释放变成了按下,当且仅当此时,trig才会为1

使用特权

评论回复
5
sunyouyuan| | 2011-4-12 13:42 | 只看该作者
不知道这样模拟的意义何在?
1、要求有按键处于按下状态
2、要求有按键从按下变成了释放,或者由释放变成了按下。

这两个要求能同时存在吗?
1要求按键处于按下状态,2又说按键从按下变成了释放...

使用特权

评论回复
6
XIANSir|  楼主 | 2011-4-12 13:59 | 只看该作者
5# sunyouyuan
呵呵,首先你要明白,按键状态是每10ms检测一次!
1、要求有按键处于按下状态
这句话的意思是说:本次检测时按键正处于按下状态


2、要求有按键从按下变成了释放,或者由释放变成了按下
既然本次检测到按键处于按下状态,那么如果上一次(也就是10ms之前)检测时按键处于释放状态,那么这不就叫“由释放变成了按下”吗


我说的同时存在就是这个意思

使用特权

评论回复
7
abin0415| | 2011-4-12 16:49 | 只看该作者
顶楼主,只是小弟还太菜,看的不是很明了。麻烦楼主讲解。

使用特权

评论回复
8
johnwjl| | 2011-4-12 16:58 | 只看该作者
LZ可以考虑一下以下问题:
1. KeyProc();不要放在中断中执行是否更好?
2. 如果一直按着按键不放,是否会每2秒会执行一次长按键功能?
其实,按键扫描,最好用状态机。

使用特权

评论回复
9
XIANSir|  楼主 | 2011-4-12 17:44 | 只看该作者
8# johnwjl
1、第一个建议非常好,欣然采纳,谢谢!

2、我的程序已经是这样做的了

使用特权

评论回复
10
XIANSir|  楼主 | 2011-4-12 17:54 | 只看该作者
8# johnwjl
其实,按键扫描,最好用状态机。”


已经有了:lolhttps://bbs.21ic.com/icview-227575-1-1.html

另外,其实这个算法也使用了状态机的精髓啊!
为什么这么说呢??
因为本算法的实质是用软件实现了一个“触发器”,触发是什么啊??
触发器的本质是:根据现态和输入信号决定次态
状态机的本质是:根据前一状态和当前动作决定后一状态
何其相似也!!;P

使用特权

评论回复
11
mochou| | 2011-4-12 18:23 | 只看该作者
顶顶顶几下,有时间研究研究,

使用特权

评论回复
12
johnwjl| | 2011-4-12 19:35 | 只看该作者
2. 如果一直按着按键不放,是否会每2秒会执行一次长按键功能?
我的意思是说一般长按2s后,只要产生一次长按键功能,如果还继续按着该键,则不要再产生长按功能。

使用特权

评论回复
13
XIANSir|  楼主 | 2011-4-12 19:46 | 只看该作者
12# johnwjl
偶,你是这个意思啊!

首先,我想说按着一直产生长按功能也很实用,我觉得这种需求可能更多。

当然了,你说的那个也很容易实现:做个标志位就行了。

使用特权

评论回复
14
huangqi412| | 2011-4-12 20:16 | 只看该作者
没看明白标题

使用特权

评论回复
15
XIANSir|  楼主 | 2011-4-12 21:21 | 只看该作者
14# huangqi412
呵呵,是有点乱:lol

使用特权

评论回复
16
johnwjl| | 2011-4-12 21:24 | 只看该作者
把:
trig = stat&(stat^save);
改为:
trig  = 0;
if (stat  &&  stat != save) {    // stat 表示按键被按下, stat != save表示按键有变化
    trig  = 1;
}
或:
trig = stat && stat !=save;
就更具有易读性了。

https://bbs.21ic.com/icview-227575-1-1.html 中用的是状态机没错,
但此贴说是状态机,似乎有点牵强。

使用特权

评论回复
17
XIANSir|  楼主 | 2011-4-12 21:51 | 只看该作者
16# johnwjl
见仁见智!!
如果是对于“&”和"^"这两个运算符足够敏感的话,原来的代码反而更易读懂了。

使用特权

评论回复
18
123jj| | 2011-4-13 05:42 | 只看该作者
白娘子老公进展神速,友情帮顶~~~

使用特权

评论回复
19
xlovenn| | 2011-4-13 08:21 | 只看该作者
很佩服楼主,顶起,我也要向楼主学习!

使用特权

评论回复
20
pcwangyihui| | 2011-4-13 14:49 | 只看该作者
但是想要同时支持短按和长按,还需要修改

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:冷暖自知,泰然处之;持之以恒,必有所成!

0

主题

609

帖子

2

粉丝