0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

4x4矩阵键盘工作原理及扫描程序

姚小熊27 来源:网络整理 2018-02-24 15:30 次阅读

矩阵键盘扫描

4x4矩阵键盘工作原理及扫描程序

矩阵键盘的原理图

根据矩阵键盘的原理图可知,当没有按键按下时,P1=0xf0;然后依次将P1^0~P1^3单独置低电平,其他置高,再扫描各列的状态,来判断是哪个按键按下,比如,将P1^0输出低电平,其他的引脚都输出高电平,即P1=0xfe,那么当第1行有按键按下时P1的相应值为,

1X1(01111110=0x7e)1X2(10111110=0xbe)1x3(11011110=0xde)1X4(11101110=0xee)

将P1^1输出低电平,其他的引脚都输出高电平,即P1=0xfd,那么当第2行有按键按下时P1的相应值为,

2X1(01111101=0x7d)2X2(10111101=0xbd)2x3(11011101=0xdd)2X4(11101101=0xed)

将P1^2输出低电平,其他的引脚都输出高电平,即P1=0xfd,那么当第2行有按键按下时P1的相应值为,

3X1(01111011=0x7b)3X2(10111011=0xbb)3x3(11011011=0xdb)3X4(11101011=0xeb)

将P1^3输出低电平,其他的引脚都输出高电平,即P1=0xfd,那么当第2行有按键按下时P1的相应值为,

4X1(01110111=0x77)4X2(10110111=0xb7)4x3(11010111=0xd7)4X4(11100111=0xe7)

/*

程序中用到了置位,如果检测第一行时置位为0xfe,是为了初始化一下P1口,初始化后

*/

#include《reg52.h》

unsignedintVal;

voidDelay(unsignedintt);

voidmain(void)

{

while(1)

{

if(P1!=0xf0)//当没有按键按下时,P0=0xf0;

{

Delay(1500);//去抖

if(P1!=0xf0)//表示按键还在按下,判断是哪个按键

{

P1=0xfe;//置位为fe,检测第一行11111110

//根据矩阵键盘原理图,当非第一行有按键按下时P1一直保持为0xfe

if(P1!=0xfe)//将P1置为0xfe后,经过一个指令周期后如果它还是0xfe说明按下的键不在第一行

{

Val=P1;

Delay(1500);//去抖

while(P1!=0xfe);//等待按键弹起

P0=Val;

}

P1=0xfd;//置位为fd,检测第二行11111101

if(P1!=0xfd)

{

Val=P1;

Delay(1500);

while(P1!=0xfd)

P0=Val;

}

P1=0xfb;//置位为fb,检测第三行11111011

if(P1!=0xfb)

{

Val=P1;

Delay(1500);

while(P1!=0xfb)

P0=Val;

}

P1=0xf7;//置位为f7,检测第四行11110111

if(P1!=0xf7)

{

Val=P1;

Delay(1500);

while(P1!=0xf7)

P0=Val;

}

}

}

}

}

voidDelay(unsignedintt)

{

while(--t);

}

4X4矩阵键盘扫描

1. 4根行线的GIO均设为Output,根列线的GIO均设为Input;

2. 4根行线的GIO分别置为0111、1011、1101、1110,读逐一读取列线GIO的值,可确定是哪一个按键;

电路图如下:

4x4矩阵键盘工作原理及扫描程序

注意:

1. 图中用作输入的GIO,一定要有一个上拉电阻

2. 芯片中的每一个引脚是否用作了GPIO口来用,需配置芯片的寄存器,使引脚当作GPIO口来使用,才会有效。

4x4矩阵键盘工作原理及程序

4x4矩阵键盘工作原理及扫描程序

矩阵键盘的动态扫描确实略显复杂,不可能就是读一个端口数据,然后马上就出来结果。这需要对依次每一行的按键进行扫描、判断,然后得出结果。如上图所示,先扫描第一行,也就是S1,S2,S3,S4四个按键的状态。在PA口输入0XFE。

0XFE变成二进制是11111110,为了方便使用,记得每四个数之间加一个空格。11111110这个数据放到PA口上,假设这个时候S1被按下了,会出现什么情况?因为PA0是低电平,S1被按下之后S1导通,导致PA4的电平从1降到0,于是PA端口的数据就变成了11101110,换算成16进制就是0XEE。于是我们知道S1被按下了。

假设是S3被按下,会出现什么情况?没错,PA6的电平被拉低,PA的端口数据变成了10111110,也就是0XBE。这样,我们就知道了,每一行的每一个按键被按下的时候,都会有一个对应的独一无二的值。这就是矩阵键盘的扫描原理!送上一段源码。

voidmatrixkeyscan()

{

uchartemp,key;

P3=0xfe;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delayms(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case0xee:

key=0;

break;

case0xde:

key=1;

break;

case0xbe:

key=2;

break;

case0x7e:

key=3;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delayms(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case0xed:

key=4;

break;

case0xdd:

key=5;

break;

case0xbd:

key=6;

break;

case0x7d:

key=7;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

P3=0xfb;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delayms(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case0xeb:

key=8;

break;

case0xdb:

key=9;

break;

case0xbb:

key=10;

break;

case0x7b:

key=11;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

P3=0xf7;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delayms(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case0xe7:

key=12;

break;

case0xd7:

key=13;

break;

case0xb7:

key=14;

break;

case0x77:

key=15;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 矩阵键盘
    +关注

    关注

    7

    文章

    204

    浏览量

    31125
收藏 人收藏

    评论

    相关推荐

    求助4X4矩阵按键点亮LED程序

    求助4X4矩阵按键点亮LED程序,按下按键,相应的lde灯(不是数码管)点亮,放开熄灭,在按下了一个按键相对应的led灯点亮,放开熄灭,C语言程序,谢谢。
    发表于 01-23 17:07

    求助,最实用51单片机4X4键盘扫描程序(要有注释),不要反转法,多谢各位!

    求助,最实用51单片机4X4键盘扫描程序(要有注释),不要反转法,多谢各位!
    发表于 06-30 06:47

    基于FPGA的4x4键盘矩阵

    基于FPGA的4x4键盘矩阵
    发表于 12-14 01:26

    求一篇汇编语言写的4x4矩阵键盘控制条形LED显示的程序

    求一篇汇编语言写的4x4矩阵键盘控制条形LED显示的程序,电路图如下。求助求助
    发表于 12-25 09:30

    如何接口矩阵4x4键盘接口与spartan 3e fpga?

    嗨,请帮我接口矩阵4x4键盘接口与spartan 3e fpga,描述fpga上要使用的引脚和要写入的代码。
    发表于 11-11 11:51

    分享基于STM32 4x4键盘扫描尝试过程中踩到的雷

    基于STM32 4x4键盘扫描小白接触ARM快两周了,开发板上4个按键已经不能满足学习需要。开发板上按键都是一个按键对应一个IO口,大量浪费IO口资源,那需要很多很多按键怎么办呢,难道
    发表于 01-05 07:56

    矩阵键盘的基本扫描步骤

    一、模块题目二、原理简述1、矩阵键盘扫描思想(转载+删减)与独立按键不同的是,按键的两个引脚都分别连接的单片机的I/O端口,一个作为行信号,另外一个作为列信号。下以4X4
    发表于 01-11 07:00

    如何对一种4X4矩阵薄膜键盘模块进行仿真呢

    什么是矩阵键盘呢?薄膜键盘的优点有哪些呢?如何对一种4X4矩阵薄膜键盘模块进行仿真呢?
    发表于 01-17 08:36

    4x4矩阵按键的扫描步骤是怎样的?

    4x4矩阵按键的扫描步骤是怎样的?
    发表于 01-21 06:21

    4*4矩阵键盘扫描程序分享

    由于买的最小系统开发板只有一个按键感觉不大方便调试和搞其他东东,所以又在某宝买了一个4*4矩阵键盘拓展一下按键哈。能力有限,参照之前学的51单片机例程写了份简单粗暴型的按键
    发表于 02-17 06:31

    什么是矩阵键盘矩阵键盘扫描原理介绍

    ,由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘4X4和8
    发表于 02-28 06:32

    带有stm32的宏键盘4x4矩阵

    描述带有stm32的宏键盘4x4矩阵
    发表于 08-16 06:48

    4x4矩阵键盘程序及原理图PCB

    4x4矩阵键盘程序及原理图PCB,供大家下载。
    发表于 12-21 18:25 0次下载

    51键盘扫描程序

    51键盘扫描程序,包含3X4矩阵键盘4X4矩阵
    发表于 08-18 18:00 8次下载

    4x4矩阵键盘工作原理扫描程序

    ,所以必须外接上拉电阻,当I/O口为P1、P2和P3口时,由于内部已有上拉电阻,因此可省略外接的上拉电阻。 二、按键消抖 单片机系统中所使用的键盘都是机械式的弹性按键,因为存在机械触点的弹性作用,在按键闭合和弹起的瞬间都会出现抖动,如图
    的头像 发表于 04-07 14:36 6070次阅读
    <b class='flag-5'>4x4</b><b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b><b class='flag-5'>工作原理</b>及<b class='flag-5'>扫描</b><b class='flag-5'>程序</b>