分享 收藏 返回

单片机/MCU论坛

韦小齐 关注 私信

[文章] 新型矩阵键盘编程

2012-8-25 20:03

今天逛论坛的时候看到一篇讲4*4矩阵键盘的,提出一种矩阵键盘的新型接法,特节省I/O口,贴子没有写程序,只提供了硬件连接,把自己写的程序贴出来供大家交流,有不当之处烦劳各位提出。
硬件连接如下图所示:



可以看到只用了4个口就完成了4*4的键盘。注明:该电路非本人所设计。
不才写的程序如下,经过了proteus仿真单片机P1口接1个共阴数码管。键盘连接如上图所示。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
/*void delay(uint x)
{
while(x--);
}*/
uchar keyscan()
{
uchar temp;
P0=0x0f;
temp=P0;
if(temp!=0x0f)
{
  delay(3000);
  temp=P0;
  if(temp!=0x0f)
  {
   return(temp);
  }
}
P0=0x0e;
temp=P0;
if(temp!=0x0e)
{
  delay(3000);
  temp=P0;
  if(temp!=0x0e)
  {
   temp|=0xf0;
   return(temp);
  }
}
P0=0x0d;
temp=P0;
if(temp!=0x0d)
{
  delay(3000);
  temp=P0;
  if(temp!=0x0d)
  {
   temp|=0xe0;
   return(temp);
  }
}
P0=0x0b;
temp=P0;
if(temp!=0x0b)
{
  delay(3000);
  temp=P0;
  if(temp!=0x0b)
  {
   temp|=0xd0;
   return(temp);
  }
}
P0=0x07;
temp=P0;
if(temp!=0x07)
{
  delay(3000);
  temp=P0;
  if(temp!=0x07)
  {
   temp|=0xc0;
   return(temp);
  }
}
return 0;
}
void main()
{
uchar whichkey;
P1=0;
while(1)
{
  whichkey=keyscan();
  switch(whichkey)
  {
   case 0x0e:P1=table[1];break;
   case 0x0d:P1=table[2];break;
   case 0x0b:P1=table[3];break;
   case 0x07:P1=table[4];break;
   case 0xfc:P1=table[5];break;
   case 0xfa:P1=table[6];break;
   case 0xf6:P1=table[7];break;
   case 0xec:P1=table[8];break;
   case 0xe9:P1=table[9];break;
   case 0xe5:P1=table[10];break;
   case 0xda:P1=table[11];break;
   case 0xd9:P1=table[12];break;
   case 0xd3:P1=table[13];break;
   case 0xc6:P1=table[14];break;
   case 0xc5:P1=table[15];break;
   case 0xc3:P1=table[0];break;
  
  }
}
}

程序比较简单,因为这些天光在论坛上瞎溜达了,没有动手写程序,算是热身了吧。仿真结果显示,按下相应的按键,数码管显示对应的数字。

回帖(43)

欧阳里

2012-8-25 21:14:39
四个IO口控制4x4键盘,这种接法不错。你的程序也写的没问题。
P0=0x0f;
p0=0x0e;
p0=0x0d;
p0=0x0b;
p0=0x07;
这几种是可以读回相应键值。写的不错哦。

罗森尼

2012-8-26 10:39:52
我有个想法,是用16线4线优先编码器来进行按键信号的处理,这样也只要4个IO口就可以完成一个4*4矩阵键盘的操作,只是不知道是否存在这种编码器。

欧阳里

2012-8-26 12:31:16
楼主这种方法很不错啊。。

2012-8-26 16:36:13
好厉害!

浩雨共天涯

2012-8-26 16:42:02
这样的方法还是比较不错的啊

gxyzya

2012-10-19 16:46:51
LZ的程序似乎没有考虑当对地4个按键扫描结束后,扫描其它行时恰好有对地键按下的情况呢,比如P0=0x0f扫描时K1没有按下,扫到P0=0x0e时K1正好按下,此时LZ的程序得到的是K1还是K4按下呢?还有如果是同时按两个按键好像可能会出现误判喔

hzyong

2012-10-19 23:40:23
谢谢分享!!!!!!!

7788281

2012-10-20 09:05:24
先顶后看
PCB打样找华强 http://www.hqpcb.com/3 样板2天出货

姜小文

2012-10-21 21:28:14
有点问题,地址重复

何小飞

2012-10-22 15:43:58
用解码器来实现少量的IO口对多按键的处理控制,我觉得是个思路。

彭丽光

2012-10-22 15:49:03

aaasss01

2012-10-22 16:14:53
看看学习

k88k

2012-10-22 20:17:25
好东西啊         谢谢啦

ff490029373

2012-10-23 08:40:14
看看 学习 学习

薛凯飞

2012-10-23 11:01:09
不错,值得借鉴...

陈聪

2012-10-23 11:13:27
第一次见这个电路图,感谢分享

沈凌霄

2012-10-23 12:18:04

richard_wang

2012-10-23 12:21:22
好好学习天天向上谢谢lz

吴勇

2012-10-23 12:58:02

更多回帖