|
/*==================
按鍵讀鍵函數(shù)
==================*/
void ReadKey(void)
{
uchar ReadData;
ReadData=(((~(P3&0XF0))&0XF0)|(P3&0X0F)); //將前四位取反,即P3.7-P3.4 保留P3.3-P3.0的數(shù)據(jù),【目的為將按鍵位取反,不影響其他位】
Trg = ReadData & (~Cont); // 只要有按鍵按下,在對應(yīng)位會有一個脈沖,后四位不確定。如P3.4按下了,會出現(xiàn)一次0X1F;P3.5按下了,會出現(xiàn)一次0X2F;
Cont = ReadData; // 有按鍵按下,會出現(xiàn)對應(yīng)編碼。
if(Cont&0xf0) // 如果按鍵不放,不處理
{
KeyCnt++; // 讀鍵次數(shù)
KeyEffect=Cont;
if(KeyCnt>=1000)KeyCnt=1000;
return;
}
else // 鍵值發(fā)生改變
{
if((KeyCnt>=10)&&(KeyCnt<=90)) //多次讀鍵消抖
{
KeyCnt=0;
KeyEffect=(KeyEffect&0xf0)+80;
KeyOpt();
send_char_com(KeyEffect);
if(Cont&0x10)
{
BeepCnt=0x10;
Keyflg_S2=1;
}
}
else if(KeyCnt>=150) //長按
{
BeepCnt=0x10;
KeyCnt=0;
}
}
}
/*===============
按鍵處理子函數(shù)
=================*/
void KeyOpt(void)
{
switch(KeyEffect)
{
case 0: // 空鍵
{
break;
}
case 0xd0: // S4鍵(P1.3)
{
BeepCnt=0x10;
Keyflg_S5^=1;
LED1^=1;
break;
}
case 0x90: // S5鍵(P1.4)
{
BeepCnt=0x10;
Keyflg_S4^=1;
LED2^=1;
break;
}
case 0x70: // S6鍵(P1.5)
{
BeepCnt=0x10;
Keyflg_S3^=1;
LED3^=1;
break;
}
case 0x60: // S6鍵(P1.5)
{
BeepCnt=0x10;
Keyflg_S2^=1;
LED4^=1;
break;
}
default: break;
}
}
|
|