矩阵键盘 数码管
在没有数字显示的开始,顺序为矩阵键盘后,依次显示的数码管0~F,6同时数字控制静态展示。
数字控制和矩阵式键盘
首先关闭全部的数码管的段选不让数码管显示不论什么数字。然后位选中全部的数码管,接下来仅仅须要选中全部的数码管,以后的操作的仅仅须要送段选数据即可了,接着进入while()大循环不停的扫描键盘是否有被按下
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num)
{
P0=table[num];
dula=1;
dula=0;
}
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);
}
}
}
void main()
{
P0=0;
dula=1;
dula=0;
P0=0;
wela=1;
wela=0;
while(1)
{
matrixkeyscan();
}
}
这里有几个
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delayms(10);
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ .........
P3=0xfe 将第1 行线置低电平,其余的行线所有为高电平
temp=P3 读取P3口当前的状态值赋值给暂时变量temp
temp=temp&0xf0 将temp与0xf0进行与运算 然后再将结果赋值给temp,主要是推断temp的高4位是否有0。假设temp的高4位没有0。那么他与0xf0“与”运算后的结果仍然等于0xf0.temp的高4位数据实际上就是矩阵键盘的4个列线,从而我们可通过推断temp与“0xf0运算后的结果是否为0xf0来推断出第一行按键是否有按键被按下。
if(temp!=0xf0) 表示temp是上面P3口数据与0xf0“与”运算后的结果,假设结果temp不等于0xf0来推断出有按键被按下。
另外
P3口全部引脚
其余的想复位引脚RES\VPD
还有EA\VPP
ALE\PROG
这是全部的了,我的是AT89S52(51系列)
版权声明:本文博主原创文章。博客,未经同意不得转载。