• 两个独立按键的组合按键触发------基于上一例略作改动


    #include "REG52.H"
    #define const_voice_short 40
    /*
     调整抖动时间阈值的大小,,可以更改按键的触发灵敏度
     去抖动的时间本质上等于累计定时中断次数的时间
    */
    #define const_key_time12 20  //按键去抖动延时的时间
    void initial_myself();
    void initial_peripheral();
    void delay_long(unsigned int uiDelayLong);
    void T0_time();
    void key_service();
    void key_scan();
    sbit key_sr1=P0^0;
    sbit key_sr2=P0^1;
    sbit key_gnd_dr=P0^4;
    sbit beep_dr=P1^5;
    unsigned char ucKeySec=0;
    unsigned int uiKeyTimeCnt12=0;
    unsigned char ucKeyLock12=0;
    unsigned int uiVoiceCnt=0;
    void main()
    {
     initial_myself();
     delay_long(100);
     initial_peripheral();
     while(1)
     {
      key_service();
     }
    }
    /*
     两个按键没有被全部按下时,按键的自锁标志和去抖动延时计数器一直清零
     只有按键被全部按下时,去抖动延时计数器开始累加,在还没有累加到阈值
     const_key_time12时,如果在这个期间由于外界干扰或者按键抖动,而使
     IO口突然瞬发到高电平,这个时候马上把延时计数器清零了。
     如果按键按下的时间超过了阈值const_key_time12,马上把自锁标志ucKeyLock12
     置位,防止按住按键不松手一直触发。并把ucKeySec赋值,组合按键触发
    */
    void key_scan()
    {
     if(key_sr1==1||key_sr2==1)
     {
      ucKeyLock12=0;
      uiKeyTimeCnt12=0;
     }
     else if(ucKeyLock12==0)
     {
      uiKeyTimeCnt12++;
      if(uiKeyTimeCnt12>const_key_time12)
      {
       uiKeyTimeCnt12=0;
       ucKeyLock12=1;
       ucKeySec=1;
      }
     }
    }
    void key_service()
    {
     switch(ucKeySec)
     {
      case 1:
       uiVoiceCnt=const_voice_short;
       ucKeySec=0;
       break;
     }
    }
    void T0_time() interrupt 1
    {
     TF0=0;
     TR0=0;
     
     key_scan();
     
     if(uiVoiceCnt!=0)
     {
      uiVoiceCnt--;
      beep_dr=0;
     }
     else
     {
      ;
      beep_dr=1;
     }
     TH0=0xf8;
     TL0=0x2f;
     TR0=1;
    }
    void delay_long(unsigned int uiDelayLong)
    {
     unsigned int i;
     unsigned int j;
     for(i=0;i<uiDelayLong;i++)
      for(j=0;j<500;j++)
       ;
    }
    void initial_myself()
    {
     key_gnd_dr=0;
     beep_dr=1;
     TMOD=0x01;
     TH0=0xf8;
     TL0=0x2f;
    }
    void initial_peripheral()
    {
     EA=1;
     ET0=1;
     TR0=1;
    }
     
  • 相关阅读:
    GJM: Unity3D AssetBundle 手记 [转载]
    GJM: Unity3D基于Socket通讯例子 [转载]
    GJM:用C#实现网络爬虫(二) [转载]
    JSONP(跨域请求) —— 一种非官方跨域数据交互协议
    经典布局之圣杯布局 —— 左右定宽,中间流式
    js中的callback(阻塞同步或异步时使用)
    Emmet:HTML/CSS代码快速编写神器
    CSS弹性盒模型 box-flex
    JSON对象的stringify()和parse()方法
    懒加载 lazy load
  • 原文地址:https://www.cnblogs.com/TheFly/p/11965250.html
Copyright © 2020-2023  润新知