文档库 最新最全的文档下载
当前位置:文档库 › (原创)矩阵键盘扫描程序详解

(原创)矩阵键盘扫描程序详解

// 矩阵键盘(具体说明,理解版)
// P3口接矩阵键盘
#define uchar unsigned char
uchar temp;
void delay(uchar x)
{
uchar y,z;
for(y=x;y>0;y--)
for(z=125;z>0;z--)
;
}
uchar keyscan() //0Xfe 就是 1111,0000
{
P3=0xfe; //检测第一行, 1111,1110
temp=P3;
temp=temp&0xf0; // temp=0xfe&0xf0;
while(temp!=0xf0) //当temp不等于OXFO时,则有temp=OXF0,就是按下了。执行下面的语句 //总结,按下后temp改变就是按下了。不变就是不按下
{
delay(5); //延时5毫秒
temp=P3; //此时P3=0XFE; 将0XFE反带回来赋给temp;则说明之前 temp的值并不是OXFE;而是0XFO;
temp=temp&0xf0;
while(temp!=0xf0) //重复上边的工作,在延时之后再次看是否真正的改变
{
temp=P3;
switch(temp)
{
case 0xee:num=1; //1110,1110
break;
case 0xde:num=2; //1101,1110
break;
case 0xbe:num=3; //1011,1110
break;
case 0x7e:num=4; //0111,1110
break;
}
while(temp!=0xf0) //撤销按键之后再延时,看是否真正的改变
{
temp=P3;
temp=temp&0xf0;
}
}
}

P3=0xfd; //检测第二行 ,1111,1101
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:num=5; //1110,1101
break;
case 0xdd:num=6; //1101,1101
break;
case 0xbd:num=7; //1011,1101
break;
case 0x7d:num=8; //0111,1101
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}


P3=0xfb; //检测第三行, 1111,1011
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:num=9; //1110,1011
break;
case 0xdb:num=10; //1101,1011
break;
case 0xbb:num=11; //1011,1011
break;
case 0x7b:num=12; //0111,1011
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}
}


P3=0xf7; //检测第四行, 1111,0111
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xe7:num=13; //1110,0111
break;
case 0xd7:num=14; //1101,0111
break;
case 0xb7:num=15; //1011,0111
break;
case 0x77:num=16; //0111,0111
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
}


}
return num;

}


相关文档