单片机 人工智能 矩阵按键
矩阵按键需要用多少个
单片机引脚进行连接呢?
矩阵按键的扫描方法有何优缺点呢?具体怎样去实现?
回帖(1)
2022-2-23 10:39:45
一、矩阵按键的简介
在键盘中按键数量较多时,为了减少I/0口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。电路连接的原理图如下图所示。
从上图可以看出16个按键只用了8个引脚,比用简单方法(一个按键连接一个引脚)连接减少了8个引脚的开支。
想一想如果要接20个按键呢?用矩阵按键的接法,需要用多少个单片机引脚呢?解决方法如下图所示,最终我们只需要用9个单片机引脚即可。
二、矩阵按键扫描方法
1、优缺点讨论
每个按键都接一个引脚,这种方法虽然有浪费引脚的弊端,但也有一个好处,那就是在编程中方便判断引脚是否按下,只用检测所连接引脚的电平即可。
把按键集中起来,用矩阵的排列方式连接,这样有一个好处就是节约引脚,但是在编程时,如果要检测哪个按钮是否按下,就没有原始连接方法那样容易判断了。但学习了矩阵按键的扫描方法后,就变得很容易了。
2、矩阵按键扫描方法
此次矩阵按键的扫描方法:行列扫描法。
行列扫描: 可以通过高四位全部输出低电平,低四位输出高电平。当按收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,行确定了,列也确定了,这样就可以确定具体是哪一个按键按下了。
3、具体的编程思路
看图说话,代码如下:
//定义函数中要用到的变量
int key; //存储哪一个按键按下
int key_scan()
{
P1=0x0f; //引脚的高四位输入低电平,低四位输入高电平
if(P0!=0x0f) //此时检测矩阵按键中是否有按键按下,如果有按键按下,则低四位中某个引脚就会输入低电平
{
delay(100); //延时消抖
if(P1!=0x0f) //再确认一次按键按下
{
//测试列
switch(P1)
{
case(0X07): key=1;break; //第一列有按键按下,则低四位中的第4位会变为0
case(0X0b): key=2;break; //第一列有按键按下,则低四位中的第3位会变为0
case(0X0d): key=3;break;
case(0X0e): key=4;break;
}
//测试行
P1=0Xf0; //引脚的低四位输入低电平,高四位输入高电平
switch(P1)
{
case(0X70): key=key;break; //第一行有按键按下
case(0Xb0): key+=4;break; //第二行有按键按下
case(0Xd0): key+=8;break;
case(0Xe0): key+=12;break;
}
}
}
return key;
}
这里解释一下上面代码中的一个片段,这里涉及一个小小的算法。代码片段如下:
switch(P1)
{
case(0X70): key=key;break;
case(0Xb0): key+=4;break;
case(0Xd0): key+=8;break;
case(0Xe0): key+=12;break;
}
这里是根据矩阵按键扫描的行、列号直接计算出来了对应的按键序号。原理分析如下:
第一次列扫描,知道第n列有按键按下后。
接下来行扫描,如果第一行有按键按下,那么按键序列号就是列序列号。
如果第二行有按键按下,那么按键序列号就是列号+4。
如果第三行有按键按下,那么按键序列号就是列号+8。
如果第四行有按键按下,那么按键序列号就是列号+12。
可以对照上面原理图看。
根据上面的代码,我们就可以扫描出是哪一个按键按下,然后在编程中就根据相应的按键执行相应的功能代码就行。
一、矩阵按键的简介
在键盘中按键数量较多时,为了减少I/0口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。电路连接的原理图如下图所示。
从上图可以看出16个按键只用了8个引脚,比用简单方法(一个按键连接一个引脚)连接减少了8个引脚的开支。
想一想如果要接20个按键呢?用矩阵按键的接法,需要用多少个单片机引脚呢?解决方法如下图所示,最终我们只需要用9个单片机引脚即可。
二、矩阵按键扫描方法
1、优缺点讨论
每个按键都接一个引脚,这种方法虽然有浪费引脚的弊端,但也有一个好处,那就是在编程中方便判断引脚是否按下,只用检测所连接引脚的电平即可。
把按键集中起来,用矩阵的排列方式连接,这样有一个好处就是节约引脚,但是在编程时,如果要检测哪个按钮是否按下,就没有原始连接方法那样容易判断了。但学习了矩阵按键的扫描方法后,就变得很容易了。
2、矩阵按键扫描方法
此次矩阵按键的扫描方法:行列扫描法。
行列扫描: 可以通过高四位全部输出低电平,低四位输出高电平。当按收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,行确定了,列也确定了,这样就可以确定具体是哪一个按键按下了。
3、具体的编程思路
看图说话,代码如下:
//定义函数中要用到的变量
int key; //存储哪一个按键按下
int key_scan()
{
P1=0x0f; //引脚的高四位输入低电平,低四位输入高电平
if(P0!=0x0f) //此时检测矩阵按键中是否有按键按下,如果有按键按下,则低四位中某个引脚就会输入低电平
{
delay(100); //延时消抖
if(P1!=0x0f) //再确认一次按键按下
{
//测试列
switch(P1)
{
case(0X07): key=1;break; //第一列有按键按下,则低四位中的第4位会变为0
case(0X0b): key=2;break; //第一列有按键按下,则低四位中的第3位会变为0
case(0X0d): key=3;break;
case(0X0e): key=4;break;
}
//测试行
P1=0Xf0; //引脚的低四位输入低电平,高四位输入高电平
switch(P1)
{
case(0X70): key=key;break; //第一行有按键按下
case(0Xb0): key+=4;break; //第二行有按键按下
case(0Xd0): key+=8;break;
case(0Xe0): key+=12;break;
}
}
}
return key;
}
这里解释一下上面代码中的一个片段,这里涉及一个小小的算法。代码片段如下:
switch(P1)
{
case(0X70): key=key;break;
case(0Xb0): key+=4;break;
case(0Xd0): key+=8;break;
case(0Xe0): key+=12;break;
}
这里是根据矩阵按键扫描的行、列号直接计算出来了对应的按键序号。原理分析如下:
第一次列扫描,知道第n列有按键按下后。
接下来行扫描,如果第一行有按键按下,那么按键序列号就是列序列号。
如果第二行有按键按下,那么按键序列号就是列号+4。
如果第三行有按键按下,那么按键序列号就是列号+8。
如果第四行有按键按下,那么按键序列号就是列号+12。
可以对照上面原理图看。
根据上面的代码,我们就可以扫描出是哪一个按键按下,然后在编程中就根据相应的按键执行相应的功能代码就行。
举报
更多回帖