51的矩阵键盘(4*4)的原理与实现

个人感觉,这个矩阵键盘的出现,就是为了减少串行口的使用,像这个4*4的矩阵键盘,8个串行口就可以控制16键,而如果是普通的则需要16个串行口,同样的效果,串行口的使用减少了一般,对于串行口资源紧张的情况,这个矩阵键盘是个不错的选择。

但凡事都不可能都是好的,你的串行口使用减少了,那么使用难度也相应上去了。接下来,让我们来看看这个矩阵键盘的使用原理。

电路图
在这里插入图片描述
接线
ROW1-4,COL1-4依次接入P1的0-7。(端口可以自己自行设置)

原理
要想获取键盘的输入值,每次需逐行或逐列进行扫描。例如,当给给ROW全高电平,COL1低电平,其余全高,即给入11101111信号,此时扫描的是第一行。若K00按键被按下,则读取到P1口的信号为11101110,当K10按键被按下,则读取到P1口的信号为11101101,依次类推,当K30被按键,则读取的到信号为11100111。所以,可知道,当扫描第一行时,每个按键被按下,都能在P1口读取到相应的信号,注意,这个信号是唯一的,这是基础也是保证。接下来的第二行,第三行,第四行都依次类推,同时,每按下一个按钮,都能得到一个唯一的信号。
然后,好了,既然给个按键都对应一个唯一的信号,那么,我们只要判断读取到的信号是什么,那么我们就能知道是哪个按键被按下去了。
(PS.扫描方式有很多,各种扫描,上面是我自己觉得还可以的扫描方式,也比较简单,其它扫描方式,你们可以自行摸索一下。)

好了,原理差不多了。老规矩,我把我写的矩阵扫描键盘的函数给弄上(注意哈,我这写的代码的接线跟上面说的应该是相反的即COL1-4接P1的0-3,ROW1-4接P1的4-7):
实现代码

int key_read(void)
{
 int jgtime = 40,num = -1;
 
 P0 = 0xfe; // 第一列
 if((P0 & 0xfe) != 0xfe)
 {
  delay_ms(jgtime);
  if((P0 & 0xfe) != 0xfe)
  {
   switch(P0 & 0xf0)
   {
    case 0x70: num = 1; break;
    case 0xb0: num = 4; break;
    case 0xd0: num = 7; break;
    case 0xe0: num = 10; break;
   }
  }
 }
  
 P0 = 0xfd; // 第二列
 if((P0 & 0xfd) != 0xfd)
 {
  delay_ms(jgtime);
  if((P0 & 0xfd) != 0xfd)
  {
   switch(P0 & 0xf0)
   {
    case 0x70: num = 2; break;
    case 0xb0: num = 5; break;
    case 0xd0: num = 8; break;
    case 0xe0: num = 0; break;
   }
  }
 }
  
 P0 = 0xfb; // 第三列
 if((P0 & 0xfb) != 0xfb)
 {
  delay_ms(jgtime);
  if((P0 & 0xfb) != 0xfb)
  {
   switch(P0 & 0xf0)
   {
    case 0x70: num = 3; break;
    case 0xb0: num = 6; break;
    case 0xd0: num = 9; break;
    case 0xe0: num = 11; break;
   }
  }
 }
  
 P0 = 0xf7; // 第四列
 if((P0 & 0xf7) != 0xf7)
 {
  delay_ms(jgtime);
  if((P0 & 0xf7) != 0xf7)
  {
   switch(P0 & 0xf0)
   {
    case 0x70: num = 12; break;
    case 0xb0: num = 13; break;
    case 0xd0: num = 14; break;
    case 0xe0: num = 15; break;
   }
  }
 }
 return num;
}

void delay_ms(unsigned int n)
{
 int i,y;
 for(i=n;i>0;i--)
  for(y=114;y>0;y--);
}

其实,这个矩阵键盘明白的扫描原理,也不难,你到这里,基本也明白了这个矩阵怎么用。好了,这次的矩阵键盘就到了。最后,恭喜你,又学会一个!

最后说下,那个去读函数的返回值就是按键上的值…

  • 9
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值