单片机键盘程式

本文介绍了一种基于软件去抖动的按键扫描方法,通过使用特定的数据结构和算法实现按键信号的有效采集与处理,避免了因机械抖动引起的误操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值