EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
第一种:这种方法很容易理解,但是程序比较长。 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; } } } 然后再给第二、三、四列依次送低电平检查,也就是说再重复上边的程序四次 ) n! E! o) i* X2 V& F
第二种 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); //返回该值 0 Y1 Z6 `- v9 t
第三种 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) ; } 第四种
" z0 ]. e5 h! W" y5 a, z; F9 i4 fuchar keyscan(void) % p r# q3 N3 g
{; ?5 V! p. `7 l6 @ e
uchar code K_Tab[4][4] = {
5 A* e7 s* h' l6 o- {6 i! c 0xee, 0xde, 0xbe, 0x7e, 0xed, 0xdd, 0xbd, 0x7d,- X6 O4 Q" ]1 }2 ^
0xeb, 0xdb, 0xbb, 0x7b, 0xe7, 0xd7, 0xb7, 0x77};
8 i, ]! ^& v% f) W3 T; E- P uchar temp1 = 0xfe, temp2, i, j; a: Q2 @" h9 r2 o+ } ~- I1 D _
for(i = 0; i < 4; i++)
0 r: {' v8 E- ~& ` R7 ^. k e, u { //扫描低四位4 _! ?; u' Y/ L3 k
P3 = temp1; //输出一行0* |+ Q* X7 S1 V7 @+ J0 b
temp2 = P3; //马上就读入
' a. x% y/ U! _9 E8 s s% L% M, y if((temp2 & 0xf0) != 0xf0) //如果有键按下
5 l" X6 ^6 v! T {
9 R5 I& W: w/ j- G/ o for(j = 0; j < 4; j++) //就扫描高四位( u' h! H7 `8 f: o- l6 ~. X: V6 y8 p
if(temp2 == K_Tab[j]) //查表
, L1 {, R3 c1 a: O: }# a return i * 4 + j; //查到了就返回按键的数值) B7 A: a) v6 b' _3 [' m2 X: W
}+ W- {2 e; f/ P4 Q# K
else temp1 = _crol_(temp1, 1);
9 y, L6 y5 X2 a$ S& B }
% ^3 {8 q- i. p% b4 D; N# k return 16; //没有查到,返回按键松开的代码
* n: G$ X& ~& l3 X- z% d} . P( X S3 w. S
6 T3 k+ i; u( h6 c% d |