漏极开路输出 输出1就是输出低电平,输出0就是高阻,所以要加上上拉电阻,
下面的键盘链接中,p2.0到p2.3为漏极开路输出且加了上拉电阻。
大意就是一列一列的扫描。比较消耗cpu资源,先设第一列为低其他为高,那么如果第一列有按下则第一列的按键一定有一个为低电平否则为高
INT8U KeyScan( void )
{
INT8U i, j, val = 0;
INT8U k;
P2MDOUT = 0x0F;
P2 = 0xFF;
for( i = 0; i < 4; i ++ )
{
P2 = ~( 1<<i );
for( j = 0; j < 10; j ++ );
k = P2;
for( j = 4; j < 8; j ++ )
{
if( !( k & ( 1<<j ) ) )
{
val = ( 1<<i ) | ( 1<<j );
break;
}
}
if( val != 0 )
{
break;
}
}
P2 = 0xFF;
if( val == TmpValue )
{
if( ++ScanCnt >= 2 )
{
ScanCnt = 0;
KeyValue = val;
if( KeyValue == 0 )
{
KeyLock = 0;
return 0;
}
else if( KeyLock != 0 )
{
return 0;
}
else
{
KeyLock = 1;
return KeyValue;
}
}
}
else
{
TmpValue = val;
ScanCnt = 0;
return 0;
}
return 0;
}