マトリックスキーボードスキャンアルゴリズム
9550 ワード
関数の本体
次は割り込み関数です
これらのコードはマトリクスキーボードのスキャン、ブレ消し、動作分離のすべてを完了し、GetKey()を呼び出すことで押したボタンの番号を返すことができ、便利です.
unsigned char GetKey()
{
unsigned char i,j,k;
static unsigned char backup[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
EA=1;
TMOD=0x01;// T0 1
TH0=0xF8;
TL0=0xCD;
ET0=1;// T0
TR0=1;// T0
while(1)
{
for(i=0;i<4;i++)// 4×4
{
for(j=0;j<4;j++)
{
if(backup[i][j]!=KeySta[i][j])//
{
if(backup[i][j]!=0)//
{
k=i*4+j;
return k;//
}
backup[i][j]=KeySta[i][j];//
}
}
}
}
}
次は割り込み関数です
/*T0 , */
void InterruptTimer0() interrupt 1
{
unsigned char m;
static unsigned char keyout=0;//
static unsigned char keybuf[4][4]={
{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}
};
TH0=0xFC;
TL0=0x67;
/* 4 */
keybuf[keyout][0]=(keybuf[keyout][0]<<1)|KEY_IN_1;
keybuf[keyout][1]=(keybuf[keyout][1]<<1)|KEY_IN_2;
keybuf[keyout][2]=(keybuf[keyout][2]<<1)|KEY_IN_3;
keybuf[keyout][3]=(keybuf[keyout][3]<<1)|KEY_IN_4;
/* */
for(m=0;m<4;m++)
{
if((keybuf[keyout][m]&0x0F)==0x00)
{
KeySta[keyout][m]=0;// 4 0, 4×4ms ,
}
else if((keybuf[keyout][m]&0x0F)==0x0F)
{
KeySta[keyout][m]=1;//
}
/* */
keyout++;//
keyout=keyout&0x03;// 4
/* , , */
switch(keyout)
{
case 0:KEY_OUT_4=1;KEY_OUT_1=0;break;
case 1:KEY_OUT_1=1;KEY_OUT_2=0;break;
case 2:KEY_OUT_2=1;KEY_OUT_3=0;break;
case 3:KEY_OUT_3=1;KEY_OUT_4=0;break;
default:break;
}
}
}
これらのコードはマトリクスキーボードのスキャン、ブレ消し、動作分離のすべてを完了し、GetKey()を呼び出すことで押したボタンの番号を返すことができ、便利です.