打印

矩阵键盘多个按键同时按下的问题

[复制链接]
15130|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lzqxs89|  楼主 | 2012-11-7 16:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
情况:现在要做一个电脑键盘,电路图采用的是最普通的矩阵键盘设计(只有按键跟导线)在按键的排版碰到了许多问题! 当按下某三个键的时候,会默认为有第四个键按下(不管按下没,满足检测是否按下的按下条件)。
关于这种情况,我在网上没怎么找到相关资料,希望论坛里面的高手能够指点下!

相关帖子

沙发
zhhbncwu| | 2012-11-7 22:18 | 只看该作者
考虑在按键上串联一个二极管能否解决

使用特权

评论回复
板凳
loyou1993| | 2012-11-7 22:35 | 只看该作者
同意楼上的在X1-X4或者Y1-Y4加4个二极管及ok了!

使用特权

评论回复
地板
usbyt| | 2012-11-9 10:32 | 只看该作者
要做没有鬼键的Windows键盘?

使用特权

评论回复
5
lzqxs89|  楼主 | 2012-11-12 12:00 | 只看该作者
2# zhhbncwu 硬件电路不能改了,不知道软件有什么办法来检测按键

使用特权

评论回复
6
lzqxs89|  楼主 | 2012-11-12 12:44 | 只看该作者
4# usbyt 鬼键是硬件无法避免的,但是我不知道该怎么处理。我用的电脑键盘,但按下的三个键(已经产生鬼键),你再按其它的按键,它处理为没有任何键按下!但是怎么把鬼键全部找出来我不会!能提供点帮助么!

使用特权

评论回复
7
usbyt| | 2012-11-12 16:45 | 只看该作者
我有现成的

使用特权

评论回复
8
lzqxs89|  楼主 | 2012-11-13 15:25 | 只看该作者
7# usbyt 把你的知识给我们分享下吧,让我们这些小白学习学习啊,谢谢!说说你程序检测鬼键的思路,我还没想到怎么来判断是否产生鬼键了!

使用特权

评论回复
9
chuming666| | 2012-11-14 08:35 | 只看该作者
我有用软件识别过, 实际就是判断行或者列上是否有多键就可以了

使用特权

评论回复
10
lzqxs89|  楼主 | 2012-11-14 13:49 | 只看该作者
9# chuming666 可以详细说一下你的判断方法不?

使用特权

评论回复
11
JTAO| | 2012-11-14 16:17 | 只看该作者
矩阵式键盘,一百多键,要占用二三十个IO口吧,太浪费。
用全组合式方式5、6个接口就行了,不过要加很多二极管。
应该有现成的标准键盘方案吧。

使用特权

评论回复
12
th3520| | 2012-12-23 11:21 | 只看该作者
多站点io口无所谓了  只要方便修改就行  有好是方案吗

使用特权

评论回复
13
zhayl| | 2017-3-25 10:43 | 只看该作者

你看看这段程序怎么样?我自己写的。
#include <reg51.h>
#define KEY P1

//按键码,按键之间按位或运算
#define KEY1  0x11
#define KEY2  0x12
#define KEY3  0x14
#define KEY4  0x18
#define KEY5  0x21
#define KEY6  0x22
#define KEY7  0x24
#define KEY8  0x28
#define KEY9  0x41
#define KEY10 0x42
#define KEY11 0x44
#define KEY12 0x48
#define KEY13 0x81
#define KEY14 0x82
#define KEY15 0x84
#define KEY16 0x88

void Delay10ms(u8 c)//延时10ms
{
         u8 a,b;
         for( ; c>0; c--)
                 for(b=38; b>0; b--)
                         for(a=130; a>0; a--);
}

u8 GetKeyboard()//获取矩阵键盘按键值,支持多按键
{
         u8 key,i;

        key = 0xFF;
         for(i=KEY_Delay; i>0; i--)//按键延时 KEY_Delay*10ms
         {
                 KEY = 0x0F;
                 if(KEY == 0x0F) break;
                 if(KEY != (key & 0x0F))
                 {
                         Delay10ms(1);//消抖
                         if(KEY != (key & 0x0F))
                                 key &= (KEY | 0xF0);
                 }
                 KEY = 0xF0;
                 if(KEY == 0xF0) break;
                 if(KEY != (key & 0xF0))
                 {
                         Delay10ms(1);//消抖
                         if(KEY != (key & 0xF0))
                                 key &= (KEY | 0x0F);
                 }
                 Delay10ms(1);
         }
         return (~key);
}
本于技术交流原则。请不要用该代码用于商业用途.
另外,本人现在穷的揭不开锅了,借贴求职

使用特权

评论回复
14
lilinfei520| | 2017-6-29 16:43 | 只看该作者
zhayl 发表于 2017-3-25 10:43
你看看这段程序怎么样?我自己写的。
#include
#define KEY P1

就你这代码,还用于商业用途。。。

使用特权

评论回复
15
骑猪看夕阳| | 2017-7-1 15:39 | 只看该作者

使用特权

评论回复
16
入坑的小学生| | 2018-5-30 17:19 | 只看该作者
按键串联一个二极管就好了

使用特权

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

本版积分规则

29

主题

391

帖子

0

粉丝