/**************************
文件所用資源
1.端口:P2
2.調(diào)用delay_ms函數(shù)
**************************/
#include
#include
#define key_port P2//鍵盤接口定義
sbitkey_port_0=key_port^0;
sbitkey_port_1=key_port^1;
sbitkey_port_2=key_port^2;
sbitkey_port_3=key_port^3;
/**************************
延時函數(shù)
***************************/
void delay_ms(unsigned int ms)
{
unsigned int i,j;
for( i=0;i
}
/**************************
鍵盤掃描函數(shù)
**************************/
unsigned char keyscan(void)
{
unsigned char key,i;
unsigned char code key_table[16]=
{0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};
//掃描端口數(shù)據(jù)與鍵值的對應(yīng)關(guān)系,可以根據(jù)使用來調(diào)節(jié)順序
key_port=0x0f; //確定行列位置
if(key_port==0x0f)return(0x10);//無鍵按下返回0
delay_ms(10); //調(diào)用延時函數(shù) ,目的是去前沿鍵抖。
if(key_port==0x0f)return(0x10);//再次判斷。目的是確保檢測正確
else
{
for(i=0;i<4;i++) //以下為經(jīng)典的計算鍵值(判斷閉合鍵所在的位置)
{
key_port=_cror_(0x7f,i);
if(key_port_0==0)break;
if(key_port_1==0)break;
if(key_port_2==0)break;
if(key_port_3==0)break;
}
key=key_port; //取得鍵值
for(;key_port!=0x0f;key_port=0x0f);//等待鍵松開,目的是去后沿鍵抖
for(i=0;key_table[i]!=key && i<16;i++);//查表取key的值0-F
key=i;
return(key); //帶鍵值返回主調(diào)函數(shù)
}
}