user_mb_app.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. /*
  2. * FreeModbus Libary: user callback functions and buffer define in slave mode
  3. * Copyright (C) 2013 Armink <armink.ztl@gmail.com>
  4. *
  5. * This library is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU Lesser General Public
  7. * License as published by the Free Software Foundation; either
  8. * version 2.1 of the License, or (at your option) any later version.
  9. *
  10. * This library is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * Lesser General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU Lesser General Public
  16. * License along with this library; if not, write to the Free Software
  17. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  18. *
  19. * File: $Id: user_mb_app.c,v 1.60 2013/11/23 11:49:05 Armink $
  20. */
  21. #include "user_mb_app.h"
  22. #include "stm32f10x.h"
  23. #include "HT16C22.h"
  24. #include "key.h"
  25. #include "Relay.h"
  26. #include "SIM_EEPROM.h"
  27. extern u8 AC_Flag; //空调界面
  28. extern u8 FH_Flag; //地暖界面
  29. extern u8 FA_Flag; //新风界面
  30. extern u8 AC_Open; //空调开机
  31. extern u8 FH_Open; //地暖界面
  32. extern u8 FA_Open; //新风界面
  33. extern u8 XM_flag;
  34. extern u8 THA;
  35. extern u16 savedata[32];
  36. void DoWhenWriteHoldingRegister(USHORT iRegIndex);
  37. /*------------------------Slave mode use these variables----------------------*/
  38. //Slave mode:DiscreteInputs variables
  39. USHORT usSDiscInStart = S_DISCRETE_INPUT_START;
  40. #if S_DISCRETE_INPUT_NDISCRETES%8
  41. UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8+1];
  42. #else
  43. UCHAR ucSDiscInBuf[S_DISCRETE_INPUT_NDISCRETES/8] ;
  44. #endif
  45. //Slave mode:Coils variables
  46. USHORT usSCoilStart = S_COIL_START;
  47. #if S_COIL_NCOILS%8
  48. UCHAR ucSCoilBuf[S_COIL_NCOILS/8+1] ;
  49. #else
  50. UCHAR ucSCoilBuf[S_COIL_NCOILS/8] ;
  51. #endif
  52. //Slave mode:InputRegister variables
  53. USHORT usSRegInStart = S_REG_INPUT_START;
  54. USHORT usSRegInBuf[S_REG_INPUT_NREGS] ;
  55. //Slave mode:HoldingRegister variables
  56. USHORT usSRegHoldStart = S_REG_HOLDING_START;
  57. USHORT usSRegHoldBuf[S_REG_HOLDING_NREGS] ;
  58. /*------------------------Slave mode use these variables----------------------*/
  59. /**
  60. * Modbus slave input register callback function.
  61. *
  62. * @param pucRegBuffer input register buffer
  63. * @param usAddress input register address
  64. * @param usNRegs input register number
  65. *
  66. * @return result
  67. */
  68. eMBErrorCode eMBRegInputCB(UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )
  69. {
  70. eMBErrorCode eStatus = MB_ENOERR;
  71. USHORT iRegIndex;
  72. USHORT * pusRegInputBuf;
  73. USHORT REG_INPUT_START;
  74. USHORT REG_INPUT_NREGS;
  75. USHORT usRegInStart;
  76. pusRegInputBuf = usSRegInBuf;
  77. REG_INPUT_START = S_REG_INPUT_START;
  78. REG_INPUT_NREGS = S_REG_INPUT_NREGS;
  79. usRegInStart = usSRegInStart;
  80. /* it already plus one in modbus function method. */
  81. usAddress--;
  82. if ((usAddress >= REG_INPUT_START)
  83. && (usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS))
  84. {
  85. iRegIndex = usAddress - usRegInStart;
  86. while (usNRegs > 0)
  87. {
  88. *pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] >> 8);
  89. *pucRegBuffer++ = (UCHAR) (pusRegInputBuf[iRegIndex] & 0xFF);
  90. iRegIndex++;
  91. usNRegs--;
  92. }
  93. }
  94. else
  95. {
  96. eStatus = MB_ENOREG;
  97. }
  98. return eStatus;
  99. }
  100. /**
  101. * Modbus slave holding register callback function.
  102. *
  103. * @param pucRegBuffer holding register buffer
  104. * @param usAddress holding register address
  105. * @param usNRegs holding register number
  106. * @param eMode read or write
  107. *
  108. * @return result
  109. */
  110. eMBErrorCode eMBRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress,
  111. USHORT usNRegs, eMBRegisterMode eMode)
  112. {
  113. eMBErrorCode eStatus = MB_ENOERR;
  114. USHORT iRegIndex;
  115. USHORT * pusRegHoldingBuf;
  116. USHORT REG_HOLDING_START;
  117. USHORT REG_HOLDING_NREGS;
  118. USHORT usRegHoldStart;
  119. pusRegHoldingBuf = usSRegHoldBuf;
  120. REG_HOLDING_START = S_REG_HOLDING_START;
  121. REG_HOLDING_NREGS = S_REG_HOLDING_NREGS;
  122. usRegHoldStart = usSRegHoldStart;
  123. /* it already plus one in modbus function method. */
  124. usAddress--;
  125. if ((usAddress >= REG_HOLDING_START)
  126. && (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS))
  127. {
  128. iRegIndex = usAddress - usRegHoldStart;
  129. switch (eMode)
  130. {
  131. /* read current register values from the protocol stack. */
  132. case MB_REG_READ:
  133. while (usNRegs > 0)
  134. {
  135. *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] >> 8);
  136. *pucRegBuffer++ = (UCHAR) (pusRegHoldingBuf[iRegIndex] & 0xFF);
  137. /*if(iRegIndex==0)
  138. {
  139. pusRegHoldingBuf[iRegIndex]=0;
  140. }*/
  141. iRegIndex++;
  142. usNRegs--;
  143. }
  144. break;
  145. /* write current register values with new values from the protocol stack. */
  146. case MB_REG_WRITE:
  147. while (usNRegs > 0)
  148. {
  149. pusRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;
  150. pusRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
  151. DoWhenWriteHoldingRegister(iRegIndex);
  152. iRegIndex++;
  153. usNRegs--;
  154. }
  155. break;
  156. }
  157. }
  158. else
  159. {
  160. eStatus = MB_ENOREG;
  161. }
  162. return eStatus;
  163. }
  164. /**
  165. * Modbus slave coils callback function.
  166. *
  167. * @param pucRegBuffer coils buffer
  168. * @param usAddress coils address
  169. * @param usNCoils coils number
  170. * @param eMode read or write
  171. *
  172. * @return result
  173. */
  174. eMBErrorCode eMBRegCoilsCB(UCHAR * pucRegBuffer, USHORT usAddress,
  175. USHORT usNCoils, eMBRegisterMode eMode)
  176. {
  177. eMBErrorCode eStatus = MB_ENOERR;
  178. USHORT iRegIndex , iRegBitIndex , iNReg;
  179. UCHAR * pucCoilBuf;
  180. USHORT COIL_START;
  181. USHORT COIL_NCOILS;
  182. USHORT usCoilStart;
  183. iNReg = usNCoils / 8 + 1;
  184. pucCoilBuf = ucSCoilBuf;
  185. COIL_START = S_COIL_START;
  186. COIL_NCOILS = S_COIL_NCOILS;
  187. usCoilStart = usSCoilStart;
  188. /* it already plus one in modbus function method. */
  189. usAddress--;
  190. if( ( usAddress >= COIL_START ) &&
  191. ( usAddress + usNCoils <= COIL_START + COIL_NCOILS ) )
  192. {
  193. iRegIndex = (USHORT) (usAddress - usCoilStart) / 8;
  194. iRegBitIndex = (USHORT) (usAddress - usCoilStart) % 8;
  195. switch ( eMode )
  196. {
  197. /* read current coil values from the protocol stack. */
  198. case MB_REG_READ:
  199. while (iNReg > 0)
  200. {
  201. *pucRegBuffer++ = xMBUtilGetBits(&pucCoilBuf[iRegIndex++],
  202. iRegBitIndex, 8);
  203. iNReg--;
  204. }
  205. pucRegBuffer--;
  206. /* last coils */
  207. usNCoils = usNCoils % 8;
  208. /* filling zero to high bit */
  209. *pucRegBuffer = *pucRegBuffer << (8 - usNCoils);
  210. *pucRegBuffer = *pucRegBuffer >> (8 - usNCoils);
  211. break;
  212. /* write current coil values with new values from the protocol stack. */
  213. case MB_REG_WRITE:
  214. while (iNReg > 1)
  215. {
  216. xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, 8,
  217. *pucRegBuffer++);
  218. iNReg--;
  219. }
  220. /* last coils */
  221. usNCoils = usNCoils % 8;
  222. /* xMBUtilSetBits has bug when ucNBits is zero */
  223. if (usNCoils != 0)
  224. {
  225. xMBUtilSetBits(&pucCoilBuf[iRegIndex++], iRegBitIndex, usNCoils,
  226. *pucRegBuffer++);
  227. }
  228. break;
  229. }
  230. }
  231. else
  232. {
  233. eStatus = MB_ENOREG;
  234. }
  235. return eStatus;
  236. }
  237. /**
  238. * Modbus slave discrete callback function.
  239. *
  240. * @param pucRegBuffer discrete buffer
  241. * @param usAddress discrete address
  242. * @param usNDiscrete discrete number
  243. *
  244. * @return result
  245. */
  246. eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
  247. {
  248. eMBErrorCode eStatus = MB_ENOERR;
  249. USHORT iRegIndex , iRegBitIndex , iNReg;
  250. UCHAR * pucDiscreteInputBuf;
  251. USHORT DISCRETE_INPUT_START;
  252. USHORT DISCRETE_INPUT_NDISCRETES;
  253. USHORT usDiscreteInputStart;
  254. iNReg = usNDiscrete / 8 + 1;
  255. pucDiscreteInputBuf = ucSDiscInBuf;
  256. DISCRETE_INPUT_START = S_DISCRETE_INPUT_START;
  257. DISCRETE_INPUT_NDISCRETES = S_DISCRETE_INPUT_NDISCRETES;
  258. usDiscreteInputStart = usSDiscInStart;
  259. /* it already plus one in modbus function method. */
  260. usAddress--;
  261. if ((usAddress >= DISCRETE_INPUT_START)
  262. && (usAddress + usNDiscrete <= DISCRETE_INPUT_START + DISCRETE_INPUT_NDISCRETES))
  263. {
  264. iRegIndex = (USHORT) (usAddress - usDiscreteInputStart) / 8;
  265. iRegBitIndex = (USHORT) (usAddress - usDiscreteInputStart) % 8;
  266. while (iNReg > 0)
  267. {
  268. *pucRegBuffer++ = xMBUtilGetBits(&pucDiscreteInputBuf[iRegIndex++],
  269. iRegBitIndex, 8);
  270. iNReg--;
  271. }
  272. pucRegBuffer--;
  273. /* last discrete */
  274. usNDiscrete = usNDiscrete % 8;
  275. /* filling zero to high bit */
  276. *pucRegBuffer = *pucRegBuffer << (8 - usNDiscrete);
  277. *pucRegBuffer = *pucRegBuffer >> (8 - usNDiscrete);
  278. }
  279. else
  280. {
  281. eStatus = MB_ENOREG;
  282. }
  283. return eStatus;
  284. }
  285. void FillCRC(uint8_t * pBuffer, uint16_t bufferLength) {
  286. uint16_t crc = 0xFFFF;
  287. for (uint16_t i = 0; i < bufferLength - 2; i++) {
  288. crc ^= pBuffer[i];
  289. for (uint16_t j = 0; j < 8; j++) {
  290. if (crc & 0x01) {
  291. crc >>= 1;
  292. crc ^= 0xA001;
  293. } else {
  294. crc >>= 1;
  295. }
  296. }
  297. }
  298. pBuffer[bufferLength - 2] = (crc & 0x00ff);
  299. pBuffer[bufferLength - 1] = (crc & 0xff00) >> 8;
  300. }
  301. uint8_t * MakeMessage(uint16_t addr, uint16_t value) {
  302. static uint8_t g_Message[8] = {0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  303. g_Message[0] = local_addr & 0xff;
  304. g_Message[1] = 0x06;
  305. g_Message[2] = (addr & 0xff00) >> 8;
  306. g_Message[3] = (addr & 0x00ff) >> 0;
  307. g_Message[4] = (value & 0xff00) >> 8;
  308. g_Message[5] = (value & 0x00ff) >> 0;
  309. FillCRC(g_Message, 8);
  310. return g_Message;
  311. }
  312. uint8_t * MakeMultiMessage_KT(void) {
  313. static uint8_t g_Message[17] = {0x00, 0x10, 0x00, 0x01, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  314. g_Message[0] = local_addr & 0xff;
  315. g_Message[7] = (Reg_sta[0x01] & 0xff00) >> 8;
  316. g_Message[8] = (Reg_sta[0x01] & 0x00ff);
  317. g_Message[9] = (Reg_sta[0x02] & 0xff00) >> 8;
  318. g_Message[10] = (Reg_sta[0x02] & 0x00ff);
  319. g_Message[11] = (Reg_sta[0x03] & 0xff00) >> 8;
  320. g_Message[12] = (Reg_sta[0x03] & 0x00ff);
  321. g_Message[13] = (Reg_sta[0x04] & 0xff00) >> 8;
  322. g_Message[14] = (Reg_sta[0x04] & 0x00ff);
  323. FillCRC(g_Message, 17);
  324. return g_Message;
  325. }
  326. uint8_t * MakeMultiMessage_DN(void) {
  327. static uint8_t g_Message[13] = {0x00, 0x10, 0x00, 0x06, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  328. g_Message[0] = local_addr & 0xff;
  329. g_Message[7] = (Reg_sta[0x06] & 0xff00) >> 8;
  330. g_Message[8] = (Reg_sta[0x06] & 0x00ff);
  331. g_Message[9] = (Reg_sta[0x07] & 0xff00) >> 8;
  332. g_Message[10] = (Reg_sta[0x07] & 0x00ff);
  333. FillCRC(g_Message, 13);
  334. return g_Message;
  335. }
  336. extern u32 pwn_count;
  337. extern u32 key_pwn_count;
  338. extern u8 XM_flag;
  339. extern u8 key_XM_flag;
  340. uint8_t * MakeMultiMessage_XF(void) {
  341. static uint8_t g_Message[15] = {0x00, 0x10, 0x00, 0x09, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  342. g_Message[0] = local_addr & 0xff;
  343. g_Message[7] = (Reg_sta[0x09] & 0xff00) >> 8;
  344. g_Message[8] = (Reg_sta[0x09] & 0x00ff);
  345. g_Message[9] = (Reg_sta[0x0a] & 0xff00) >> 8;
  346. g_Message[10] = (Reg_sta[0x0a] & 0x00ff);
  347. g_Message[11] = (Reg_sta[0x0b] & 0xff00) >> 8;
  348. g_Message[12] = (Reg_sta[0x0b] & 0x00ff);
  349. FillCRC(g_Message, 15);
  350. return g_Message;
  351. }
  352. //寄存器写操作
  353. u8 KJ_flag = 0;
  354. void DoWhenWriteHoldingRegister(USHORT iRegIndex) {
  355. //退出休眠模式
  356. AC_Flag = 1;
  357. XM_flag = 0;
  358. pwn_count = 0;
  359. key_pwn_count = 0;
  360. key_XM_flag = 0;
  361. XM_flag = 0 ;
  362. switch(iRegIndex) {
  363. case Air_condition_switch:
  364. if (Reg_sta[Air_condition_switch] == 0 || Reg_sta[Air_condition_switch] == 1)
  365. {
  366. if(AC_Open != Reg_sta[Air_condition_switch])
  367. {
  368. AC_Open = Reg_sta[Air_condition_switch];
  369. savedata[24] = AC_Open;
  370. MemWriteByte(savedata, sizeof(savedata));
  371. {
  372. if(Reg_sta[Air_condition_switch] == 1)
  373. {
  374. KJ_flag = 1;
  375. //Animation();
  376. AC_Flag=1;
  377. XM_flag = 0;
  378. }
  379. }
  380. if(Reg_sta[Air_condition_switch]==0x00)
  381. {
  382. ht16c22_clear();
  383. // XM_flag = 1;
  384. //Interface_flag_clear();
  385. THA = 0;
  386. }
  387. }
  388. }
  389. //if(AC_Flag)
  390. //set_Relay_Sta(AC_Open,FH_Open,FA_Open);
  391. break;
  392. //工作模式
  393. case Air_condition_mode:
  394. if(Reg_sta[Air_condition_mode] <= 1 && Reg_sta[Air_condition_mode] >= 0)
  395. {
  396. if(Reg_sta[Air_condition_mode] > 1)
  397. AC_mode = 0;
  398. else AC_mode = Reg_sta[Air_condition_mode];
  399. savedata[23] = AC_mode;
  400. //冬季模式
  401. if(AC_mode == 0)
  402. {
  403. //温度下限
  404. savedata[29] = 20;
  405. Reg_sta[Temperature_Down_limit] = savedata[29];
  406. //温度上限
  407. savedata[30] = 28;
  408. Reg_sta[Temperature_Up_limit] = savedata[30];
  409. }
  410. //夏季
  411. else if (AC_mode == 1)
  412. {
  413. //温度下限
  414. savedata[29] = 18;
  415. Reg_sta[Temperature_Down_limit] = savedata[29];
  416. //温度上限
  417. savedata[30] = 26;
  418. Reg_sta[Temperature_Up_limit] = savedata[30];
  419. }
  420. //设置温度也随即改变
  421. if(Reg_sta[Air_set_temp] < savedata[29])
  422. AC_temp = savedata[29];
  423. else if ( Reg_sta[Air_set_temp] >savedata[30])
  424. AC_temp = savedata[30];
  425. else AC_temp = Reg_sta[Air_set_temp];
  426. savedata[21] = AC_temp;
  427. MemWriteByte(savedata, sizeof(savedata));
  428. }
  429. // if(Reg_sta[Air_condition_mode] == 3)
  430. // AC_mode = 0;
  431. // else
  432. // AC_mode = Reg_sta[Air_condition_mode] + 1;
  433. break;
  434. case Air_wind_speed:
  435. if(Reg_sta[Air_wind_speed] <= 3 && Reg_sta[Air_wind_speed] >= 1)
  436. {
  437. if(Reg_sta[Air_wind_speed] > 3 || Reg_sta[Air_wind_speed] <1 )
  438. AC_speed = 1;
  439. else AC_speed = Reg_sta[Air_wind_speed];
  440. savedata[22] = AC_speed;
  441. MemWriteByte(savedata, sizeof(savedata));
  442. }
  443. break;
  444. case Air_set_temp:
  445. if(Reg_sta[Air_set_temp] >= savedata[29] && Reg_sta[Air_set_temp] <= savedata[30])
  446. {
  447. if(Reg_sta[Air_set_temp] < savedata[29])
  448. AC_temp = savedata[29];
  449. else if ( Reg_sta[Air_set_temp] >savedata[30])
  450. AC_temp = savedata[30];
  451. else AC_temp = Reg_sta[Air_set_temp];
  452. savedata[21] = AC_temp;
  453. MemWriteByte(savedata, sizeof(savedata));
  454. }
  455. break;
  456. case Relay_Sta_Read:
  457. break;
  458. case Floor_heating_switch:
  459. break;
  460. case Floor_heating_temp:
  461. break;
  462. case Fresh_air_switch:
  463. break;
  464. case Fresh_air_Param:
  465. break;
  466. case Fresh_air_wind_speed:
  467. break;
  468. case Compensates_temp:
  469. break;
  470. case Real_time_temp:
  471. break;
  472. case Real_time_Humidity:
  473. break;
  474. case Real_time_Fa_param:
  475. break;
  476. case Air_condition_Relay:
  477. break;
  478. case Floor_heating_Relay:
  479. break;
  480. case Fresh_air_reg:
  481. break;
  482. case Ltemp_Protection_valve:
  483. break;
  484. case Led_Brightness:
  485. int sii1;
  486. int sttl;
  487. sii1 = Reg_sta[Led_Brightness] & 0x0f;
  488. sttl = (Reg_sta[Led_Brightness] >>8) &0x01;
  489. if((sttl == 1 || sttl ==0 )&& (sii1 >= 1&& sii1 <=6))
  490. {
  491. SI = Reg_sta[Led_Brightness] & 0x0f;
  492. if( SI>6 ||SI <1)
  493. {
  494. SI = 1;
  495. }
  496. savedata[27] = SI;
  497. savedata[20] = (Reg_sta[Led_Brightness] >>8) &0x01;
  498. MemWriteByte(savedata, sizeof(savedata));
  499. }
  500. break;
  501. case Sleep_time_addr:
  502. if( Reg_sta[Sleep_time_addr] == 0xf||(Reg_sta[Sleep_time_addr] >= 0 && Reg_sta[Sleep_time_addr] <= 6))
  503. {
  504. if(!Reg_sta[Sleep_time_addr])
  505. {
  506. XM_time=30000;
  507. FOUR = 0;
  508. }
  509. else if(Reg_sta[Sleep_time_addr]==15)
  510. {
  511. XM_time=0;
  512. FOUR = 6;
  513. }
  514. else
  515. {
  516. XM_time=Reg_sta[Sleep_time_addr]*60000;
  517. FOUR = Reg_sta[Sleep_time_addr];
  518. }
  519. savedata[25] = Reg_sta[Sleep_time_addr];
  520. MemWriteByte(savedata, sizeof(savedata));
  521. }
  522. break;
  523. case Lock_screen:
  524. break;
  525. //温度单位转换
  526. case Temperature_Unit:
  527. if(Reg_sta[Temperature_Unit] == 0 || Reg_sta[Temperature_Unit] == 1)
  528. {
  529. if(Reg_sta[Temperature_Unit] < 0)
  530. Reg_sta[Temperature_Unit] = 0;
  531. else if(Reg_sta[Temperature_Unit] > 1)
  532. Reg_sta[Temperature_Unit] = 1;
  533. savedata[19] = Reg_sta[Temperature_Unit];
  534. MemWriteByte(savedata, sizeof(savedata));
  535. }
  536. break;
  537. case Temperature_Down_limit:
  538. if(Reg_sta[Temperature_Down_limit]>=5 && Reg_sta[Temperature_Down_limit] <=20)
  539. {
  540. if(Reg_sta[Temperature_Down_limit] < 5)
  541. savedata[29] = 5;
  542. else if ( Reg_sta[Temperature_Down_limit] >20)
  543. savedata[29] = 20;
  544. else savedata[29] = Reg_sta[Temperature_Down_limit];
  545. MemWriteByte(savedata, sizeof(savedata));
  546. }
  547. break;
  548. case Temperature_Up_limit:
  549. if(Reg_sta[Temperature_Up_limit]>=25 && Reg_sta[Temperature_Up_limit] <=40)
  550. {
  551. if(Reg_sta[Temperature_Down_limit] < 5)
  552. savedata[29] = 5;
  553. else if ( Reg_sta[Temperature_Down_limit] >20)
  554. savedata[29] = 20;
  555. else savedata[29] = Reg_sta[Temperature_Down_limit];
  556. MemWriteByte(savedata, sizeof(savedata));
  557. if(Reg_sta[Temperature_Up_limit] < 25)
  558. savedata[30] = 25;
  559. else if ( Reg_sta[Temperature_Up_limit] >40)
  560. savedata[30] = 40;
  561. else savedata[30] = Reg_sta[Temperature_Up_limit];
  562. MemWriteByte(savedata, sizeof(savedata));
  563. }
  564. break;
  565. case 0x65:
  566. // savedata[10] = Reg_sta[0x65];
  567. // MemWriteByte(savedata, sizeof(savedata));
  568. break;
  569. default:
  570. break;
  571. }
  572. }