单片机键盘程式


///
#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] 的每一位

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值