bill0333 2023-03-15 16:53 采纳率: 33.3%
浏览 24
已结题

如何理解去抖动延时计数器

请教一下,这个‘’去抖动延时计数器 unsigned int uiKeyTimeCnt1 ‘’怎么理解或者它是如何工作的?
截取它的应用部分:

#include "REG52.H"

 

#define const_voice_short  40   //蜂鸣器短叫的持续时间

 

#define const_key_time1  20    //按键去抖动延时的时间

#define const_key_time2  20    //按键去抖动延时的时间

 

#define const_time_0_25s  111   //0.25秒钟的时间需要的定时中断次数

#define const_time_1s     444   //1秒钟的时间需要的定时中断次数
unsigned char ucKeySec=0;   //被触发的按键编号

 

unsigned int  uiKeyTimeCnt1=0; //按键去抖动延时计数器

unsigned int  uiKeyCtntyCnt1=0;  //按键连续触发的间隔延时计数器

unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志
void key_scan()//按键扫描函数 放在定时中断里

{  

/* 注释一:

* 独立按键扫描的详细过程:

* 第一步:平时没有按键被触发时,按键的自锁标志,去抖动延时计数器,以及时间间隔延时计数器一直被清零。

* 第二步:一旦有按键被按下,去抖动延时计数器开始在定时中断函数里累加,在还没累加到

*         阀值const_key_time1时,如果在这期间由于受外界干扰或者按键抖动,而使

*         IO口突然瞬间触发成高电平,这个时候马上把延时计数器uiKeyTimeCnt1

*         清零了,这个过程非常巧妙,非常有效地去除瞬间的杂波干扰。这是我实战中摸索出来的。

*         以后凡是用到开关感应器的时候,都可以用类似这样的方法去干扰。

* 第三步:如果按键按下的时间超过了阀值const_key_time1,则触发按键,把编号ucKeySec赋值。

*         同时,马上把自锁标志ucKeyLock1置位,防止按住按键不松手后一直触发。

* 第四步:如果此时触发了一次按键后,一直不松手,去抖动延时计时器继续累加,直到超过了1秒钟。进入连续触发模式的程序

* 第五步:在连续触发模式的程序中,连续累加延时计数器开始累加,每0.25秒就触发一次。

* 第六步:等按键松开后,自锁标志ucKeyLock1和两个延时计时器及时清零,为下一次自锁做准备。

*/

  if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位

  {

     ucKeyLock1=0; //按键自锁标志清零

     uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。    

     uiKeyCtntyCnt1=0; //连续累加的时间间隔延时计数器清零

  }

  else if(ucKeyLock1==0)//有按键按下,且是第一次被按下

  {

     uiKeyTimeCnt1++; //累加定时中断次数

     if(uiKeyTimeCnt1>const_key_time1)

     {

        uiKeyTimeCnt1=0; 

        ucKeyLock1=1;  //自锁按键置位,避免一直触发

        ucKeySec=1;    //触发1号键

     }

  }

  else if(uiKeyTimeCnt1

  {

     uiKeyTimeCnt1++;

  }

  else  //按住累加到1秒后仍然不放手,这个时候进入有节奏的连续触发

  {

     uiKeyCtntyCnt1++; //连续触发延时计数器累加

         if(uiKeyCtntyCnt1>const_time_0_25s)  //按住没松手,每0.25秒就触发一次

         {

             uiKeyCtntyCnt1=0; //

         ucKeySec=1;    //触发1号键

         }

   

  }
  • 写回答

1条回答 默认 最新

  • 於黾 2023-03-15 16:59
    关注

    这么多注释,不已经写的够细了吗
    是哪句话看不懂还是哪个字不认识

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月24日
  • 创建了问题 3月15日

悬赏问题

  • ¥15 远程访问linux主机超时
  • ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 火车票关联12306问题
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算