///
#define SIFT_DEEP 2 // SIFT_DEEP>=2 去抖深度
#define KEY_WIDTH (SIFT_DEEP+5) //一个端口对应KEY_WIDTH 个 TYPE型变量
typedef unsigned char TYPE;
TYPE PubKey_Buff[KEY_WIDTH];
void keySignalScanPort(TYPE *Port,TYPE *KeyBuff)
{
S16 i;
/*原理:
a=input //输入
c=a&b //过滤,按下一直有效
e=e|(c&(~d)); //按下一次有效,直到清除缓冲区,才算第二次有效
f=f|c; //按下标记 清除次标记下次才有效
g=(c^f)&f //按下标记已记录 此时已松开 则有效
d=c;
b=a;*/
/*
0--SIFT_DEEP 读入的原始按键
SIFT_DEEP+0,SIFT_DEEP+1 读入的去抖按键(相邻两次)
SIFT_DEEP+2 按下按键的 , 按下有效,直到松开并清除缓冲区才进入下次键盘信号采集
SIFT_DEEP+4 按下做标记
SIFT_DEEP+3 按下直到松开有效
SIFT_DEEP+1,SIFT_DEEP+2,SIFT_DEEP+3,分别对应3种键盘
*/
KeyBuff[0]=~(*Port);// a=input //输入
KeyBuff[SIFT_DEEP+0]=KeyBuff[0];
for(i=1;i<SIFT_DEEP;i++){
KeyBuff[SIFT_DEEP+0]&=KeyBuff[i];// c=a&b //过滤,按下一直有效
}
KeyBuff[SIFT_DEEP+2]|=(KeyBuff[SIFT_DEEP+0]&(~KeyBuff[SIFT_DEEP+1]));// e=e|(c&(~d)); //按下一次有效,直到清除缓冲区,才算第
二次有效
KeyBuff[SIFT_DEEP+4]|=KeyBuff[SIFT_DEEP+0]; //f=f|c; //按下标记
KeyBuff[SIFT_DEEP+3]=(KeyBuff[SIFT_DEEP+0]^KeyBuff[SIFT_DEEP+4])&KeyBuff[SIFT_DEEP+4];// g=(c^f)&f //按下记录标记,直到松开
有效
KeyBuff[SIFT_DEEP+1]=KeyBuff[SIFT_DEEP+0];// d=c;
for(i=SIFT_DEEP-1;i>=1;i--){
KeyBuff[i]=KeyBuff[i-1];// b=a;
}
return;
}
void keySignalScan(void)
{//放在中断中
TYPE *PubPort=(TYPE *)0x1000000;//假设键盘端口
keySignalScanPort(PubPort,PubKey_Buff);
return;
}
//----------------------------清键盘缓冲区----------------------------------
void clearkeybuff(S16 msk)
{//获得键值后调用 清除缓冲区
S16 i;
if(msk&1){//清除静态键盘
PubKey_Buff[SIFT_DEEP+2]=0;
}
if(msk&2){//清除滞后键盘
PubKey_Buff[SIFT_DEEP+4]=0;
}
}
U32 getKey(U32 keytype,S16 later)
{//程序调用
//根据需求分析键盘返回自定义的键值
//分析PubKey_Buff[SIFT_DEEP+1],PubKey_Buff[SIFT_DEEP+2]或 PubKey_Buff[SIFT_DEEP+3] 的每一位
}