KeyScan.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. /* -------------------------- (C) COPYRIGHT 2022 Fortiortech ShenZhen ---------------------------*/
  2. /**
  3. * @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen
  4. * @file xxx.c
  5. * @author Fortiortech Appliction Team
  6. * @since Create:2022-07-14
  7. * @date Last modify:2022-07-14
  8. * @note Last modify author is Leo.li
  9. * @brief
  10. */
  11. /* Includes -------------------------------------------------------------------------------------*/
  12. #include <FU68xx_5.h>
  13. #include <Myproject.h>
  14. uint8 SW1_Flag = 0;
  15. uint8 SW2_Flag = 0;
  16. uint8 SW2_Flag2 = 0;
  17. uint8 SW3_Flag = 0;
  18. uint8 Flag_Key1Value = 0; //档位变换顺序
  19. uint8 Flag_Key2Value = 0;
  20. /* Private variables ----------------------------------------------------------------------------*/
  21. KeyScanParam_TypeDef xdata KS;
  22. /* -------------------------------------------------------------------------------------------------
  23. Function Name : void KeyInit(void)
  24. Description : 按键参数初始化
  25. Input : 无
  26. Output : 无
  27. -------------------------------------------------------------------------------------------------*/
  28. void KeyInit(void)
  29. {
  30. uint8 i = 0;
  31. uint8 Check_code = 0; //写入数值为Write_Lenght,最后一位为校验位0xFF
  32. uint16 ReadInfor_Addr = 0; //读取信息地址
  33. KS.Key1Value = 0x01;
  34. KS.Key2Value = 0x40;
  35. KS.Key3Value = 0x00;
  36. KS.KeyValuetotal = KS.Key1Value ^ KS.Key2Value ^ KS.Key3Value;
  37. /*----- 获取写入首地址 -----*/
  38. // FlashData.WriteAddress = GetWrite_Black_Addr(START_WriteADDRESS, Write_Lenght);
  39. if (FlashData.WriteAddress > START_WriteADDRESS)
  40. {
  41. /*----- 获取读取数值首地址 -----*/
  42. FlashData.ReadAddress = FlashData.WriteAddress - Write_Lenght;
  43. while ((FlashData.WriteAddress > START_WriteADDRESS) && (Check_code != Verify_Ture))
  44. {
  45. ReadInfor_Addr = FlashData.ReadAddress + Verify_Bit;
  46. Check_code = *(uint8 code *)(ReadInfor_Addr);
  47. if (Check_code == Verify_Ture)
  48. {
  49. /*----- 读取数值到FlashData.ReadValue -----*/
  50. ReadFromFlash(FlashData.ReadAddress, Write_Lenght, FlashData.ReadValue);
  51. KS.KeyValuetotal = FlashData.ReadValue[0]; //有数值直接读回上次保存的数值
  52. }
  53. else
  54. {
  55. FlashData.ReadAddress = FlashData.ReadAddress - Write_Lenght;
  56. }
  57. }
  58. }
  59. else
  60. {
  61. /*----- 获取读取数值首地址 -----*/
  62. FlashData.ReadAddress = FlashData.WriteAddress;
  63. }
  64. /*Flash写一个扇区 2/3 区域后开始尝试擦写*/
  65. if (FlashData.WriteAddress >= START_WriteADDRESS + 0x060) //
  66. {
  67. for (i = 0; i < Write_Lenght; i++)
  68. {
  69. FlashData.WriteValue[i] = FlashData.ReadValue[i];
  70. }
  71. FlashData.Flag_FlashErase = 1;
  72. }
  73. KS.Key1Value = KS.KeyValuetotal & 0x0F;
  74. KS.Key2Value = KS.KeyValuetotal & 0x70;
  75. KS.Key3Value = 0x00;
  76. KS.OldKeyValuetotal = 0;
  77. KS.ChangeKeyFlg = 0;
  78. KS.Key1PressCnt = 0;
  79. KS.TwoCarrierCnt=0;
  80. User.ScrOnZeroFlag=0;
  81. User.ScrOnZeroCnt=0;
  82. }
  83. /* -------------------------------------------------------------------------------------------------
  84. Function Name : uint8 KeyValue(void)
  85. Description : 功能函数,获取按键值,选择返回键位值还是管脚电平KeyValue
  86. Input : 无
  87. Output : 键位值或者管脚电平KeyValue
  88. -------------------------------------------------------------------------------------------------*/
  89. int KeyValue(void)
  90. {
  91. /* SW1 Scan */
  92. if ((KS.KeyADCValue > 10922) && (KS.KeyADCValue < 19000))
  93. {
  94. if (SW1_Flag == 0)
  95. {
  96. KS.Key1PressCnt ++;
  97. if (KS.Key1PressCnt >= KeyFilterTime)
  98. {
  99. KS.Key1PressCnt = KeyFilterTime;
  100. SW1_Flag = 1;
  101. SW2_Flag = 0;
  102. SW3_Flag = 0;
  103. if ((KS.Key1Value < 0x08) && (Flag_Key1Value == 0))
  104. {
  105. KS.Key1Value = KS.Key1Value << 1;
  106. }
  107. else if ((KS.Key1Value > 0x01) && (Flag_Key1Value == 1))
  108. {
  109. KS.Key1Value = KS.Key1Value >> 1;
  110. }
  111. else if (KS.Key1Value == 0x08)
  112. {
  113. Flag_Key1Value = 1;
  114. KS.Key1Value = KS.Key1Value >> 1;
  115. }
  116. else if (KS.Key1Value == 0x01)
  117. {
  118. Flag_Key1Value = 0;
  119. KS.Key1Value = KS.Key1Value << 1;
  120. }
  121. else
  122. {
  123. Flag_Key1Value = 0;
  124. KS.Key1Value = 0x01;
  125. }
  126. }
  127. }
  128. else if (SW1_Flag == 1)
  129. {
  130. KS.Key1Value = KS.Key1Value ;
  131. }
  132. else
  133. { SW1_Flag = 0; }
  134. }
  135. /* SW2 Scan */
  136. else if ((KS.KeyADCValue >= 0) && (KS.KeyADCValue < 10922))
  137. {
  138. if (SW2_Flag == 0)
  139. {
  140. KS.Key2PressCnt ++;
  141. if (KS.Key2PressCnt >= KeyFilterTime)
  142. {
  143. KS.Key2PressCnt = KeyFilterTime;
  144. SW2_Flag = 1;
  145. SW1_Flag = 0;
  146. SW3_Flag = 0;
  147. if ((KS.Key2Value < 0x40) && (Flag_Key2Value == 0))
  148. {
  149. KS.Key2Value = KS.Key2Value << 1;
  150. }
  151. else if ((KS.Key2Value > 0x10) && (Flag_Key2Value == 1))
  152. {
  153. KS.Key2Value = KS.Key2Value >> 1;
  154. }
  155. else if (KS.Key2Value == 0x40)
  156. {
  157. Flag_Key2Value = 1;
  158. KS.Key2Value = KS.Key2Value >> 1;
  159. }
  160. else if (KS.Key2Value == 0x10)
  161. {
  162. Flag_Key2Value = 0;
  163. KS.Key2Value = KS.Key2Value << 1;
  164. }
  165. else
  166. {
  167. Flag_Key2Value = 0;
  168. KS.Key2Value = 0x20;
  169. }
  170. }
  171. }
  172. else if (SW2_Flag == 1)
  173. {
  174. KS.Key2Value = KS.Key2Value ;
  175. }
  176. else
  177. { SW2_Flag = 0; }
  178. }
  179. /* SW3 Scan */
  180. else if ((KS.KeyADCValue > 19000) && (KS.KeyADCValue < 25000))
  181. {
  182. KS.Key3releaseCnt = 0;
  183. if (KS.Key3PressCnt < KeyFilterTime * 2 + 10)
  184. {
  185. KS.Key3PressCnt++;
  186. }
  187. if (SW3_Flag == 0)
  188. {
  189. if (KS.Key3PressCnt >= KeyFilterTime * 2)
  190. {
  191. KS.Key3PressCnt = KeyFilterTime * 2;
  192. SW3_Flag = 1;
  193. SW1_Flag = 0;
  194. SW2_Flag = 0;
  195. KS.Key3Value = 0x80;
  196. }
  197. }
  198. else if (SW3_Flag == 1)
  199. {
  200. KS.Key3Value = KS.Key3Value ;
  201. }
  202. }
  203. else
  204. {
  205. KS.Key2PressCnt --;
  206. KS.Key1PressCnt --;
  207. KS.Key3PressCnt = 0;
  208. if (KS.Key3releaseCnt < 100)
  209. { KS.Key3releaseCnt++; }
  210. if ((KS.Key2PressCnt <= 0) && (KS.Key1PressCnt <= 0) && (KS.Key3releaseCnt >= 80))
  211. {
  212. SW3_Flag = 0;
  213. SW1_Flag = 0;
  214. SW2_Flag = 0;
  215. }
  216. if (KS.Key2PressCnt <= 0)
  217. {
  218. KS.Key2PressCnt = 1;
  219. }
  220. if (KS.Key1PressCnt <= 0)
  221. {
  222. KS.Key1PressCnt = 1;
  223. }
  224. if (KS.Key3releaseCnt >= 80)
  225. {
  226. KS.Key3Value = 0x00;
  227. }
  228. }
  229. return (KS.Key1Value ^ KS.Key2Value ^ KS.Key3Value);
  230. }
  231. /* -------------------------------------------------------------------------------------------------
  232. Function Name : uint8 KeyValue(void)
  233. Description : 功能函数,获取按键值,选择返回键位值还是管脚电平KeyValue
  234. Input : 无
  235. Output : 键位值或者管脚电平KeyValue
  236. -------------------------------------------------------------------------------------------------*/
  237. int KeyValue1(void)
  238. {
  239. /* SW1 温度 */
  240. if ((KS.KeyADCValue > 14000) && (KS.KeyADCValue < 18000))
  241. {
  242. if (SW1_Flag == 0)
  243. {
  244. KS.Key1PressCnt ++;
  245. if (KS.Key1PressCnt >= KeyFilterTime)
  246. {
  247. KS.Key1PressCnt = KeyFilterTime;
  248. SW1_Flag = 1;
  249. SW2_Flag = 0;
  250. SW3_Flag = 0;
  251. SW2_Flag2 = 0;
  252. if ((KS.Key1Value < 0x08) && (Flag_Key1Value == 0))
  253. {
  254. KS.Key1Value = KS.Key1Value << 1;
  255. }
  256. else if ((KS.Key1Value > 0x01) && (Flag_Key1Value == 1))
  257. {
  258. KS.Key1Value = KS.Key1Value >> 1;
  259. }
  260. else if (KS.Key1Value == 0x08)
  261. {
  262. Flag_Key1Value = 1;
  263. KS.Key1Value = KS.Key1Value >> 1;
  264. }
  265. else if (KS.Key1Value == 0x01)
  266. {
  267. Flag_Key1Value = 0;
  268. KS.Key1Value = KS.Key1Value << 1;
  269. }
  270. else
  271. {
  272. Flag_Key1Value = 0;
  273. KS.Key1Value = 0x01;
  274. }
  275. }
  276. }
  277. else if (SW1_Flag == 1)
  278. {
  279. KS.Key1Value = KS.Key1Value ;
  280. }
  281. else
  282. { SW1_Flag = 0; }
  283. }
  284. /* SW2 风速2 */
  285. else if ((KS.KeyADCValue > 20000) && (KS.KeyADCValue < 26000))
  286. {
  287. if (SW2_Flag == 0)
  288. {
  289. KS.Key2PressCnt ++;
  290. if (KS.Key2PressCnt >= KeyFilterTime)
  291. {
  292. KS.Key2PressCnt = KeyFilterTime;
  293. SW2_Flag = 1;
  294. SW1_Flag = 0;
  295. SW3_Flag = 0;
  296. SW2_Flag2 = 0;
  297. KS.Key2Value = 0x20;
  298. }
  299. }
  300. else if (SW2_Flag == 1)
  301. {
  302. KS.Key2Value = KS.Key2Value ;
  303. }
  304. else
  305. { SW2_Flag = 0; }
  306. }
  307. else
  308. {
  309. if (KS.Key2PressCnt > 0)
  310. {
  311. KS.Key2PressCnt --;
  312. }
  313. if (KS.Key1PressCnt > 0)
  314. {
  315. KS.Key1PressCnt --;
  316. }
  317. KS.Key3PressCnt = 0;
  318. if (KS.Key3releaseCnt < 100)
  319. { KS.Key3releaseCnt++; }
  320. if ((KS.Key2PressCnt <= 0) && (KS.Key1PressCnt <= 0) && (KS.Key3releaseCnt >= 80))
  321. {
  322. SW3_Flag = 0;
  323. SW1_Flag = 0;
  324. SW2_Flag = 0;
  325. }
  326. if (KS.Key3releaseCnt >= 80)
  327. {
  328. KS.Key3Value = 0x00;
  329. }
  330. /* SW2 风速1 */
  331. if (KS.KeyADCValue > 30000)
  332. {
  333. if (SW2_Flag2 == 0)
  334. {
  335. KS.Key2PressCnt2++;
  336. if (KS.Key2PressCnt2 >= KeyFilterTime)
  337. {
  338. KS.Key2PressCnt2 = KeyFilterTime;
  339. SW2_Flag2 = 1;
  340. SW2_Flag = 0;
  341. SW1_Flag = 0;
  342. SW3_Flag = 0;
  343. KS.Key2Value = 0x10;
  344. }
  345. }
  346. else if (SW2_Flag2 == 1)
  347. {
  348. KS.Key2Value = KS.Key2Value ;
  349. }
  350. else
  351. { SW2_Flag2 = 0; }
  352. }
  353. }
  354. return (KS.Key1Value ^ KS.Key2Value ^ KS.Key3Value);
  355. }
  356. /* -------------------------------------------------------------------------------------------------
  357. Function Name : void KeyScan(void)
  358. Description : 功能函数,按键扫描,按键触发传递出按键命令
  359. Input : 无
  360. Output : 无
  361. -------------------------------------------------------------------------------------------------*/
  362. void KeyScan(void)
  363. {
  364. KS.OldKeyValuetotal = KS.KeyValuetotal;
  365. #if (SwitchMode == HighVoltageSwitch)
  366. {
  367. KS.KeyValuetotal = KeyValue1();
  368. }
  369. #elif (SwitchMode == LowVoltageSwitch)
  370. {
  371. KS.KeyValuetotal = KeyValue();
  372. }
  373. #endif
  374. if (KS.OldKeyValuetotal != KS.KeyValuetotal)
  375. {
  376. if ((mcState == mcRun))
  377. {
  378. KS.ChangeKeyFlg = 1;
  379. }
  380. }
  381. }