如何识别5个任意组合的按键

[复制链接]
 楼主| dce 发表于 2007-1-20 16:13 | 显示全部楼层 |阅读模式
我做一个数据采集系统,终端是一个有5个按键的东西,每个键都是按键按一下有效(只能按一次),这5个按键有可能每个都按一下,也有可能只按其中任意几个,现在我是用1H表示1号键,2H表决2号键,4H表示3号键,8H表示4号,10H表示5号。如终端按了1号和2号键,就向主机送3H这个数,以此类推,问题是我的主机怎么去识别这个3H表示1键和2键,不可能把5键所有组合列一个表吧?有没有什么简单一点的办法?
sirius_cx 发表于 2007-1-20 16:18 | 显示全部楼层

可以考虑这样做

按照楼主的意思应该是只是用到按键组合里面的少数几个,这样的话,只要列表使用到的几个键值就可以了,其他的按键组合没有相应处理就当作无效的按键


仅供参考
一级菜鸟 发表于 2007-1-20 16:18 | 显示全部楼层

换个编码

按位与就行,分离出bit4-bit0的各位,就知道某个键被按下了
 楼主| dce 发表于 2007-1-20 16:28 | 显示全部楼层

一级菜鸟,能不能再说明白点。谢谢

sirius_cx:5个键的组合太多了
一级菜鸟 发表于 2007-1-20 16:44 | 显示全部楼层

呵呵,俺干活干累了

Key=送进来的键值

C:
while(1)
{
    if (Key & 0b00000001)
        //键1被按下
        .
        .
    if (Key & 0b00000010)
        //键2被按下
        .
        .
    if (Key & 0b00000100)
        //键3被按下
        .
        .
    if (Key & 0b00001000)
        //键4被按下
        .
        .
    if (Key & 0b00010000)
        //键5被按下
        .
        .
}



ASM

    MOV A,KEY
    ANL A,#000000001B
    JNZ xxx   ;键1被按下
    MOV A,KEY
    ANL A,#000000010B
    JNZ xxx   ;键2被按下
    MOV A,KEY
    ANL A,#000000100B
    JNZ xxx   ;键3被按下
    MOV A,KEY
    ANL A,#000001000B
    JNZ xxx   ;键4被按下
    MOV A,KEY
    ANL A,#000010000B
    JNZ xxx   ;键5被按下

当然,你最好设置一个变量来与,做一个循环,左移这个变量,然后比较,程序就短很多,俺懒得写,你自己看了。

americ 发表于 2007-1-20 17:07 | 显示全部楼层

1H表示1号键,2H表决2号键,4H表示3号键,8H表示4号,10H表示5号

错误!!


5号键发送 10H   还是   16H   ????????



如果是10H   就不要考虑 区分 “其中任意几个”

因为,2号键与4号键按下,是不是一样10H???

如果相同,根本无法区分。
---先从原理上搞清楚吧。


一级菜鸟 发表于 2007-1-20 17:20 | 显示全部楼层

LS弄错了,2号键与4号键按下是0AH

 楼主| dce 发表于 2007-1-20 17:22 | 显示全部楼层

多谢一级菜鸟!!

 楼主| dce 发表于 2007-1-20 17:26 | 显示全部楼层

americ我用的是16进制

conwh 发表于 2007-1-20 22:40 | 显示全部楼层

最多用个编码器

sharpxcb 发表于 2007-1-24 21:21 | 显示全部楼层

按鍵组合与长短的识别

   楼主有空到这个地方去看看:
相关链接:http://www.mymcu-ic.com/bbs/bbs.asp?t=72&p=1&id=19363&s=default
 楼主| dce 发表于 2007-1-25 17:16 | 显示全部楼层

多谢sharpxcb

winhiwang 发表于 2007-1-25 18:08 | 显示全部楼层

用每一位代表一个按键的办法最简单可行

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

本版积分规则

dce

8

主题

22

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
dce

8

主题

22

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部