矩阵按键的鬼键问题

本文探讨了在3x3矩阵按键中遇到的鬼键问题,即同时按下多个键导致键值判断错误。介绍了矩阵按键的工作原理,包括硬件电路和软件处理,并提出了解决鬼键的两种方案:使用独立按键代替或加装二极管。文章强调在实际应用中,需要从硬件和软件层面进行优化。
摘要由CSDN通过智能技术生成


前言

在做3x3按键矩阵时,本来是做单按键识别的,后来改需求需要能同时按下多个按键,经测试当同时按下超过两个按键,就会按键判断错误的情况”。


一、“鬼键”是什么?

在矩阵按键中,同时有三个及其以上被按下,出现按键键值判断错误的情况,称为“鬼键”。
如下图所示,只要w,x,y同时被按下,z没有被按下,都会检测到按下。
在这里插入图片描述

二、矩阵按键的原理

1.硬件电路

在这里插入图片描述

上图是标准的矩阵键盘的电路原理图,按键的两端会之间连接单片机的IO口,接线分为行列两种(p30-33为行线,p34-37为列线),通过调整行列的IO状态来判断哪个按键被按下,一般只适用同时两个按键或一个按键同时按下的情况。

2.软件处理

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个4x4矩阵键盘的鬼键51单片机示例代码: ``` #include <reg51.h> sbit ROW1 = P2^0; sbit ROW2 = P2^1; sbit ROW3 = P2^2; sbit ROW4 = P2^3; sbit COL1 = P2^4; sbit COL2 = P2^5; sbit COL3 = P2^6; sbit COL4 = P2^7; unsigned char key_code; void delay_ms(unsigned int t) //延时函数 { unsigned int i,j; for(i=0;i<t;i++) for(j=0;j<125;j++); } void key_scan() //键盘扫描函数 { ROW1 = 0; ROW2 = 1; ROW3 = 1; ROW4 = 1; //扫描第一行 if(COL1 == 0) { key_code = '1'; while(!COL1); return; } if(COL2 == 0) { key_code = '2'; while(!COL2); return; } if(COL3 == 0) { key_code = '3'; while(!COL3); return; } if(COL4 == 0) { key_code = 'A'; while(!COL4); return; } ROW1 = 1; ROW2 = 0; ROW3 = 1; ROW4 = 1; //扫描第二行 if(COL1 == 0) { key_code = '4'; while(!COL1); return; } if(COL2 == 0) { key_code = '5'; while(!COL2); return; } if(COL3 == 0) { key_code = '6'; while(!COL3); return; } if(COL4 == 0) { key_code = 'B'; while(!COL4); return; } ROW1 = 1; ROW2 = 1; ROW3 = 0; ROW4 = 1; //扫描第三行 if(COL1 == 0) { key_code = '7'; while(!COL1); return; } if(COL2 == 0) { key_code = '8'; while(!COL2); return; } if(COL3 == 0) { key_code = '9'; while(!COL3); return; } if(COL4 == 0) { key_code = 'C'; while(!COL4); return; } ROW1 = 1; ROW2 = 1; ROW3 = 1; ROW4 = 0; //扫描第四行 if(COL1 == 0) { key_code = '*'; while(!COL1); return; } if(COL2 == 0) { key_code = '0'; while(!COL2); return; } if(COL3 == 0) { key_code = '#'; while(!COL3); return; } if(COL4 == 0) { key_code = 'D'; while(!COL4); return; } } void main() { while(1) { key_scan(); if(key_code) //如果检测到按键 { P1 = key_code; //将按键码输出到P1口 key_code = 0; //清除按键码 } delay_ms(20); //每20ms扫描一次键盘 } } ``` 该代码通过扫描4行4列的矩阵键盘,检测到按键后将按键码输出到P1口。其中,ROW1~ROW4和COL1~COL4分别为矩阵键盘的行和列引脚,key_scan()函数为键盘扫描函数,delay_ms()为延时函数。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值