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

电子说

1.3w人已加入

描述

  矩阵键盘扫描

矩阵键盘

  矩阵键盘的原理图

  根据矩阵键盘的原理图可知,当没有按键按下时,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的值,可确定是哪一个按键;

  电路图如下:

矩阵键盘

  注意:

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

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

  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);

  }

  }

  }

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分