第一種:這種方法就是郭天祥書上教的掃描方法,很容易理解,但是程序比較長。 P2=0xfe;//給第一列送低電平 temp=P2; temp=temp&0xf0; while(temp!=0xf0) { delay(10); //去抖 temp=P2; temp=temp&0xf0; while(temp!=0xf0) { temp=P2; switch(temp) { case 0xee:num=1;break; case 0xee:num=2;break; case 0xee:num=3;break; case 0xee:num=4;break; } while(temp!=0xf0) //按鍵釋放 { temp=P2; temp=temp&0xf0; } } } 然后再給第二、三、四列依次送低電平檢查,也就是說再重復上邊的程序四次
第二種 uchar keyscan(void) { unsigned char cord_h,cord_l; P2=0x0f; //行線輸出全為0 cord_h=P2&0x0f; //讀入列線值 if(cord_h!=0x0f) //先檢測有無按鍵按下 { delayms(10); //去抖 if((P2&0x0f)!=0x0f) { cord_h=P2&0x0f; //讀入列線值 P2=cord_h|0xf0; //輸出當前列線值 cord_l=P2&0xf0; //讀入行線值 while((P2&0xf0)!=0xf0);//等待松開并輸出 return(cord_h+cord_l);//鍵盤最后組合碼值 } } return(0xff); //返回該值
第三種 uchar keyscan() { uchar i=0,j=0,key; P2=0xf0; // 高位拉高,低位拉低 if(((~P2)&0xf0)!=0) { delay(10); if(((~P32&0xf0)!=0) { P2=0xfe; while(((~P2)&0x0f)!=0) // 此語句保證只掃描四行 { if(((~P2)&0xf0)!=0) { switch((~P2)&0xf0) { case 0x10: j=0;break; case 0x20: j=1;break; case 0x40: j=2;break; case 0x80: j=3;break; } return(4*i+j); } else { P3=P3<<1; //循環4次 i++; } } } } return (key) ; } 第四種
uchar keyscan(void)
{
uchar code K_Tab[4][4] = {
0xee, 0xde, 0xbe, 0x7e, 0xed, 0xdd, 0xbd, 0x7d,
0xeb, 0xdb, 0xbb, 0x7b, 0xe7, 0xd7, 0xb7, 0x77};
uchar temp1 = 0xfe, temp2, i, j;
for(i = 0; i < 4; i++)
{ //掃描低四位
P3 = temp1; //輸出一行0
temp2 = P3; //馬上就讀入
if((temp2 & 0xf0) != 0xf0) //如果有鍵按下
{
for(j = 0; j < 4; j++) //就掃描高四位
if(temp2 == K_Tab[j]) //查表
return i * 4 + j; //查到了就返回按鍵的數值
}
else temp1 = _crol_(temp1, 1);
}
return 16; //沒有查到,返回按鍵松開的代碼
}
|