基本上讀Register還是宣告volatile,比較保險,消抖要先讀值不是後面讀,這樣沒意義XD
volatile uchar temp;
void keyscanf()
{
uchar temp,key;
P1=0x7f;
temp=P1;
temp=temp&0x0f; //原设低四位为高电平,当按键按下后,低四位必有一位变成低电平,再与0X0F做与运算,必然不会等于0x0f;
if(temp!=0x0f)
{
delay(10);
temp=P1; //再次讀值,消抖判斷
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp) //
{
case 0x77:key=0;break;
case 0x7B:key=1;break;
case 0x7D:key=2;break;
case 0x7E:key=3;break;
}
while(temp!=0x0f) //当不符合条件时,跳出循环
{
temp=P1;
temp=temp&0x0f;
}
display(key);
}
}
P1=0xbf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0xb7:key=4;break;
case 0xbb:key=5;break;
case 0xbd:key=6;break;
case 0xbe:key=7;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
display(key);
}
}
P1=0xdf;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0xd7:key=8;break;
case 0xdb:key=9;break;
case 0xdd:key=10;break;
case 0xde:key=11;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
display(key);
}
}
P1=0xef;
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
delay(10);
temp=P1;
temp=temp&0x0f;
if(temp!=0x0f)
{
switch(temp)
{
case 0xe7:key=12;break;
case 0xeb:key=13;break;
case 0xed:key=14;break;
case 0xee:key=15;break;
}
while(temp!=0x0f)
{
temp=P1;
temp=temp&0x0f;
}
display(key);
}
}
}