3002|5

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

问个关于按键的问题 [复制链接]

先描述一下,我程序要用一个读键的函数,已经差不多了,但这是判断读一个键的情况,而我要判断读2键的按下该怎么写呢???

因为从微观上看,两个键不可能同时按下的,该怎么写呢?????

下面是单个按键的思路,假如我里面要判断一个键3和键4同时按下的状态,大概该如何调整呢?
读键函数
{
if无键 {return 0; }
else   {
       if ((PIND&0xf0)>>4==0x7)            kkey=key4;    //键盘4按下
       else if ((PIND&0xf0)>>4==0xB)       kkey=key3;    //键盘3按下
       else if ((PIND&0xf0)>>4==0xD)       kkey=key2;    //键盘2按下
       else if ((PIND&0xf0)>>4==0xE)       kkey=key1;    //键盘1按下   
      }
while((PIND&0xf0)>>4!=0xf) {;}//等待按键释放
return  kkey;
}
说下思路,用伪语言写下!

最新回复

不就是经典的那一套吗 if 有键按下     延时去抖 if((key_state & 00001100) == 0)//假设键盘未按下则被拉成1,按下为0     检测到2个键同时按下,处理。。。           详情 回复 发表于 2007-5-9 18:48
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
看了你的程序,同时按下也可以产生唯一的健值,一样的识别就是了...
像你说的3,4键按下,那么,值应该就是:
0011(B) == 这个是唯一的

就连在等按键松开这个上做的一些处理也不用改...


你的接法应该是一个IO对应一个按键吧?呵呵
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你把问题想简单了啊
这样我尝试过了,不行啊,你想想,程序语句执行速度相当快,你不可能同时按下2个键(程序肯定先识别一个键)
你参考下另一个人给我的建议,我脑袋还晕乎乎的
///////////////////////////////////////////////
四个按键就容易一些了。

思路:

1、可以用状态机来做,就是把按键的几种方式定义成几个状态。

2、大概的几个状态有:第一个按键按下、第一个按键松开、第二个按键按下、第二个按键松开。

3、上面只是简单说了几种状态,各种状态之间的交替出现还需要你自己来分析细化。

4、下面再给你简单的开个头:

/*这个函数采用的是周期查询方式,只要10mS调用一次,执行完退出既可,不需一直等在这里*/
void key(void) {
static unsigned i;
switch(i) {
  case 0: 空闲状态。
   a、有按键按下,i = 1,进入下来个状态。
   b、没有按键按下,退出函数。
   break;
  case 1: 第一个按键按下。
   a、第二个按键也按下,i = 2, 进入下一个状态。
   b、第一个按键松开,相应状态处理、i = 0(复位状态变量)、退出函数。
   c、没有按键变化,退出函数。
   break;
  case 2:第二个按键按下。
   a、第二个按键松开,组合键生效执行相应处理。
   b、第一个按键松开,不合法按键,执行相应处理。
   c、没有按键变化,退出函数。
   break;
  }
}

上面给你提示了一个思路,供你参考,后面具体程序要你自己完成,不再进行具体辅导了(已经超出了辅导范围)。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
LZ,从你那我读到的是"同时"这个概念,不是向我们用的SHIFT这种组合键的概念

可以这样....
把人为的不同时变成同时.也就是像去抖过滤一样,把我们人产生的先后给去掉..

比如我们之前的,先识别有按键,然后再去找是什么方式的触发.在这个过程中做到充分的延时



 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
当然,你提到的那个组合健,是一种思路

但是,你注意一下,组合键自身是没有意义的...

并不适合你的要求:判断一个键3和键4同时按下的状态

如果3键是组合键,那它是不能单独使用...

咱再继续辨辨,呵呵
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
不就是经典的那一套吗

if 有键按下
    延时去抖
if((key_state & 00001100) == 0)//假设键盘未按下则被拉成1,按下为0
    检测到2个键同时按下,处理。。。



   
   
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表