单片机4x4矩阵键盘工作原理盘

后使用快捷导航没有帐号?
查看: 1668|回复: 7
矩阵键盘的低功耗处理(已解决)
在线时间1697 小时
威望1720分
芯币1221枚
E金币318枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1720, 距离下一级还需 280 积分
纯净的硅(高级), 积分 1720, 距离下一级还需 280 积分
本帖最后由 sint27 于
11:54 编辑
QQ图片51.png (20.1 KB, 下载次数: 0)
10:06 上传
矩阵按键如图所示,正常的扫描处理左边三个IO口做输出,上面的三个IO做输入,按照常规方法处理都能正常工作。
问题是这个产品需要做低功耗,需要按键中断唤醒。
我自己尝试过以下方法:
1、休眠前输出口输出高,输入中断设置为上升沿中断,此方法无法产生中断。
2、输出口输出低,输入口内部上拉,下降沿或上升沿中断,虽然可以中断,但是会误触发(即没按键操作也会中断唤醒)
在这之前我也做过矩阵按键的低功耗处理,那时候的原理图如下
QQ图片33.png (41.26 KB, 下载次数: 0)
10:06 上传
像这种加了下拉的采用上述方法1即可
如以上所诉,对于第一个原理图,各位有什么好方法可以解决中断唤醒的问题?
PS:问题已解决,扫描方式和中断触发方式都改成输出口输出低,输入内部上拉即可
在线时间2339 小时
威望3769分
芯币9627枚
E金币281枚
TA的帖子TA的资源
第二种方法应该可以,检查一下为什么会误触发发。
先看看输出的三个引脚是不是真的输出低电平,再看看上拉电阻是不是真的使能了。
感谢你的回答
我用万用表量了输出口确实是低电平,输入口电压在0-0.5V之间跳变,如果上拉正常应该是什么情况&
在线时间11 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
灌灌灌灌灌灌灌灌灌灌
在线时间1697 小时
威望1720分
芯币1221枚
E金币318枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1720, 距离下一级还需 280 积分
纯净的硅(高级), 积分 1720, 距离下一级还需 280 积分
第二种方法应该可以,检查一下为什么会误触发发。
先看看输出的三个引脚是不是真的输出低电平,再看看上拉 ...
感谢你的回答
我用万用表量了输出口确实是低电平,输入口电压在0-0.5V之间跳变,如果上拉正常应该是什么情况
上拉成功了应该是高电平才对&
在线时间2339 小时
威望3769分
芯币9627枚
E金币281枚
TA的帖子TA的资源
感谢你的回答
我用万用表量了输出口确实是低电平,输入口电压在0-0.5V之间跳变,如果上拉正常应该是什么 ...
上拉成功了应该是高电平才对
恩,我再找找电路上的问题,谢谢&
在线时间1697 小时
威望1720分
芯币1221枚
E金币318枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1720, 距离下一级还需 280 积分
纯净的硅(高级), 积分 1720, 距离下一级还需 280 积分
上拉成功了应该是高电平才对
恩,我再找找电路上的问题,谢谢
在线时间317 小时
E金币1034枚
TA的帖子TA的资源
一粒金砂(高级), 积分 396, 距离下一级还需 104 积分
一粒金砂(高级), 积分 396, 距离下一级还需 104 积分
公共端直接接外部中断脚就可以了
公共端是指哪一个,那三个输入脚是接的外部中断&
在线时间1697 小时
威望1720分
芯币1221枚
E金币318枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1720, 距离下一级还需 280 积分
纯净的硅(高级), 积分 1720, 距离下一级还需 280 积分
公共端直接接外部中断脚就可以了
公共端是指哪一个,那三个输入脚是接的外部中断
EEWORLD 官方微信
Powered by5442人阅读
51单片机(12)
前面提到了独立按键,可见,独立按键是由矩阵键盘分离而来的。接下来看的是 4*4 的矩阵键盘,这里使用的还是上节所使用的,延时消抖检测。
先附上矩阵键盘的原理图:
在使用据矩阵键盘时,J5 排针处的跳帽连接 1 脚和 2 脚,使所有按键的有效端口全部连接至 I/O 口。
具体的扫描方式为:
先把P3^0~P3^7高四位和第四位赋不一样的电平值,当确定有键按下时,检测按下的是哪一行或哪一列(原本高电平的四位中有一位会变低电平),再将高四位和第四位赋与上一次相反的电平。再检测,即可找到所按下的按键。
实例为:把S4~S19 这16个按键,从上到下、从左至右,分别设置为1~16不同的键值,当S4按下时,数码管显示为 1;当S19按下时,数码管显示为16。
其核心代码如下(数码管段码,显示函数等变量的定义,请参照前面给出的数码管的博文):
uchar key_value = 0;
void matrixKeyScan()
P3 = 0x0f;
temp = P3;
if(temp != 0x0f)
delay10ms();
if(temp!= 0x0f)
switch(temp)
case 0x0e :key_value = 1; break;
case 0x0d :key_value = 5; break;
case 0x0b :key_value = 9; break;
case 0x07 :key_value = 13;break;
P3 = 0xf0;
temp = P3;
if(temp != 0xf0)
switch(temp)
case 0xe0 : key_value +=3 ; break;
case 0xd0 : key_value +=2 ; break;
case 0xb0 : key_value +=1 ; break;
case 0x70 : key_value +=0 ; break;
while(P3 != 0xf0);
void main()
matrixKeyScan();
if(key_value & 9)
dspbuf[1] = key_value%10;
dspbuf[0] = key_value/10;
dspbuf[0] = key_
dspbuf[1] = 10;
display();
注:在此我们基于的是89C52单片机的按键扫描,但是对于蓝桥杯指定开发板平台(CT107D)所用的单片机为STC15F2K61S2,它与STC89C52在矩阵键盘的区别的是:前者没有P3^6和P3^7这两个 I/O 口,他们分别用P4^2,P4^4代替,具体的可以就参照STC15F2K61S2芯片手册(其他的区别大致有:它的运行速度比51单片机快,工作时可以选择是否分频;它的中断模式比51多,一些 I/O 口有其他功能等等……)。
这里有几点需要注意:
1、在编程时,主函数尽可能少的进行一些数据处理等操作,主函数主要用来调用其他的函数。
2、若使用的是STC15F2K61S2单片机,则在给 P3 口的两次赋值和高四位的电平检测阶段,需要将P4^2,P4^4单独列出来,与其余6个P3引脚的 I/O 口一起检测,并且在使用P4^2,P4^4之前,需要进行sbit位定义,以及 P4 引脚的寻址(srf P4 = 0xC0)。
3、P3口的第二次赋值,应该也囊括在第一个 if 语句之中,因为只有当确定按下之后,才会开始行与列的扫描,行、列扫描是对于一次按键的扫描,所以不可分开。
未完待续……任务简述:通过按下4X4矩阵键盘实现数码管对应显示数字
实现方式:通过行列分接法,可以节省使用单片机的I/O口,扫描矩阵键盘是否有按下,判断P2端口得到的值。
protues 硬件系统
单片机晶振复位电路:
锁存器、上拉电阻:
4x4矩阵键盘:
代码实现:
void key44scan(void)//键盘扫描函数
P2=<span style="color: #xfe;
t=t&<span style="color: #xf0;
if(t!=<span style="color: #xf0)
case <span style="color: #xee:keynum=<span style="color: #; break;
case <span style="color: #xde:keynum=<span style="color: #; break;
case <span style="color: #xbe:keynum=<span style="color: #; break;
case <span style="color: #x7e:keynum=<span style="color: #; break;
P0=table[keynum];
while(t!=<span style="color: #xf0)
t=t&<span style="color: #xf0;
P2=<span style="color: #xfd;
t=t&<span style="color: #xf0;
if(t!=<span style="color: #xf0)
case <span style="color: #xed:keynum=<span style="color: #; break;
case <span style="color: #xdd:keynum=<span style="color: #; break;
case <span style="color: #xbd:keynum=<span style="color: #; break;
case <span style="color: #x7d:keynum=<span style="color: #; break;
P0=table[keynum];
while(t!=<span style="color: #xf0)
t=t&<span style="color: #xf0;
P2=<span style="color: #xfb;
t=t&<span style="color: #xf0;
if(t!=<span style="color: #xf0)
case <span style="color: #xeb:keynum=<span style="color: #; break;
case <span style="color: #xdb:keynum=<span style="color: #; break;
case <span style="color: #xbb:keynum=<span style="color: #; break;
case <span style="color: #x7b:keynum=<span style="color: #; break;
P0=table[keynum];
while(t!=<span style="color: #xf0)
t=t&<span style="color: #xf0;
P2=<span style="color: #xf7;
t=t&<span style="color: #xf0;
if(t!=<span style="color: #xf0)
case <span style="color: #xe7:keynum=<span style="color: #; break;
case <span style="color: #xd7:keynum=<span style="color: #; break;
case <span style="color: #xb7:keynum=<span style="color: #; break;
case <span style="color: #x77:keynum=<span style="color: #; break;
P0=table[keynum];
while(t!=<span style="color: #xf0)
t=t&<span style="color: #xf0;
阅读(...) 评论()[图]薄膜键盘 4*4矩阵键盘 单片机外扩键盘,捷配电子市场网
您好,欢迎来到捷配电子市场网
您所在的位置:&&>>薄膜键盘 4*4矩阵键盘 单片机外扩键盘
加工定制:否产品类型:功率二极管是否进口:是品牌/商标:PHILIPS/飞利浦型号/规格:BB153
深圳市杰d子有限公司 专营二.三级管等电子,诚信合作. 联系电话:6 / 9 欢迎大众惠顾! 联系QQ: /
详情请登陆 本公司 网址:www.jiexing168.com强势推出原装大功率三极管打造市场最低价本公司最新到货大功率功放音响配对管:2SA96 2SA97 2SA98 2SA00 2SA802SA81 2SB688-2SD718 2SB778-2SD998 2SD817-2SD93-2SC4-2SC68-2SA94-2SC92-2SC3856 TIP41C-TIP42C2SC0、 2SD669-2SB649 TIP35C-TIP36C TIP31A-TIP32A 2SB834-2SD880 2SB649-2SD669 2SA11 2SB83........ 开关电源 彩电电源 晶体管:2SD99 D209L D、1、 2SC44、2SC20、2SC87、2SC52、2SC39、2SC55、2SD1556、IRFZ44N&& 肖特基:MBR1015、MBR1020、MBR1045、MBR1060、MBR1010、MBR2015、MBR2045、MBR2060、MBR2010、MBR2020、MBR3045、MBR3060、MBR3010、F12C20A、F12C20C、MUR1060&h
最新技术资料C51单片机编程技巧(八):矩阵键盘C51单片机编程技巧(八):矩阵键盘阿尔法技术百家号最近回老家一趟,再加上要组织一个游戏、还要上课写作业,耗费了好大精力,更新的有点晚,大家见谅哈。这次我接着上次的说,讲一下复合按键和矩阵键盘。说单片机键盘之前先说一下上一篇文章遇到的囧事:(七)的文章标签我感觉好奇怪啊,我明明写的是单片机教程啊,为什么会有上面的标签...郁闷...( ˇ.ˇ )...关键是这个标签不是由作者贴上去,好气啊!!所以这次我就故意强调一下侧重点哈。先说矩阵键盘,因为我写的组合键代码是在矩阵键盘的基础上写的,当然在独立按键上写组合键更简单一些。所以当你矩阵键盘的组合键会写的时候,你在独立按键上的组合键也就会写了。矩阵键盘的检测和独立按键有很大的区别,但是究其本质还是一样的。先看一下矩阵键盘的原理图:矩阵键盘原理图由于矩阵键盘中每一个按键的两个接线口都是接在IO口上的,所以我们就必须在软件里面控制单片机在每个独立按键的两端加上不同的电平。【注】:独立按键很简单,直接在一端接地就行了。从上面的原理图中可以看出 P1 口的高四位控制 行,第四位控制 列;所以我们就可以写 P1 = 0X0F 或者写 P1 = 0XF0,这样就实现了在每一个独立按键两端加上不同的电平。代码编写流程和独立按键一样,第一步要先检测到按键按下,根据上面的原理图,矩阵键盘检测按键是否按下只要给 P1 口赋值 0X0F,然后检测 P1 口的值是否还是 0X0F即可。之后就要消除抖动,消除抖动的方法还是一样,延时一段时间即可,如图:单片机矩阵键盘消除抖动之后就判断具体是哪个按键按下就行了。【注】矩阵键盘复杂就是复杂在这里。判断到底是哪个按键按下的思路有两种:1、逐行扫描逐行扫描就是说先扫描第一行中的哪个按键按下了,如果没有再扫描第二行,看一下是不是第二行里的某个按键按下了,如果还没有找到按下的那个按键,那么就继续扫描第三行、第四行,知道找出哪个按键被按下了。这个代码实现比较简单,而且这种扫描方法不怎么常用,效率不高,所以这里我就不写了。2、行列扫描行列扫描就是说先扫描所有的行,确定是哪一行的按键被按下了,之后再扫描所有的列,找出哪一列有按键被按下了,这样只要扫描两次就可以确定出到底是哪个按键被按下了。具体代码实现如下:1、行扫描:单片机矩阵键盘行扫描2、列扫描:单片机矩阵键盘列扫描最后别忘了按键的松开检测:单片机矩阵键盘按键松开检测这样矩阵键盘的编写就说完了,下面说组合键,写第七篇的时候我给它起名字叫复合按键,现在觉得不太好,要不就叫组合键吧。组合键就是说当按住一个按键的同时再按另一个按键的时候,会有不同的效果。比如:Ctrl+C是复制、Shift+数字键可以敲出特殊字符等等。代码编写思路就是:当按住第一个按键的时候,只要这个按键不松开就一直检测能够和它组合的按键,根据按键的不同组合实现不同的效果。代码如下:单片机矩阵键盘组合键大家对照代码仔细看一下就明白了,下面我把我下的代码放出来,大家可以复制到自己的软件里面运行一下看看效果:unsigned int MatrixKey()//矩阵键盘扫描函数,采用行(ROW)列(Column)扫描//由原理图知:四列分别是:P1^4, P1^5, P1^6, P1^7//四行分别是:P1^0, P1^1, P1^2, P1^3,即0X列行//一般的矩阵键盘按键检测//先初始化IO口:MatrixKeyValue = 0xf0;if (MatrixKeyValue != 0xf0)//检测是否有按键按下delay(10);if (MatrixKeyValue != 0xf0)MatrixKeyValue = 0xf0;//扫描列,把行置为低电平switch (MatrixKeyValue)case (0xE0): Key = 0;case (0xD0): Key = 1;case (0xB0): Key = 2;case (0x70): Key = 3;MatrixKeyValue = 0x0f;//扫描行,把列置为低电平switch (MatrixKeyValue)case (0x0E): Key += 0;case (0x0D): Key += 4;case (0x0B): Key += 8;case (0x07): Key += 12;//检测按键是否松开while ( MatrixKeyValue != 0x0f );/*//下面的是组合键的编程if (MatrixKeyValue != 0xf0)//检测是否有按键按下delay(10);if (MatrixKeyValue != 0xf0)MatrixKeyValue = 0xf0;//扫描列,把行置为低电平switch (MatrixKeyValue)case (0xE0): Key = 0;case (0xD0): Key = 1;case (0xB0): Key = 2;case (0x70): Key = 3;MatrixKeyValue = 0x0f;//扫描行,把列置为低电平switch (MatrixKeyValue)case (0x0E): Key += 0;case (0x0D): Key += 4;case (0x0B): Key += 8;case (0x07): Key += 12;//检测按键是否松开while ( MatrixKeyValue != 0x0f )if(Key == 0)//确定按下的是第一个键//当确定按下的是第一个键的时候,检测有没有组合键按下if (MatrixKeyValue != 0x0f)//检测是否有按键按下delay(10);if (MatrixKeyValue != 0x0f)MatrixKeyValue = 0xf0;//扫描列,把行置为低电平if (MatrixKeyValue == 0xC0)//第一、二列MatrixKeyValue = 0x0f;//扫描行,把列置为低电平if (MatrixKeyValue == 0x0E)//第一行//组合键效果:Key = 9;if (Key == 0)MatrixKeyValue = 0x0f;*/return K本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。阿尔法技术百家号最近更新:简介:根据自身优势和利益整合资源作者最新文章相关文章

我要回帖

更多关于 4x4矩阵键盘工作原理 的文章

 

随机推荐