按键输入消抖

 按键输入是人机对话不可缺少的一部分,对于消抖设计,一种是软件消抖,一种是硬件消抖。但在单片机电路设计中,采用电容消抖才是最佳的选择,其次才是定时器消抖

1、按键输入采用软件消抖

1)、通过定时器方式定时读取按键输入

根据固定的采集周期,通常为10ms,需要读两次,若前后两次均相同,则认为按键被按下。需要占用CPU的定时器,优点:不占用CPU执行时间,程序执行速度快。缺点:需要一个全局变量Key来辅助完成。

定时器中断程序:

Key=(u8)(Key<<1);

if(KeyPin=0)   Key=(u8)(Key|0x01);  //将key的最低位置1

else Key=(u8)(Key&0xFE); //将key的最低位置0

按键读取程序

if( (key&0x03) ==0x03 ) 按键被按下

else 无按键被按下

2)、完全采用软件延时,每隔10ms周期采集一次,需要读两次,若前后两次均相同,则认为按键被按下。缺点:占用CPU执行时间,影响程序的执行速度,当有中断发送时,读取按键的时间变长,不适合用于中断频繁的程序中。

if(KeyPin=0)

{

   delay_ms(10);

  if(KeyPin=0)//确认有键按下

  {

  }

}

2、按键输入采用硬件消抖

1)、电容消抖

注意:KEY_UP,KEY_Left,KEY_OK连接到CPU引脚。 

 采用定时器轮询读取

 2)、专用芯片消抖

在有很多按钮输入的情况下,使用专用芯片。缺点:增加硬件成本。

3、定时器消抖应用
开关的两个引脚通过IO控制,若通过定时器扫描,可实现连读。例如每0.2秒读一次,则1秒可以读取5次。通常按键时间为0.5秒~0.7秒。

若CPU无上上拉电阻,则连接上拉电阻。若有内部上拉电阻,就不用了。

按键按下分析:

如果COL1~COL4被置0,读ROW1~ROW4,可以知道被按下的按键所在的行 。同理,可以分析出被按下的按键所在的列。见下图:

程序实现:

1)、先初始化COL=0,ROW=0,再令COL1=0,COL2=,0,COL3=0,COL4=0,接着

读ROW1,判断是否为0,若为0,则记录ROW=1;

读ROW2,判断是否为0,若为0,则记录ROW=2;

读ROW3,判断是否为0,若为0,则记录ROW=3;

读ROW4,判断是否为0,若为0,则记录ROW=4;

2)、先令ROW1=0,ROW2=,0,ROW3=0,ROW4=0

读COL1,判断是否为0,若为0,则记录COL=1;

读COL2,判断是否为0,若为0,则记录COL=2;

读COL3,判断是否为0,若为0,则记录COL=3;

读COL4,判断是否为0,若为0,则记录COL=4;

3)、分析按键值

if( ROW > 0 && COL >0 )

{  

   KeyCnt++;

  if(KeyCnt>2

  { 

      KEY_Value=(ROW-1)*4+COL //发现按键被按下

      //用户读到该值后,需要将KEY_Value=0

     KeyCnt=0; //实现连续按键

  }

}

else

{

   KEY_Value=0;//无按键被按下

   KeyCnt=0;

}

4、总结

在单片机电路设计中,采用电容消抖是最佳的选择,其次才是定时器消抖

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值