zoukankan      html  css  js  c++  java
  • 在主函数中利用累计主循环次数来实现独立按键的检测---错误已改正,缺少interrupt 1,无法进入中断

    #include "REG52.H"
    #define const_voice_short 40 //蜂鸣器短叫的持续时间
    #define const_voice_long 200 //蜂鸣器长叫的持续时间
    #define const_key_time1 500  //按键去抖动的延时时间
    #define const_key_time2 500  //按键去抖动的延时时间
    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 uiKeyTimeCnt1=0; //按键去抖动延时计数器
    unsigned char ucKeyLock1=0;  //按键触发后自锁的变量标志 
    unsigned int uiKeyTimeCnt2=0; //按键去抖动延时计数器
    unsigned char ucKeyLock2=0;  //按键触发后自锁的变量标志 
    unsigned int uiVoiceCnt=0;  //蜂鸣器鸣叫的持续时间计数器
    void main()
    {
     initial_myself();
     delay_long(100);
     initial_peripheral();
     while(1)
     {
      key_scan();  //按键扫描函数
      key_service(); //按键服务的应用程序
     }
    }
     
    void key_scan() 
    {
     if(key_sr1==1)  //IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
     {
      ucKeyLock1=0; //按键自锁标志清零
      uiKeyTimeCnt1=0; //按键去抖动延时计数器清零 
     }
     else if(ucKeyLock1==0) //有按键按下,且是第一次按下
     {
      ++uiKeyTimeCnt1; //延时计数器
      if(uiKeyTimeCnt1>const_key_time1)
      {
       uiKeyTimeCnt1=0;
       ucKeyLock1=1; //自锁按键置位,避免一直触发
       ucKeySec=1;  //触发1号键
      }
     }
     if(key_sr2==1)
     {
      ucKeyLock2=0;
      uiKeyTimeCnt2=0;
     }
     else if(ucKeyLock2==0)
     {
      ++uiKeyTimeCnt2;
      if(uiKeyTimeCnt2>const_key_time2)
      {
       uiKeyTimeCnt2=0;
       ucKeyLock2=1;
       ucKeySec=2;  //触发2号键
      }
     }
    }
     
    void key_service()  //第三区 按键服务的应用程序
    {
     switch(ucKeySec) //按键服务状态切换
     {
      case 1:  //1号键
       uiVoiceCnt=const_voice_short; //按键声音触发,嘀一声就停
       ucKeySec=0;  //响应按键服务处理程序后,按键编号清零,避免一直触发
       break;
      case 2:
       uiVoiceCnt=const_voice_long;
       ucKeySec=0;
       break;
     }
    }
     
    void T0_time() interrupt 1
    {
     TF0=0; //清除中断标志
     TR0=0; //关中断
     if(uiVoiceCnt!=0)
     {
      uiVoiceCnt--;  //每次进入定时中断都自减1,
      beep_dr=0;
     }
     else
     {
      ;
      beep_dr=1; 
     }
     TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f
     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;
    }
     
     
     
     
  • 相关阅读:
    Spring注解(环境)
    Spring注解(赋值相关)
    C#:关联程序和文件
    C#: 获取执行程序所在路径和启动资源管理器
    C#:WPF绘制问题
    WPF:窗体置顶
    C#:屏幕显示区域问题
    C#:文件、文件夹特别操作
    C#:插件、框架
    WPF:MenuItem样式
  • 原文地址:https://www.cnblogs.com/TheFly/p/11946085.html
Copyright © 2011-2022 走看看