27994|46

1673

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

如何设计2个按键同时按的键盘扫描C程序 [复制链接]

4*4键盘扫描C程序,每次只能扫到一个按键,如果要两个按键同时按,是不是先按下去的按键是进入中断
此帖出自单片机论坛

最新回复

如果不是右移,那又是什么来的?怎么理解?  详情 回复 发表于 2010-10-24 10:15
点赞 关注
个人签名要把目标订的实现起来辛苦一点!
 

回复
举报

3138

帖子

0

TA的资源

裸片初长成(初级)

沙发
 
 键盘扫描程序未必只读一个键呀,可以写成每次全都读一遍,但先按下者被先读到是有可能的。
此帖出自单片机论坛
 
 

回复

1万

帖子

16

TA的资源

版主

板凳
 
这个按键时,去一下抖动,判断出哪个就是哪个,若两一起按,你可选一个为按下键,若就想两个一起按,可选按信一个再按下另一个
此帖出自单片机论坛
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

1673

帖子

0

TA的资源

五彩晶圆(中级)

4
 
先谢谢LS2位
主程序是一直扫描按键的,我现在用的4*4,还剩4个按键没用到,我想增加一个记忆的功能,就是分别按S+A,S+B能分别记忆2种状态,以后再分别按A,B就能直接实现记忆的状态。这些状态是主程序里的CASE下分别调整的,先按S再按A,我想请教的是,是不是按S后要进入中断呀?
while(1)
    {
      P2=0x0f;
          P1=0x00;
      P0_0=0;
      P0_1=1;
      delay(10);
      temp=P2;
      temp=temp & 0x0f;
      if (temp!=0x0f)
        {
          delay(100);
          temp=P2;
          temp=temp & 0x0f;
          if (temp!=0x0f)
            {
              temp=P2;
              temp=temp & 0x0f;              
              switch(temp)
                {
                  case 0x0e:  P1_6=1;break;//
                  case 0x0d:  P1_5=1; break;//
                  case 0x0b:  P1_4=1; break;//
                  case 0x07:  P1_3=1; break;//
                }
              temp=P2;
              temp=temp & 0x0f;              
              while(temp!=0x0f)
                {
                  temp=P2;
                  temp=temp & 0x0f;              
                }
            }
        }

[ 本帖最后由 simonprince 于 2010-3-3 11:00 编辑 ]
此帖出自单片机论坛
 
个人签名要把目标订的实现起来辛苦一点!
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

5
 
 4楼这样的读键写法不好,建议改写成定时中断+状态机,避免用延迟等待程序。想要在嵌入式业界里玩,一定要过这一关。
此帖出自单片机论坛
 
 
 

回复

1673

帖子

0

TA的资源

五彩晶圆(中级)

6
 

回复 5楼 仙猫 的帖子

恩,谢谢,您是说用,定时中断,比如说每10ms,查看键盘状态我正在改呢
可我还想知道我4楼所说的2个按键的方法怎么处理,希望您指导下思路

[ 本帖最后由 simonprince 于 2010-3-3 11:51 编辑 ]
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
个人签名要把目标订的实现起来辛苦一点!
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

7
 

其实检测多键和一键并没什么区别

 比如每隔10ms读一次键,输出可以设一个16位的字,每位代表一个键,1/0分别代表On/Off。
 读键程序自己持有一个16位的静态变量作为本次读到的键值,保存给下次读键用。每次执行定时中断读键时,把本次读得的结果跟上次比较,如果相同就输出,不同就仅保存到静态变量里去作下次备用。这样输出的16个键的状态至少是经过10ms延迟过算“稳定”的,别的程序看这个值就知道有几个键被按下,位置在哪里。
 读键也能玩出很多花招来,上面说的只是用了尽量简单、不太消费资源的做法。
此帖出自单片机论坛
 
 
 

回复

1673

帖子

0

TA的资源

五彩晶圆(中级)

8
 
比如说我按下的是A键,中断读到的结果0X07,结果保存到静态变量K,10ms后再读。如果还是0X07就输出,如果不是(假如是B键0X0B)就保存0X0B到K,10ms后再读............
别的程序看到0X07这个值就知道是A键被按下了

那如果按S+D,就是先按S,按住不松手,马上再按D,我想让这个按键组合干别的事?
那程序会读出什么值才能满足这个按键组合

[ 本帖最后由 simonprince 于 2010-3-3 13:44 编辑 ]
此帖出自单片机论坛
 
个人签名要把目标订的实现起来辛苦一点!
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

9
 
 使每个键的On/Off信息只占用一位二进制,各键的bit位置不同。比如定义单独按A键为0x0001,按B键为0x0002,按C键为0x0004,这样若在输出看到0x0005的键值时就知道是A和C的组合了。
此帖出自单片机论坛
 
 
 

回复

1673

帖子

0

TA的资源

五彩晶圆(中级)

10
 
哦,O(∩_∩)O谢谢你的指点
此帖出自单片机论坛
 
个人签名要把目标订的实现起来辛苦一点!
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

11
 
需要电路配合。不是随便就可以的
此帖出自单片机论坛
 
 
 

回复

557

帖子

0

TA的资源

裸片初长成(初级)

12
 
原帖由 simonprince 于 2010-3-3 10:45 发表
先谢谢LS2位
主程序是一直扫描按键的,我现在用的4*4,还剩4个按键没用到,我想增加一个记忆的功能,就是分别按S+A,S+B能分别记忆2种状态,以后再分别按A,B就能直接实现记忆的状态。这些状态是主程序里的CASE下分别 ...


笨笨磕磕地,但是很仔细地阅读了这个循环,学到了很多东西,谢谢!

有几个问题:

1、键值处理主要在case段实现的,这里只有四个case (7,b,d,e),这样是不是说只处理单个键的按下;

2、P0_0和P0_1的初始赋值,是否表示P0_1-1虽然有硬连线,但是并不参与键扫描;

3、还有,这里只处理了P2的低四个bit(temp & 0x0f),是否意味着,只处理这四个键的扫描。

4、在case中的分号后面,表示或许要补充转移或者启动中断子程,那么返回点如何处理,是否仍然需要继续后续的按键释放判断(指第三个while段)。

5、两个不同延时的处理的优点是什么?我的理解是外环10mS快扫,是加速;后者(100mS)主要完成消抖;

问题很低级,多打扰了。
此帖出自单片机论坛
 
个人签名为什么总用3/4号仿宋? 答:大点清楚‘,仿宋是工程图的标准字体。
 
 

回复

3227

帖子

0

TA的资源

五彩晶圆(中级)

13
 

需要电路配合。不是随便就可以的

需要电路配合。不是随便就可以的
此帖出自单片机论坛
 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

14
 
如果电路不支持两键同时按下。那么会发生误判
此帖出自单片机论坛
 
 
 

回复

557

帖子

0

TA的资源

裸片初长成(初级)

15
 

具体问题,具体分析

   需要电路配合。不是随便就可以的.非常重要的提示。

   编程和硬件层的相关程度是嵌入/单片机与PC的C编程的主要差异。即便是初学者也会注意到的。要真正学点东西或者搞清楚些什么,往往需要软硬结合的。例如看到一张电路图(硬件)时,最好主动去联想它的软件联系;同样阅读一段程序,也总是要估计(包括揣摩)一下硬件结构,否则可能无法真正理解这段程序。

   问题总是具体的,这里是跟随4楼 Mr.simonprince的帖子进行讨论具体到这段程序,为了读懂这段程序,也反推了它的硬件结构,还好不是太难,如图。



   其中,属于没把握反推的主要有两处(左):

1、P0_1。利用P0的0和1的赋值可以方便地把按键(或开关)分成两组,分别进行扫描,这里就认为P0_1(=1)暂时不进入扫描范围,举个例子,有些便携式设备往往需要加锁(封锁)某些键来避免误操作;
2、认为P2输入的检测是八位的(P2_0:7);

   即使排除以上的揣测(这些命题为假),那P0_0=0;和P2_0:3组合作为键扫描(右)就不是揣测,而是真的了,其实这是个典型的键扫硬件结构。

   综上,通过读取的经过延时(消抖)后的P2_0:3的值,就已经全面地反映了键组的状态。
   那么,怎样处理双键同时的问题呢?其实只要:
  a,  多加几个case,或者干脆,
   
  b,  把这个P2状态作为一个键服务子程函数的参数,就完全可以处理这四个键任意(扣除0,最多十五个)组合。至于如何处理这个键服务子程函数,那是具体应用设计的问题。不消说两个键,就是三个、四个都可以(不过很少这么用的,也许,电子琴和弦弹奏时就会用到)。

   如果把变量temp改个名字,例如叫scan_value、key_status等,也许对初学者方便些……这叫提高可读性?(初学者就是事多,又提出一个问题!)


[ 本帖最后由 xiaoxif 于 2010-3-4 12:58 编辑 ]
此帖出自单片机论坛
 
个人签名为什么总用3/4号仿宋? 答:大点清楚‘,仿宋是工程图的标准字体。
 
 

回复

986

帖子

0

TA的资源

五彩晶圆(初级)

16
 

回复 楼主 simonprince 的帖子

矩阵键盘的组合键检测,有一个较有效的方法可以参考。
作两遍扫描,第一遍行发检测脉冲,列读按键状态;第二遍列发检测脉冲,行读到键盘状态。
两遍扫描的方法,可以检测所有的单键和两个组合键的按键输入,对于三键的组合键不能完全检测到。
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
个人签名电子工程师技术交流QQ群:12425841,专注于自动控制、数字电源等
 
 

回复

557

帖子

0

TA的资源

裸片初长成(初级)

17
 

作业

原帖由 simonprince 于 2010-3-3 10:45 发表
先谢谢LS2位
主程序是一直扫描按键的,我现在用的4*4,还剩4个按键没用到,我想增加一个记忆的功能,就是分别按S+A,S+B能分别记忆2种状态,以后再分别按A,B就能直接实现记忆的状态。这些状态是主程序里的CASE下分别 ...


对先生这段程序的学习笔记--做为一份作业(一张框图),麻烦给看看,望多指点,谢谢。

此帖出自单片机论坛
 
个人签名为什么总用3/4号仿宋? 答:大点清楚‘,仿宋是工程图的标准字体。
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

18
 
4楼的程序估计并非完成品,但意图是大致清楚的(楼主如能出示一下电路图就更清晰了):

①.P0是输出口,P2是输入口。
②.每次P0输出1位(估计是b3~b0),激活4×4键盘的1行(列)。
③.输出P0后等delay(10)是留置了充电时间,为了让读回的值更稳定。
④.对于每1行(列),从P2的b3~b0读回1列(行)的键通/断信息,从而定位被按下的键(case)。
⑤.如未发现有键被按下则立即离开,否则稍等后再看键值(delay(100),防抖)。
⑥.P1是读键结果的输出。
⑦.读到一个按键后循环等待它释放之后再行下一次检测,周而复始。

另:delay的参数不一定是ms,不能做定量分析。
这个程序无法正常测出复合键,一是因为case里没有对多键同时按下的处理,而更重要的是手按键总会有先后,等待释放才做下一次检测就永远读不到后按下的那个键了,应作改动如下:

【原来】
  temp = P2;
  temp = temp & 0x0f;              
  while (temp != 0x0f)
  {
      temp=P2;
      temp=temp & 0x0f;
  }

【改成】
  while ((P2 & 0x0f) != temp);

[ 本帖最后由 仙猫 于 2010-3-4 15:57 编辑 ]
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

2955

帖子

0

TA的资源

纯净的硅(初级)

19
 
学习了,谢谢........................
此帖出自单片机论坛
 
个人签名不断地学习,才会有创新!
淘宝小店:手机、qq点卡、游戏点卡自动充值 http://shop63727265.taobao.com/
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

20
 

抱歉+更正

 俺在18楼提出了检测复合键的改动方案,仔细了下,是错的,因为在这个循环里,由P0激活的那一行(列)被固定了,被按的两个键如果不在同一行(列)里还是检测不出来。
 这会田里的农活正忙,稍后写个中断+状态机的代码试试,应该也是很短的。
此帖出自单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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