打印

请高手指点矩阵按键处理问题

[复制链接]
3495|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liaoyaohui|  楼主 | 2009-10-3 22:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的要求:
比如当一个键出现机械故障时,我要其它键还能正常工作,并且不是组合键的话,我多键同按时要响应最后那个键,组合键再另做处理,我试了下电脑键盘是这样的,而我现在的行扫描法完全不行,只能响应最先扫描的键,不能区分后按先按,请高手耐心指点,小弟万分感谢!

相关帖子

沙发
bluerain| | 2009-10-3 23:05 | 只看该作者
如果刚开始学写程序的话,先用手画流程图然后再写程序。熟练之后流程图可以不用手画,仅存于脑

使用特权

评论回复
板凳
songbangyan| | 2009-10-3 23:05 | 只看该作者
这个好像有点耗费单片机的资源,你可以这样尝试,扫描键盘的时候设置为至少两次扫描,若出现变化则重复扫描,直到两次扫描结果一样就结束。这样就能始终是得到你最后一个按键的值,但是这样很耗费单片机的资源。不管是中断还是扫描都很费。所以一般的单片机设计都是设计为响应第一按键。

使用特权

评论回复
地板
zhaoyu2005| | 2009-10-4 08:44 | 只看该作者
不是不能区分,是你的程序不能区分,也就是你的程序出算法没有达到要求。
对于一个不知道怎么实现的程序,首先做的不是,想着怎么用程序实现,而是先在纸上或者拿些东西,让这些东西模拟键盘,人在们识别哪个按键先按,哪个后按,然后分解成单片机能识别的程序,然后优化,有些东西凭空想,很难想通,要是比划下,可能瞬间醒悟

使用特权

评论回复
5
zhyq7130912| | 2009-10-4 11:01 | 只看该作者
要实现你说的这个功能关键在你的软件处理,刻在第一个键按下时延时等待是否有其他键按下。

使用特权

评论回复
6
不亦心| | 2009-10-4 11:07 | 只看该作者
本帖最后由 不亦心 于 2009-10-4 11:08 编辑

试试这样:
矩阵键盘程序的结构:检测是否有键按下→去抖动(检测按键闭合情况是否发生变化)→扫描行列→判断按键是否松开→获得键值


;//////变量地址申明./////////////////////////////////////////////
  HANG      DATA    50H          ;键盘编码行数.
  LIE       DATA    51H          ;键盘编码列数.
;//////以下是7*7矩阵键盘扫描程序.///////////////////////////////
AGAIN:     MOV      P0,#0FFH
  MOV      P2,#0FFH
  MOV      A,P0                                          ;读P0口,看有无按键按下.
  MOV      B,A                                      ;B暂存P0口状态.
  JZ       AGAIN                                  ;p0口为低电平,则无键按下,跳回重扫描键盘.
  LCALL           DELAY10M                                  ;有键按下,则延时10MS去除抖动.
  MOV      A,P0                                          ;延时后重读键盘.
  XRL      A,B                                          ;看是否与10MS前按键一致.
  JNZ      AGAIN                                  ;不一致说明为无效按键,跳回重新扫描.
  MOV      R1,#80H                                  ;行扫描用.
  MOV      R4,#07H                                  ;列扫描次数.
  MOV      LIE,#00H                                  ;逐列扫描.
LOOP:      MOV      A,R1
  RR       A
  MOV      R1,A        
  MOV      P2,A
  MOV      A,P0
  JNB      ACC.0,NEXT1                      ;逐行检测.
  MOV      HANG,#00H
  LJMP     SONGKAI
NEXT1:     JNB      ACC.1,NEXT2
  MOV      HANG,#01H
  LJMP     SONGKAI
NEXT2:     JNB      ACC.2,NEXT3
  MOV      HANG,#02H
  LJMP     SONGKAI
NEXT3:     JNB      ACC.3,NEXT4
  MOV      HANG,#03H
  LJMP     SONGKAI
NEXT4:     JNB      ACC.4,NEXT5
  MOV      HANG,#04H
  LJMP     SONGKAI
NEXT5:     JNB      ACC.5,NEXT6
  MOV      HANG,#05H
  LJMP     SONGKAI
NEXT6:     JNB      ACC.6,BACK
  MOV      HANG,#06H
  LJMP     SONGKAI
BACK:              INC     LIE                          ;扫描下一列.
  DJNZ     R4,LOOP                                  ;检测列是否扫描完毕.
  LJMP     AGAIN                                  ;不断检测扫描键盘.
;//////判断按键是否松开,及得到键值.///////////
SONGKAI:   MOV      A,P0
  JNZ      SONGKAI
  MOV      A,HANG
  MOV      B,#07H                                  ;行数*7+列数=键值.
  MUL      AB
  ADD      A,LIE

……

使用特权

评论回复
7
liaoyaohui|  楼主 | 2009-10-4 12:04 | 只看该作者
首先感谢上面的朋友!  但问题还没有得到具体解决

上楼的朋友我的是下降沿响应  就是多键都按着不动时响应最后那个按着不动的
  并且多键相同时我又怎么区分哪个是最后一个按下,我觉得我的扫描法不行,总是自己定义的低位开始最后总是响应低位,高位就没反应了。
  我试了下电脑键盘就是这种效果,可以很多键同按都没有问题。

使用特权

评论回复
8
NE5532| | 2009-10-4 12:20 | 只看该作者
计算机键盘是采用On-OFF码的形式工作的,键盘下面单独有一个单片机专门负责处理键盘扫描,你按下一个键,键盘就通知PC,某个键被按下了,你再按下一个键,又通知PC,然后你把第一个键放开了,键盘再通知PC说第一个键被放开了,这样你就可以非常灵活地做键盘扫描了。

你的问题出在:把单片机当成单线程在使用,要把CPU时间充分利用起来,让他一直扫下去,每次扫到键,先在内存里记录状态,再进行判断。

使用特权

评论回复
9
不亦心| | 2009-10-4 12:38 | 只看该作者
程序上俺是无能为力了。

硬件上好像有个专用芯片8279,不知道能不能解决这个问题,不是很了解这个芯片。

使用特权

评论回复
10
liaoyaohui|  楼主 | 2009-10-5 11:17 | 只看该作者
哪位高手能帮小弟给个具体的算法么?  不幸感激!!

使用特权

评论回复
11
liaoyaohui|  楼主 | 2009-10-9 10:16 | 只看该作者
这段时间大虾都跑哪里去了
  小弟我急啊!

使用特权

评论回复
12
84335262| | 2009-10-9 13:59 | 只看该作者
其实按电脑键盘这样也能做的,在普通扫描的基础上加点就行了。普通矩阵扫描为:按键中断或时间片扫描 - 获取按键值 - 如果有多个按键按下则判断是否组合键,否则按程序规则取其中一个 - 键应用
而你要做到电脑键盘这样,可以:按键中断或时间片扫描 - 获取按键值 - 与废键寄存器中按键比较,如果获取的按键值存在在废键寄存器中,则该值不做响应 - 剩下的如果有多个按键按下则判断是否组合键,否则按程序规则取其中一个 - 将本次扫描到的按键(除了选取的应用键)全部记入废键寄存器,废键寄存器更新 - 键应用

使用特权

评论回复
13
liaoyaohui|  楼主 | 2009-10-11 23:05 | 只看该作者
比较的方法我也想过,但是假如像电脑键盘那样一百多个键盘那其不是储存很麻烦,还有消抖延时问题,一般延时多久效果最好?

使用特权

评论回复
14
84335262| | 2009-10-12 13:57 | 只看该作者
哪里麻烦了?
如果你要做到按先后顺序恢复按键的话那还比叫麻烦。电脑键盘1百多个键,应该要使用100多个寄存器。但是实际上电脑键盘不纪录先后顺序的,只知道是不是废的,所以只要标记就好了,一个寄存器能标记8个键(8位机),普通的4*4键盘两个寄存器搞定,电脑键盘也不过16个寄存器,根本不多。消抖……一般都是10ms

使用特权

评论回复
15
hero4422| | 2009-10-12 15:30 | 只看该作者
可以利用第一个中断触发定时键盘扫描;把定时的时间做小;每次扫描就是记录扫描数据;
知道没有按键或一次键盘动作100ms后开始处理记录的数据;

使用特权

评论回复
16
hero4422| | 2009-10-12 15:30 | 只看该作者
可以利用第一个中断触发定时键盘扫描;把定时的时间做小;每次扫描就是记录扫描数据;
知道没有按键或一次键盘动作100ms后开始处理记录的数据;

使用特权

评论回复
17
一个牧师| | 2009-10-12 22:46 | 只看该作者
定时扫描
和没有按键的寄存器的情况进行比较
当不同时证明有按键按下
相同则证明没有按键按下
每个都比较就好了
如果先比较的和没有按键按下的寄存器不同了就不进行比较就不行了

使用特权

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

本版积分规则

个人签名:听说21ic里面大虾多,我来学习学习。

18

主题

67

帖子

0

粉丝