找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4927|回复: 13
收起左侧

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

[复制链接]
ID:516612 发表于 2021-1-27 13:00 | 显示全部楼层 |阅读模式
我是初学51单片机和C语言,前段时间学过矩阵按键后就有一个关于电脑键盘多按键的问题。
就是一般教程里面的矩阵键盘的程序都是行列扫描反转来检测位的,然后松开按键通过while程序来检测,但是遇到多按键的问题就无解了。比如我想按下1键的时候1数码管显示1,不松手再按下4则4数码管显示4,再不松手按7数码管7显示7,哪个按键松开则关掉哪个。
再比如像电脑键盘,要输入大写A,如果只按照教程的按键程序,当我们按下shift的时候,由于没有松手,那程序会一直卡在while,那么按下A和其他键的时候是无法检测的。如果不写松手检测程序,我查了一下现在键盘大多使用的是第二套扫描码,也就是通断都发数据,那如果不写松手检测,也就不会发送断码,那输入也是有问题的。更不用说Ctrl+Alt+这种组合按键了,那更没法用了。
想了几天也没有头绪,希望有经验的大神能帮我解惑。谢谢!
回复

使用道具 举报

ID:516612 发表于 2021-1-27 16:06 | 显示全部楼层
自顶一下
回复

使用道具 举报

ID:158375 发表于 2021-1-27 16:59 | 显示全部楼层
首先说说你想做什么?
按键扫描有很多种方式的,按需来完成既定功能。
回复

使用道具 举报

ID:872416 发表于 2021-1-27 17:07 来自手机 | 显示全部楼层
还有长按短按
回复

使用道具 举报

ID:516612 发表于 2021-1-27 17:18 | 显示全部楼层
本帖最后由 18674201426 于 2021-1-27 18:25 编辑
笨笨兔 发表于 2021-1-27 16:59
首先说说你想做什么?
按键扫描有很多种方式的,按需来完成既定功能。

我写的您可能没看太清楚,就比如我想按下1键的时候1数码管显示1,不松手再按下4则4数码管显示4,再不松手按7数码管7显示7,哪个按键松开则关掉哪个。其实实现什么功能倒是次要的,数码管显示无非就是段选。我主要是想知道怎样在按键1按下后,按下其他按键不会有冲突,因为用循环函数判断键位是否松开会卡住cpu直到按键松开为止。就像电脑键盘一样,截图就是Ctrl+Alt+A的3键组合,用循环函数判断键位是否松开,根本无法实现这个功能。
回复

使用道具 举报

ID:516612 发表于 2021-1-27 17:23 | 显示全部楼层

长按短按应该还是能直接用延时函数实现的,直接在短按后面继续延时就可以了,如果不需要短按的功能,可以在长按程序开始时关掉短按相关的处理
回复

使用道具 举报

ID:332444 发表于 2021-1-27 19:28 | 显示全部楼层
设计组合键是轻而易举的事,组合键也对应一个键值。
回复

使用道具 举报

ID:332444 发表于 2021-1-27 19:29 | 显示全部楼层
组合键可以同时按下也可分开按下
回复

使用道具 举报

ID:516612 发表于 2021-1-27 21:16 | 显示全部楼层
xianfajushi 发表于 2021-1-27 19:28
设计组合键是轻而易举的事,组合键也对应一个键值。

轻而易举的事吗?额,,,,您能抽空帮我写一个简单的我学习一下吗,怎么实现的。
就比如1,2,3,4这四个键,组成2x2的矩阵键盘,1按下 灯1亮,2按下 灯2亮,,3按下 灯3亮,4按下 4灯亮。
重点是:按下任意键在不松开的情况下,按下其他键,相应的灯都会亮,松开哪个按键,哪个灯就熄灭。
只有这样,当1键和2键同时按下的时候,经过延时,设定灯5亮,这样的组合键才能实现。
希望能帮我写个程序看看,谢谢大神!
回复

使用道具 举报

ID:332444 发表于 2021-1-28 07:44 | 显示全部楼层
很简单检测没有按键释放就重新扫描,把对应的值定义为需要的即可,写代码似乎不需要看你悟性。
回复

使用道具 举报

ID:89217 发表于 2021-1-28 08:21 | 显示全部楼层
真正写按键程序是没人用while的,一般一个程序里面只有一个主while,其他地方基本不用到,一些初学者总是容易被一些低级教程坑害,按键设计可以这样,当你按键按下时系统里面就生成标识,抬起时就抹除标识,这样无论什么时候只要标识还在就可以直接屏蔽当前操作,这样你做其他操作也不会影响当前值,因为你的案件没有抬起相当于屏蔽了此按键,如果是组合按键写法是不一样的,需要在一定的时间内完成和一直都生效是两种不同的写法,根据逻辑功能设置是必要的,不能一概而论
回复

使用道具 举报

ID:592807 发表于 2021-1-28 08:43 | 显示全部楼层
18674201426 发表于 2021-1-27 21:16
轻而易举的事吗?额,,,,您能抽空帮我写一个简单的我学习一下吗,怎么实现的。
就比如1,2,3 ...


按键扫描会吗?
简单点:扫描到第一个按键A后直接退出延时10ms再次扫描重复3次,若是后三次没出现新的按键值就直接输出A,扫描到其他按键就组合。
延时10ms和重复3次这个你可以看情况自己决定是否要
复杂点:4个按键值做一个4位的数组,从头到尾扫描一次,有检测被按下就对应的数组位置置1,然后检测有少少个1,就知道按了几个按键了。或者
回复

使用道具 举报

ID:158375 发表于 2021-1-28 08:47 | 显示全部楼层
18674201426 发表于 2021-1-27 17:18
我写的您可能没看太清楚,就比如我想按下1键的时候1数码管显示1,不松手再按下4则4数码管显示4,再不松手 ...

这个很好实现。
按键用定时器查询,定时中断消抖。
两次查询的不同,把那个多出来的发送出去即可。
按键可不管抬起。
回复

使用道具 举报

ID:743654 发表于 2021-1-28 08:49 | 显示全部楼层
程序能传上来研究吗?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表