初学者肯定要经历的一个实验便是44矩阵键盘的代码编写,先上图:
先研究一下如何用51单片机点亮一个发光二极管和基于CPLD-EPF10K10LC84-4(84)的交通灯设计。首先要解释的一点,矩阵键盘的动态扫描确实略显繁芜,不可能便是读一个端口数据,然后立时就出来结果。这须要对依次每一行的按键进行扫描、判断,然后得出结果。如上图所示,先扫描第一行,也便是S1,S2,S3,S4四个按键的状态。在PA口输入0XFE。

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

假设是S3被按下,会涌现什么情形?----PA6的电平被拉低,PA的端口数据变成了1011 1110,也便是0XBE。这样,我们就知道了,每一行的每一个按键被按下的时候,都会有一个对应的独一无二的值。
这便是矩阵键盘的扫描事理!
送上一段源码。
void matrixkeyscan()
{
uchar temp,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)
{
case 0xee:
key=0;
break;
case 0xde:
key=1;
break;
case 0xbe:
key=2;
break;
case 0x7e:
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)
{
case 0xed:
key=4;
break;
case 0xdd:
key=5;
break;
case 0xbd:
key=6;
break;
case 0x7d:
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)
{
case 0xeb:
key=8;
break;
case 0xdb:
key=9;
break;
case 0xbb:
key=10;
break;
case 0x7b:
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)
{
case 0xe7:
key=12;
break;
case 0xd7:
key=13;
break;
case 0xb7:
key=14;
break;
case 0x77:
key=15;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
display(key);
}
}
}
以上所有信息仅作为学习互换利用,不作为任何学习和商业标准。若您对文中任何信息有异议,欢迎随时提出,感激!
关于云创硬见
云创硬见是海内最具特色的电子工程师社区,领悟了行业资讯、社群互动、培训学习、活动互换、设计与制造分包等做事,以开放式硬件创新技能互换和培训做事为核心,连接了超过30万工程师和家当链高下游企业,聚焦电子行业的科技创新,聚合最值得关注的家当链资源, 致力于为百万工程师和创新创业型企业打造一站式公共设计与制造做事平台。










