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

📄 rscom.c

📁 一个很好的完整的空调控制器程序
💻 C
📖 第 1 页 / 共 3 页
字号:
                 }
                 if ((ScBufAdr[3] >= 20) && (ScBufAdr[3] <= 39)){
                   for (i=0; i<(u8)((ScBufAdr[2] & 0x0F) - 1); i++){
                     Set_WJD((u8)(ScBufAdr[3] + i), ScBufAdr[i + 4]);
                   }
                 }
               }

               /* 在模式没有发送到外机之前,先清除允许标志 */
               if (!ValBit(Sysflag,fModeflag)){
                 ClrBit(OutDevStu[0],fRunEnable);
                 ClrBit(OutDevStu[0],fOutDeforst);
               }
               if ValBit(OutDevStu[0],fRunEnable) ClrBit(Sysflag2,fRequest);
               ScBufAdr[3] = (u8)((ScBufAdr[3] / 10) - 1);   /* 参数代号 */
               /* Go Next, No break */
             case 2:
               //if (!(((ScBufAdr[3] >= 1) && (ScBufAdr[3] <= 4)) ||
               //     ((ScBufAdr[3] >= 20) && (ScBufAdr[3] <= 59)))){
               //  ScBufAdr[3] = 1;    /* 参数代号 */
               //}
#if 1
               if (ScBufAdr[3] == 1){
                 /* 三个参数 */
                 ScBufAdr[2] = (u8)((ScBufAdr[2] & 0x0F0) | 4);
                 ScBufAdr[4] = Get_NJR(20, j);
                 ScBufAdr[5] = Get_NJR(21, j);
                 ScBufAdr[6] = Get_NJR(22, j);
               } else if ((ScBufAdr[3] >= 2) && (ScBufAdr[3] <= 4)){
#else
               if ((ScBufAdr[3] >= 1) && (ScBufAdr[3] <= 4)){
#endif
                 /* 10个参数 */
                 ScBufAdr[2] = (u8)((ScBufAdr[2] & 0x0F0) | 11);
                 for (i=0; i<10; i++){
                   ScBufAdr[i+4] = Get_NJR((u8)((ScBufAdr[3] + 1) * 10 + i), j);
                 }
               } else if ((ScBufAdr[3] >= 20) && (ScBufAdr[3] <= 59)){
                 /* 1个参数 */
                 ScBufAdr[2] = (u8)((ScBufAdr[2] & 0x0F0) | 2);
                 ScBufAdr[4] =  Get_NJR(ScBufAdr[3], j);
               } else {
                 ScBufAdr[1] = WJ_NJNoBROADCAST;     /* 不发送 */
               }
               break;

             case 3:
               f = FALSE;
               if ((ScBufAdr[3] >= 1) && (ScBufAdr[3] <= 4)){
                 ScBufAdr[3] = (u8)((ScBufAdr[3] + 1) * 10);
               }

               if ((ScBufAdr[3] >= 20) && (ScBufAdr[3] <= 59)){
                 f = TRUE;
                 for (i=0; i<(u8)((ScBufAdr[2] & 0x0F)- 1); i++){
                   f = (BOOLEAN)(Set_NJD((u8)(ScBufAdr[3] + i), ScBufAdr[i + 4]) && f);
                 }
               }
               ScBufAdr[2] = (u8)((ScBufAdr[2] & 0x0F0) | 0x01);
               ScBufAdr[3] = (u8)(f? 0x0FE : 0x0FF);  /* ACK/NAK */
               break;
             default:
               ScBufAdr[1] = WJ_NJNoBROADCAST;  /* 不发送 */
               break;
           }

           if ((u8)(ScBufAdr[1] & NJNOMASK) != WJ_NJNoBROADCAST){ /* 不为广播地址,发送 */
             SetBit(ScBufAdr[0],3);             /* 设置应答标志 */
             CRCchk(CRC_CALCULATE,ScBufAdr);    /* 计算CRC */

             ScFlag = (1 << fScREQ);            /* 请求启动发送 */
             UCSRB = (1 << RXCIE)|(1 << RXEN);

             TCCR0 = 0x05;                      /* Normal, OC0 Disconnected, 1:256 */
             OCR0 = (u8)(TCNT0 + 1024/32);      /* 下次中断时间 1.024mS*/
             WaitBeforeTx = (u8)(TCNT0 & 0x07); /* 随机延时 */
             TIMSK |= (u8)(1 << OCIE0);
           }
         }
       }
     }
     ClrBit(ScFlag,fScRxOk);     /* 清除标志 */
   }
}

void Set_WJD(u8 i,u8 v)
{
   //u8 j;
   switch(i){
     case 20:  /* 室外机工作状态 */
       OutDevStu[0] = v;
       break;
     case 21:  /* 系统最大额定制冷量(500W) */
       SysSetPow = v;
       break;
     case 22:  /* 系统当前总制冷量(500W) */
       if (ValBit(Sysflag1,fRoPowCHK)){      /* 1: 请求功率检测 */
         SetBit(Sysflag1,fEnPowCHK);
       }
       SysTotPow = v;
       break;
     case 23:
       TmpVar = v;
       break;
     case 24:  /* 外机请求开度 */
       OutSideValve = (u16)((v<<8) + TmpVar);
       break;
     case 30:  /* 室外机设备状态(2字节) */
       OutDevStu[1] = v;
       break;
     case 31:
       OutDevStu[2] = v;
       break;
     case 32:  /* 室外机故障状态 */
       OutSideErr[0] = (u8)((WJType == 1)? (v & 0x1F) : v);
       break;
     case 33:  /* 室外机故障状态 */
       OutSideErr[1] = (u8)((WJType == 1)? (v & 0x0E7) : (v & 0x17));
       break;
     case 34:  /* 室外机故障状态 */
       OutSideErr[2] = (u8)((WJType == 1)? (v & 0x0C7) : v);
       break;
     case 35:  /* 室外机故障状态 */
       OutSideErr[3] = (u8)((WJType == 1)? (v & 0x0C7) : (v & 0x1F));
       break;
     case 36:  /* 室外机故障状态 */
       OutSideErr[4] = (u8)((WJType == 1)? 0 : (v & 0x07));
       break;
     case 37:  /* 室外机故障状态 */
       OutSideErr[5] = (u8)((WJType == 1)? 0 : (v & 0x1));
       break;
     default:
       break;
    }
}

BOOLEAN Set_NJD(u8 i, u8 v)
{
   u8 j;

   switch(i){
     case 20:

       /* 扫风方式 */
       SetFDoorUnit((u8)(v >> 6));

       /* 设定风速 */
       SetFanStatus((u8)((v >> 4) & 0x03));

       /* 室内机模式 */
       j = (u8)(v & MODEMASK);
       if (j != 0){
         ClrBit(Sysflag,fContinue);
         if (j == 5){        /* 强制制热 */
           SetBit(Sysflag,fContinue);
           j = MODEHEAT;
         } else if (j == 6){ /* 强制制冷 */
           SetBit(Sysflag,fContinue);
           j = MODECOOL;
         } else if (j == 7){
           j = MODEAUTO;     /* 自动模式 */
         }

         SetBit(RunMode,fSysOnOff);  /* 开机 */
         SetMode(j);
       } else {
         /* 清除定时关标志 */
         SlpTmFlag &= (u8)((1<<bb4ms)|(1<<bb2s)|(1<<fTime));
         SysOff();
       }
       SysInit();
       return TRUE;
       break;
     case 21:   /* 内机功率(On 500W) */
       if (!ValBit(RunMode,fSysOn) &&      /* 停机时才允许修改 */
           (v != 0)){
         PowerConst = v;
         ClrBit(Errorflg,fSysPowErr);      /* 1: 室内机总功率过大 */
         return TRUE;
       }
       break;
     case 22:   /* 内机故障标志2 */
     case 30:   /* 内机故障标志 */
       Errorflg = 0;
       Errorflg2 = 0;
//       PumpErrFlg = 0x03;
       return TRUE;
       break;
     case 35:   /* 设定温度 */
       if ((v >= (SetupTpMIN - 0x80)) &&
           (v <= (SetupTpMAX - 0x80))){
         SetupTp = (u8)(v + 0x80);
         SysInit();
         return TRUE;
       }
       break;
     case 36:   /* 制冷调阀零点 */
       j = (u8)(v + 0x80);
       if ((j >= 118) && (j <= 138)){
         SetOnCool = j;
         return TRUE;
       }
       break;
     case 37:   /* 制热调阀零点 */
       j = (u8)(v + 0x80);
       if ((j >= 118) && (j <= 138)){
         SetOnHeat = j;
         return TRUE;
       }
       break;
     case 38:   /* 非调节温度 */
       if (v <= 10) {
         SetUnacc = v;
         return TRUE;
       }
       break;
     case 39:   /* 制热膨胀阀常开开度 */
       if (v >= 40){
         SetOn = v;
         return TRUE;
       }
       break;
     case 40:   /* 室内机膨胀阀类型 */
       if (v == 1) {
         ClrBit(SysConfig,fPZFClockWise); /* 0:1 三花(逆时针开阀) */
       } else if (v == 20){
         SetBit(SysConfig,fPZFClockWise); /* 1:20 华鹭(顺时针开阀)*/
       }
       return TRUE;
       break;
     case 46:   /* 室内机膨胀阀设定开度(Lo,Hi:2字节) */
       TmpVar = v;
       return TRUE;
       break;
     case 47:
       if ((u16)((v << 8) + TmpVar) <= PZFMAX){
         SetupVal_Lo = TmpVar;
         SetupVal_Hi = v;
         return TRUE;
       }
       break;
     case 48:   /* 内机选择项 */
       if ((v & 0x0E0) == 0) {
         SysConfig = v;
         IfDisHeat();
         return TRUE;
       }
       break;
#ifdef ChigoXG1
#ifndef ChigoXG1Set
     case 49:   /* 制热温度补偿 */
       j = (u8)(v + 0x80);
       if ((j >= 118) && (j <= 138)){
         SetOffset = j;
         return TRUE;
       }
#endif
#endif
       break;
     case 50:        /* 内机模式 */
       if (v == 0){
         /* 清除定时关标志 */
         SlpTmFlag &= (u8)((1<<bb4ms)|(1<<bb2s)|(1<<fTime));
         SysOff();   /* 关机 */
         SysInit();
         return TRUE;
       } else if (v < 8) {
         if (v == 6){        /* 强制制热 */
           SetBit(Sysflag,fContinue);
           j = MODEHEAT;
         } else if (v == 7){ /* 强制制冷 */
           SetBit(Sysflag,fContinue);
           j = MODECOOL;
         } else {
           ClrBit(Sysflag,fContinue);
           j = (u8)((v == 1)? MODEAUTO : ((v == 5)? MODEHEAT : v));
         }
         SetBit(RunMode,fSysOnOff);    /* 申请开机 */
         SetMode(j);
         SysInit();
         return TRUE;
       }
       break;
     case 51:   /* 内机风速 00: Auto/01: L/ 02: M/03: H */
       FanStatus = (u8)((FanStatus & ~FANMASK_S)|(v & FANMASK_S));
       SysInit();
       return TRUE;
       break;
#ifdef EnSWING
     case 52:   /* 扫风状态 */
       FDoorUnit = (u8)((FDoorUnit & ~SWINGMASK)|(v & SWINGMASK));
       SysInit();
       return TRUE;
       break;
#endif
     case 53:   /* 内机ID(包括外机) */
       j = (u8)(v & NJNOMASK);
       if ((j >= WJ_NJNoMIN) && (j <= WJ_NJNoMAX)){
         ClrRsErr(v);
         return TRUE;
       }
       break;
   }
   return  FALSE;
}

void ClrRsErr(u8 wjnj)

⌨️ 快捷键说明

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