⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyboard4.c

📁 基于STC12C5410AD单片机的智能冷库控制器的按键操作C语言程序,功能丰富,四级菜单操作.组合键,延时按键操作
💻 C
📖 第 1 页 / 共 4 页
字号:
/******************************************************
名称:KSC2D2
描述:按键第二级菜单DOWN键KC2_Cnt=2所执行(菜单F3的参数设置)
*******************************************************/
void KSC2D2(void)
{
  if(YsjDelay==0)    //0-9分钟
    {YsjDelay=10;}
  YsjDelay--;
  dec_showbuf((int)(YsjDelay*10));   //处理后放入显存
  led_show_buf[0]=0x0c;             //清除显存最后一位
  Dip=0x05;                         //不显示小数点
}
/******************************************************
名称:KSC2D4
描述:按键第二级菜单DOWN键KC2_Cnt=4所执行(菜单F4的参数设置)
*******************************************************/
void KSC2D4(void)
{
  if(FreshCycl==0)    //0-99小时
    {FreshCycl=100;}
  FreshCycl--;
  dec_showbuf((int)(FreshCycl*10));   //处理后放入显存
  led_show_buf[0]=0x0c;               //清除显存最后一位
  Dip=0x05;                           //不显示小数点
}
/******************************************************
名称:KSC2D6
描述:按键第二级菜单DOWN键KC2_Cnt=6所执行(菜单F5的参数设置)
*******************************************************/
void KSC2D6(void)
{
  if(FreshTime==0)    //0-99分钟
    {FreshTime=100;}
  FreshTime--;
  dec_showbuf((int)(FreshTime*10));   //处理后放入显存
  led_show_buf[0]=0x0c;               //清除显存最后一位
  Dip=0x05;                           //不显示小数点
}
/******************************************************
名称:KSC2D8
描述:按键第二级菜单DOWN键KC2_Cnt=8所执行(菜单F6的参数设置)
*******************************************************/
void KSC2D8(void)
{
  if(FrStopTemp==0)    //0-35℃
    {FrStopTemp=36;}
  FrStopTemp--;
  dec_showbuf((int)(FrStopTemp*10));   //处理后放入显存
  led_show_buf[0]=0x0c;               //清除显存最后一位
  Dip=0x05;                        //不显示小数点
}
/******************************************************
名称:KSC2Da
描述:按键第二级菜单DOWN键KC2_Cnt=0x0a所执行(菜单F7的参数设置)
*******************************************************/
void KSC2Da(void)
{
  if(ExTempWarn==0)    //0-21℃(20℃取消超温限报警功能)
    {ExTempWarn=21;}
  ExTempWarn--;
  dec_showbuf((int)(ExTempWarn*10));   //处理后放入显存
  led_show_buf[0]=0x0c;               //清除显存最后一位
  Dip=0x05;                        //不显示小数点
}
/********************************************************
名称:KeyScan
描述:按键扫描子程序
说明:可放在定时器中断服务程序中进行按键扫描
      将按键的一个周期分为三个状态:刚按下并消抖之后的状态,按下后延时大于10s的状态,高电平的状态
*********************************************************/
void KeyScan(void)
{ /*按键扫描获得键值*/
  if((P1IN&0x01)==0) Key_Temp|=KEY_K4; //K4(SET)被按下键值临时缓存相应位置位
   else Key_Temp&=(~KEY_K4);

  if(((P1IN&0x02)==0)&&(Key_Ceng==0)) Key_Temp|=KEY_K3; //K3(*)被按下键值临时(非设置状态下)缓存相应位置位
   else Key_Temp&=(~KEY_K3);

  if((P1IN&0x04)==0) UpDown_Temp|=KEY_K2; //K2(UP)被按下键值临时缓存相应位置位
   else UpDown_Temp&=(~KEY_K2);

  if((P1IN&0x08)==0) UpDown_Temp|=KEY_K1; //K1(DOWN)被按下键值临时缓存相应位置位
    else UpDown_Temp&=(~KEY_K1);

  /*按键计时判断*/
  if(Key_Temp!=NO_KEY)
    {//***********SET或*有按键按下**************
        if(Key_Temp==Key_Bak)
          {//判断SET键和*键是否跟上次的值相等(做为消抖)
             Key_Level=0x00;          //电平为低
             NoKey_time=0;
             Key_Value=Key_Temp;      //存放键值
             Key_Delay=0;
             FCtrl_Delay=0;
             if(!((Key_Value==KEY_K4)&&(ParaCheckVal!=0)))
               {//计数条件:非(键值为SET并且处于参数查看状态)则计数
                  Key_Old++;         //去抖之后对本键按下时间计数
                  if((Key_Value==KEY_K4)&&(ParaCheckVal==0))  //在参数设置内的循环延时(小循环)
                     { Set_Ok=1;  //
                       if(Key_Old>=2000)  //连续键大于10s
                         { Key_Delay=10;
                           Key_Old=2000;
                         }
                       else if(Key_Old>=800)   //连续键大于3s
                              { Key_Delay=3;}
                            else if(Key_Old==10)
                                   { Key_Delay=1;}   //
                     }
                  else  //在整个主程序循环的延时(大循环)
                     {
                       Set_Ok=0;
                       if(Key_Old>=500)
                         { FCtrl_Delay=3;  //
                            Key_Old=0;    //
                         }
                     }
               }
          }//判断SET键和*键是否跟上次的值相等(做为消抖)
        else                     //不相同
           { Key_Bak=Key_Temp;   //存缓存的新值以便下次比较
             Key_Old=0;
           }
    }//***********SET或*有按键按下**************
  else//SET或*没有按键按下
      { Key_Level=0x01;
      }

  if(UpDown_Temp!=NO_KEY)
     {//***********UP或DOWN有按键按下**************
        if(UpDown_Temp==UpDown_Bak)
          {//判断UP键和DOWN键(作为消抖)        条件:  如果有UP或DOWN键按下
            if((Key_Ceng==0)&&((Key_Value==KEY_K4)||(ParaCheckVal!=0)))
              { UpDown_Value=0;}  //在第零级菜单并且(SET键被按下或者处于参数查看状态)
            else
              { UpDown_Value=UpDown_Temp;}
            UpDown_Delay=0;
            UpDown_Level=0;
            if(Key_Ceng!=0)//条件:处于第一级或第二级菜单(参数设置状态)
              { NoKey_time=0;//无按键时间清零
                UpDown_Old++;//按键按下时间计数
                if(UpDown_Old>=300)
                  { UpDown_Old=300;
                    UpDown_Delay=2;}
                else if(UpDown_Old==10)
                      UpDown_Delay=1;
              }
          }
        else
          {UpDown_Bak=UpDown_Temp;   //存缓存的新值以便下次比较
          }
     }//***********UP或DOWN有按键按下**************
   else//**************没有按键按下****************
    {UpDown_Level=0x01;
     //UpDown_Value=0;
    }//**************没有按键按下****************
}
/*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
/******************************************************
名称:Key_chuli
入口参数:无
出口参数:无
说明:根据扫描得到的结果进行参数设置或查看
*******************************************************/
void Key_chuli(void)
{
  switch(Key_Ceng)
  {
    case 0x00:               //#########################第零层状态,(属于非设置状态)#######################
         if((Key_Value==KEY_K4)&&(ParaCheckVal==NO_KEY))
         {   //条件:SET键被单独按下并且非参数查看
         //****************************SET键被按下********************************
           if((Key_Delay==3)&&(Key_Level==0x00))
             {//********延时在3-10秒&&并且处于按下状态*******
                Dip=0x05;                //不显示小数点
                led_show_buf[0]=0x0c;
                led_show_buf[1]=0x01;
                led_show_buf[2]=0x0b;    //F1
                zhishi_flag&=(~SET_FLAG); //显示设置标志
             }//********延时在3-10秒&&并且处于按下状态*******
           else if((Key_Delay==10)&&(Key_Level==0x00))
                  {//********延时大于10秒&&并且处于按下状态*******
                    led_show_buf[0]=0x0c;
                    led_show_buf[1]=0x03;   //F3
                  }//********延时大于10秒&&并且处于按下状态*******
                else if(Key_Level==0x01)
                     {//******************按键抬起*******************
                       if((Key_Delay==0)||(Key_Delay==2)||(Key_Delay==1))
                         {//在0-3秒内抬起按键相当于无键按下
                           Set_Ok=0;
                           Key_Old=0;
                           Key_Value=0x00;             //恢复初始状态
                         }
                       else if(Key_Delay==3)           //在3-10秒内抬起按键
                              {
                                Key_Old=0;
                                Key_Value=0x00;        //*关键*
                                Key_Ceng=0x01;         //进入第一级菜单(用户菜单)
                                KC1_Cnt=0x01;          //
                              }
                            else if(Key_Delay==10)     //大于10毫秒抬起按键
                                   {
                                     Key_Old=0;
                                     Key_Value=0x00;   //*关键*
                                     Key_Ceng=0x02;    //进入第二级菜单(管理者菜单)
                                     KC2_Cnt=0x01;     //
                                   }
                     }//******************按键抬起*******************
         }//****************************SET键被按下********************************
         else if(Key_Value==KEY_K3)
              {//*****************************化霜键被按下******************************
                if((FCtrl_Delay==3)&&(Key_Level==0x00))
                  {//************按下*键时间大于3秒************
                    if((YsjJdqStu==YSJJDQ_OFF)&&(FreJdqStu==FREJDQ_OFF)||(YsjAuto_Stuts==AUTO_COOL)&&(tempture2<=(FrStopTemp*10)))
                      {//压缩机停止并化霜停止或自动制冷状态下化霜温不高于化霜终止温度
                        FreForc_Stuts=FORCE_FRE;  //强制化霜状态
                      }//压缩机停止并化霜停止或自动制冷状态下化霜温不高于化霜终止温度
                    else if(FreJdqStu==FREJDQ_ON) //
                           {//处于强制化霜或自动化霜
                             FreForc_Stuts=FSTOP_FRE; //强制退出化霜
                           }//处于强制化霜或自动化霜
                  }//************按下化霜键时间大于3秒************
                else if(Key_Level==0x01)
                       {//***************按键抬起*********************
                         Key_Old=0;
                         Key_Value=NO_KEY;   //恢复初始状态
                       }//***************按键抬起*********************
              }//*****************************化霜键被按下******************************
         else if(Key_Value==KEY_K34)
              {//*************************SET键和*键被同时按下******************************
                if((FCtrl_Delay==3)&&(Key_Level==0x00))
                  {//************按下设置化霜键时间大于3秒************
                    if((YsjJdqStu==YSJJDQ_OFF)&&(FreJdqStu==FREJDQ_OFF)||(FreJdqStu==FREJDQ_ON)&&(tempture1>(TempSet*10)))
                      {//压缩机停止并化霜停止或正在化霜(强制或自动)并库温高于设定温度
                        YsjForc_Stuts=FORCE_COOL;   //强制进入制冷
                      }
                    if((YsjJdqStu==YSJJDQ_ON)||(YsjAuto_Stuts==DELAY_COOL))//处于制冷状态或延时状态时
                        {
                          YsjForc_Stuts=FSTOP_COOL;  //强制退出制冷
                        }
                  }//************按下设置化霜键时间大于3秒************
                else if(Key_Level==0x01)
                       {//***************按键抬起****************
                         Key_Old=0;
                         Key_Value=0x00;             //恢复初始状态
                       }//***************按键抬起****************
              }//*************************设置化霜键被同时按下******************************
        if(!((Key_Value==KEY_K4)&&(ParaCheckVal==0)))
          {//条件:(SET键被按下并且非查看状态)在此条件下不执行参数查看操作
            if((UpDown_Value==KEY_K2)||(ParaCheckVal==KEY_K2))
              {//**************************参数查看UP键被按下*******************************
                //led_refresh();
                if(ParaCheckVal==NO_KEY)
                  { ParaCheckVal=KEY_K2;
                    ParaCheckCnt=0;
                    UpDown_Value=0;
                  }
                else if(ParaCheckCnt<=64)//参数显示时间在0-2秒
                       {
                         //led_refresh();
                         dec_showbuf(tempture2);//显示化霜传感器温度
                         UpDown_Value=0;
                       }
                     else if(ParaCheckCnt<128) //参数时间2秒
                            { dec_showbuf((int)(Huicha*10));   //回差值处理后放入显存
                              led_show_buf[0]=0x0c;            //清除显存最后一位
                              Dip=0x05;                        //不显示小数点
                              UpDown_Value=0;
                              led_refresh();
                            }
                           else if(ParaCheckCnt>=128)
                                  { ParaCheckVal=0;
                                    UpDown_Value=0;
                                  }
              }//**************************参数查看UP键被按下*******************************
            if((UpDown_Value==KEY_K1)||(ParaCheckVal==KEY_K1))
              {//*************************参数查看DOWN键被按下******************************
                if(ParaCheckVal==NO_KEY)  //如果按下并且"参数查看"寄存器无值
                  { ParaCheckVal=KEY_K1;  //"参数查看"寄存器存放DOWN值
                    ParaCheckCnt=0;
                    UpDown_Value=0;
                  }
                else if(ParaCheckCnt<64)    //0-2秒显示设置温度
                       { dec_showbuf((int)(TempSet*10));   //处理后放入显存
                         led_show_buf[0]=0x0c;             //清除显存最后一位
                         Dip=0x05;                         //不显示小数点
                         UpDown_Value=0;
                       }
                     else if(ParaCheckCnt<=128)
                            {//2-4秒
                              UpDown_Value=0;
                              if((FreshCycl==0)||(FreshTime==0))//取消化霜功能,显示"99"
                                { led_show_buf[0]=0x0c;     //不显示
                                  led_show_buf[1]=0x09;     //9
                                  led_show_buf[2]=0x09;     //9
                                  zhishi_flag|=MINUS_FLAG;
                                }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -