请问单片机4*4矩阵键盘如何检测并返回多个按键按下的键值和多个按键抬起的键值?(注:不使用死循环)

假如我按下按住按键1和按键2,都不抬起按键,程序能处理一次按键1按下的事件和按键2按下的事件,接着抬起按键1和按键2,程序能处理按键1抬起的事件和按键2抬起的事件。给出思路或者程序都好。

第1个回答  推荐于2017-12-15
你按键要是没有松手检测的话,按键按下后程序会执行一次按键一的数据,然后在执行按键2的数据,按键1和按键2就成了循环检测了,执行两个按键事件,如果按键有松手检测的话,例如按键1按下,程序会在按键1哪里等待按键松手后,才会跳出按键,否则按键会一直死在哪里等待按键松手,希望我的回答对你有帮助!

那就用这种方法解决:

if(keyxxx == 0)
{
if(++i <= 10)
return;
//
if(keyxxx == 0)
{
i = 0;
//处理按键程序
}
}

if(keyxxx == 0)
{
if(++y <= 10)
return;
//
if(keyxxx == 0)
{
y = 0;
//处理按键程序
}
}追问

这样处理那需要用到太多的计数变量了,并且这个还不包括按键抬起的处理

追答

这样是用很多计数变量,但是占用CPU资源很小

本回答被网友采纳
第2个回答  2014-11-06
定时 5ms 检测一次,比较两次的结果,
无论是按下、还是释放,都可以检测出来。追问

可以说得详细一点吗?

追答

每扫描一行,就得到四位数。
扫描四行,把结果凑成16位。
这16位,就代表了全部的按键信息。
无论是按着、还是没按,都在这16位数里面。
然后,慢慢比较分析去吧。

追问

那这样怎么实现消抖呢?当已经有一个按键按住的情况下,再按其它按键如何消抖?

追答

针对每个按键,都设定一个计数单元,统计5ms的次数。

按下了多少毫秒,松开了多少毫秒,都有据可查。

到了多少次算是短按、多少次算是长按,包括双击,都可以实现。

针对每个按键,都设定一个计数单元,统计5ms的次数。

按下了多少毫秒,松开了多少毫秒,都有据可查。

到了多少次算是短按、多少次算是长按,包括双击,都可以实现。

本回答被提问者采纳

请问单片机4*4矩阵键盘如何检测并返回多个按键按下的键值和多个按键抬起...
按键1和按键2就成了循环检测了,执行两个按键事件,如果按键有松手检测的话,例如按键1按下,程序会在按键1哪里等待按键松手后,才会跳出按键,否则按键会一直死在哪里等待按键松手,希望我的回答对你有帮助!

单片机矩阵式键盘显示设计中,如何处理多个按键同时按下的情况
矩阵键盘有多种键盘算法,如果是行列扫描的话,多个按键同时按下是可以得到所有的键值,如果是线反转法的话,就会有误判的可能。行列扫描的话,一次只扫描一行按键,而且对应行的按键的状态也会通过互相独立的IO得到。

单片机中的4×4矩阵键盘的键值怎么求?
还要结合你的程序来编码键值,如果有键按下了,查询所有按键的所连接的I\/O口电平状态,每个按键需要两个I\/O口,一端连接行(行4bit之一),一端连接列(列4bit之一);若此时按键的电平状态为0010 0001,即十六进制数据0x21,按下的按键所对应的键值编码即为0x21。当然为了使用方便,在确定了按下...

C语言,4X4矩阵键盘怎么判断有再次按键发生?
你在程序检测到按键后,加个延时去抖,不要加松手检测。然后执行第一个按键相对应的程序。然后继续按键扫描。注意这里说的是继续,也就是继续往下检测。否则你的程序就只能执行第一个按键所对应的程序了。这样,就能检测到你第二次按键的键值了。当然,这个扫描是循环的。也就是说即使你第二次按的按键...

单片机中的4×4矩阵键盘的键值怎么求?
由于单片机IO端口具有线与的功能,因此当任意一个按键按下时,行和列都有一根线被线与,通过运算就可以得出按键的坐标从而判断按键键值。原理如同矩阵数列的行列式 可以用下述代码进行:\/\/*** \/\/函数功能: \/\/单片机驱动4*4键盘,读入键盘值并使用数码管静态 \/\/显示按键键值,若没有数码管用8421...

谁能给我讲明白单片机的4x4矩阵键盘工作原理
给P1赋值0xf0,这时P1^4,P1^5,P1^6,P1^7为高电平,P1^0,P1^1,P1^2,P1^3为低电平。如果这时候有按键按下那么P1^4,P1^5,P1^6,P1^7就有一个会变成低电平。因此P1的值就不等于0xf0,这是就可以判断有按键按下。4x4矩阵键盘的工作原理是在矩阵式键盘中,每条水平线和垂直线在交叉...

4x4按键矩阵原理是什么?为什么要移位?他是怎么样确认按键位置的,求教大 ...
这个是高低电平反转法确定4x4按键,P1口4位接行矩阵四位接列矩阵。首先让P1口高四位为0,低四位为1。若有按键按下,则低四位中会有一个1翻转为0,高四位不会变,此时即可确定被按下的键的列位置。然后让P1口高四位为1,低四位为0。若有按键按下,则高四位中会有一个1翻转为0,低四位不会...

单片机4*4矩阵按键如何计算键值???
MOV KEY,A ;保存键值 CJNE A,#0FFH,JIANZHI LJMP KEY_SCAN JIANZHI:MOV R4,#0FFH MOV DPTR,#TABLE_JIANZHI LOOP:INC R4 INC 58H MOV A,R4 MOVC A,@A+DPTR CJNE A,KEY,BAOHU MOV KEY_NUMBER,R4 BAOHU:MOV A,58H CJNE A,#17,LOOP RET TABLE_JIANZHI: ;键值表 DB 0E7H,0D...

单片机独立键盘和4*4矩阵键盘中松手检测的区别,为什么矩阵键盘不能...
一般来说,4*4矩阵键盘函数的返回值是:按键信息0~15,和没有按键的代码16。当有键按下后,还要反复检测按键,当得到返回值是16,才能认为全部按键都已经松手。独立键盘,while(key!=0);只是等待这个按键盘何时松手,其它键,假如仍然按着,程序也不管了。独立键盘的检测,实在是太简单了。

怎样知道单片机的矩阵键盘每个按键的地址?
3、单片机先将行置第电平0,列置高电平1.4、在键盘扫描程序中,判断是否有任意按键按下:if((P1&0xf0)!=0xf0),表示有按键按下,延时消抖后,再次判断,如果(P1&0xf0)!=0xf0,则表示有按键按下。5、然后开始逐行扫描:P1=0xfe; \/\/第一行置为低电平“0”(P1.0输出低电平“0...

相似回答