历史上的今天
返回首页

历史上的今天

今天是:2025年08月16日(星期六)

正在发生

2019年08月16日 | 单片机读入4*4矩阵键盘

2019-08-16 来源:eefocus

一、什么是矩阵键盘

矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组,由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘有4*4和8*8,其中用的最多的是4*4。

网上搜了两张实物图,大家可以看看


看上图就知道,4*4键盘还是很多地方用到的吧^_^


二、矩阵键盘的原理

矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。

在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。

这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。由于单片机IO端口具

有线与的功能,因此当任意一个按键按下时,行和列都有一根线被线与,通过运算就可以

得出按键的坐标从而判断按键键值。

原理如同矩阵数列的行列式


三、驱动电路图


按4*4矩阵搭建的按键矩阵还是比较简单的,也有的人为了保证电路的稳定性,加上二极管保护和上拉电阻,但是一般要求不太高的电路就不需要加了,向下面设置的电路那样就可以


四、软件程序设计


根据4*4键盘的原理软件设计程序如下:


//***************************************************

//函数功能:

//单片机驱动4*4键盘,读入键盘值并使用数码管静态

//显示按键键值,若没有数码管用8421码显示LED灯也可以的

//读入原理:先令单片机端口输出11110000读一次,然后

//再令单片机输出00001111读一次把两次的值相加,最后

//获取一个高位和低位分别有0的值即可判断键值,

//如11101110

//***************************************************

#include

#define uchar unsigned char 

#define uint unsigned int 

 

unsigned char code smg_d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

 

//************************************************

//延时函数,在12MHz的晶振频率下

//大约50us的延时

//************************************************

void delay_50us(uint t)

{

 uchar j;

 for(;t>0;t--)

        for(j=19;j>0;j--);

}

 

void main()

{

 uchar key_l,key_h;

 uchar key;

 while(1)

 {

 P1=0xf0;

 key_l=P1; //读P1端口的值

 key_l=key_l&0xf0;  //令低4位置位为0

 if(key_l!=0xf0)    //判断是否有按键按下

 {

  delay_50us(100);

  if(key_l!=0xf0)

  { //若有按键按下,则切换高低4位判断键值

   key_l=P1&0xf0;   //11100000 获取第一次键值

   key_l=key_l|0x0f;//11101111   

   P1=key_l;        //反过来再读一次,由于人手按下按键的时间虽然短暂,但是

   key_h=P1;        //对于单片机来说,已经足够长,因此可以正反读取两次值

   key_h=key_h&0x0f;//00001110

   key_l=key_l&0xf0;//11100000

   key=key_h+key_l; //11101110

  }

 }

 switch (key)

 {

  case 0xee:P2=smg_d[0];break;

  case 0xde:P2=smg_d[1];break;

  case 0xbe:P2=smg_d[2];break;

  case 0x7e:P2=smg_d[3];break;

  case 0xed:P2=smg_d[4];break;

  case 0xdd:P2=smg_d[5];break;

  case 0xbd:P2=smg_d[6];break;

  case 0x7d:P2=smg_d[7];break;

  case 0xeb:P2=smg_d[8];break;

  case 0xdb:P2=smg_d[9];break;

  case 0xbb:P2=smg_d[10];break;

  case 0x7b:P2=smg_d[11];break;

  case 0xe7:P2=smg_d[12];break;

  case 0xd7:P2=smg_d[13];break;

  case 0xb7:P2=smg_d[14];break;

  case 0x77:P2=smg_d[15];break;

 }

 }

}


推荐阅读

史海拾趣

Boundary Devices公司的发展小趣事

近年来,电子行业面临着诸多变革和挑战,如物联网的快速发展、人工智能的崛起等。面对这些变革,Boundary Devices积极调整战略,加强在物联网和人工智能领域的研发投入,推出了一系列符合市场趋势的新产品。同时,公司还加强与高校和研究机构的合作,共同推动电子行业的创新与发展。

远阳(FLYOUNG)公司的发展小趣事

为了提高生产效率与产品质量,国光新业积极引进并自主研发高效自动化生产线。公司投产了行业首条高效聚合物自动化生产线,并在此基础上不断进行技改迭代。这些生产线的建立,不仅大幅减少了人力成本,还显著提升了产品的生产效率与一致性。目前,公司正进行第三条全国产化技改技术攻关,旨在进一步提升生产线的智能化与自动化水平。

AB Connectors Ltd公司的发展小趣事

进入新世纪,电子行业的技术更新换代速度加快。AB Connectors Ltd意识到,只有不断创新才能在激烈的市场竞争中立足。于是,公司加大了研发投入,组建了一支高素质的研发团队,专注于连接器技术的创新。经过多年的努力,AB Connectors Ltd成功开发出了一系列具有自主知识产权的新型连接器产品,不仅提高了产品的性能和质量,还降低了生产成本。这些创新产品为公司赢得了众多客户的青睐,进一步巩固了市场地位。

Extech公司的发展小趣事

随着制造业信息化的发展,企业对信息化解决方案的需求日益迫切。为了满足客户的需求,Extech公司在2003年相继推出了XTMES、XTPLM等产品,并在国内首次提出了“一体化解决方案”的概念。这一解决方案覆盖了制造业信息化的各个环节,为客户提供了全方位的信息化服务。通过这一解决方案的推出,Extech公司在制造业信息化领域进一步扩大了自己的市场份额。

国产公司的发展小趣事
采用高质量的元器件,合理设计电路的布局和走线,以减少信号路径上的干扰和损耗。
CDI-DIODE公司的发展小趣事

随着环保意识的日益增强,电子行业也开始向绿色生产转型。CDI-DIODE公司积极响应这一趋势,投入大量资源研发环保型二极管产品,并采用环保材料和生产工艺。这种绿色生产方式不仅降低了公司的生产成本,也符合了社会的可持续发展需求,为公司的未来发展奠定了坚实的基础。

这五个故事虽然是虚构的,但它们反映了电子行业中企业可能面临的一些共同挑战和机遇。无论对于CDI-DIODE公司还是其他企业,这些故事都具有一定的借鉴意义。

问答坊 | AI 解惑

TDA2030功放电路欣赏

TDA2030功放电路欣赏…

查看全部问答>

使用AVR定时-计数器的PWM功能设计要点

一、定时/计数器PWM设计要点     根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点:       1.首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。如输出PWM ...…

查看全部问答>

怎么选购无线摄像头

关键字:无线摄像头        半年前,我买了一款笔记本专用无线摄像头,用了半年,感觉效果非常不错。正巧今天也有朋友想买无线摄像头,于是我便带他去了那家早已熟识的商家那里。半年一见,真是今非昔比,原来小小的柜台如今 ...…

查看全部问答>

有高手介绍下状态机吗?

最近弄一个遥控器键盘程序,键盘操作的程序编写使用标志位的方法,感觉极为繁琐和弱智。后来听说可以用状态机的方法 查了半天都不知所云,哪位高手可以举例说明下  多谢多谢…

查看全部问答>

嵌入式下的应用程序,怎样烧写到板子上去?

自己写的应用程序,交叉编译后,怎样烧写到板子上去? 是同文件系统一起制成文件镜像烧写? 或者配置一个samba服务器,像用普通linux那样mount过去啊。 我是个linux程序员打算挑战嵌入式,不过不懂的还有很多,请多指教。…

查看全部问答>

arm开发板选择的疑问

我买了本周立功嵌入式的书他上面的列子是用ads1.2集成开发环境easyarm2200教学实验平台。我想问一下easyarm2200的开发板能否用三星44B0代替,即我能不能用本来针对easyarm2200的程序,用在44B0上?如果不能,两者之间编程差别大不大? PS:小弟刚刚 ...…

查看全部问答>

我用VS调用了DLL里面的函数 这函数的定义应该放在哪个头文件里面 是在XXXDLG。H里面还是XXX。H里面 是直接声明吗?

我对应用程序不是很了解 我用VS调用了DLL里面的函数 这函数的定义应该放在哪个头文件里面 是在XXXDLG。H里面还是XXX。H里面 是直接声明吗? 谁帮我解释下…

查看全部问答>

SipShowIM(SIPF_OFF)的困惑

在YC2440 DevelopBorad 环境下 可以编译通过,但是选择STANDARDSDK下编译却不行了,提示error LNK2019:unresolved external symbol SipShowIM referenced in function \"...\"  这个有什么办法啊... SIPAPI.H 难道....?…

查看全部问答>

求PIC单片机教程一本

求PIC单片机教程一本,谢谢!50分相送…

查看全部问答>

wince4.2编译出错

Windows CE Version (Release) (Built on Jun  7 2002 17:04:51) Creating appropriate directories and deleting COMMON.LOC \'xcopy\' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 \'xcopy\' 不是内部或外部命令,也不 ...…

查看全部问答>