完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、矩阵按键的简介
在键盘中按键数量较多时,为了减少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。 可以对照上面原理图看。 根据上面的代码,我们就可以扫描出是哪一个按键按下,然后在编程中就根据相应的按键执行相应的功能代码就行。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 03:04 , Processed in 1.192449 second(s), Total 49, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号