key.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. #include "key.h"
  2. #include "main.h"
  3. extern bool refresh;
  4. extern bool BT_CONN;
  5. extern Menu_table menu;
  6. bool sent1_key = false;
  7. bool sent2_key = false;
  8. bool sent3_key = false;
  9. bool sent4_key = false;
  10. bool close_flagw=false; //循环关锁
  11. bool open_flagw=false; //循环开锁
  12. bool sealFlag = false; //施解封确认标志位(false:施封,true:解封)
  13. uint8_t keyvalue[4]={0};
  14. struct keys key[4]={0,0,0,0};
  15. extern unsigned char SN1[];
  16. extern char _BT_CONN[];
  17. extern char Connected[];
  18. uint8_t KEY_1_Scan(void)
  19. {
  20. static uint8_t key_state = 1;
  21. static uint8_t last_key_state = 1;
  22. static uint32_t debounce_time = 0;
  23. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3);
  24. if (key_state != last_key_state) // 检测按键状态变化
  25. {
  26. last_key_state = key_state;
  27. debounce_time = HAL_GetTick(); // 记录当前时间
  28. }
  29. else
  30. {
  31. if (HAL_GetTick() - debounce_time > 50) // 去抖时间
  32. {
  33. if (key_state == GPIO_PIN_RESET) // 按键按下
  34. {
  35. if(!sent1_key)
  36. {
  37. switch(menu.current)
  38. {
  39. case 1:
  40. case 4:
  41. case 7:
  42. if(menu.up==1)
  43. {
  44. menu.up=0;
  45. menu.next=1;
  46. if(menu.current==7)
  47. {
  48. #ifdef keyDebuginfo
  49. #if keyDebuginfo ==1
  50. printf("已选择解封,解封标志:%s\r\n",sealFlag ? "true" : "false");
  51. #endif
  52. #endif
  53. }
  54. refresh=true;
  55. }
  56. else
  57. {
  58. menu.up+=1;
  59. menu.next-=1;
  60. if(menu.current==7)
  61. {
  62. #ifdef keyDebuginfo
  63. #if keyDebuginfo ==1
  64. printf("已选择施封,解封标志:%s\r\n",sealFlag ? "true" : "false");
  65. #endif
  66. #endif
  67. }
  68. refresh=true;
  69. }
  70. break;
  71. case 2:
  72. case 5:
  73. if(menu.up==4)
  74. {
  75. menu.up=1;
  76. menu.next=3;
  77. refresh=true;
  78. }
  79. else
  80. {
  81. menu.up+=1;
  82. menu.next-=1;
  83. refresh=true;
  84. }
  85. break;
  86. case 3:
  87. //选择蓝牙
  88. break;
  89. }
  90. #ifdef keyDebuginfo
  91. #if keyDebuginfo ==1
  92. printf("******k1 pressed\t%d %d %d %d %d\n",menu.current,menu.up,menu.next,menu.enter,menu.back);
  93. #endif
  94. #endif
  95. sent1_key = true;
  96. }
  97. return 1;
  98. }
  99. else // 按键释放
  100. {
  101. sent1_key = false;
  102. return 0;
  103. }
  104. }
  105. }
  106. return 0;
  107. }
  108. uint8_t KEY_2_Scan(void)
  109. {
  110. static uint8_t key_state = 0;
  111. static uint8_t last_key_state = 0;
  112. static uint32_t debounce_time = 0;
  113. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4);
  114. if (key_state != last_key_state) // 检测按键状态变化
  115. {
  116. last_key_state = key_state;
  117. debounce_time = HAL_GetTick(); // 记录当前时间
  118. }
  119. else
  120. {
  121. if (HAL_GetTick() - debounce_time > 50) // 去抖时间大于50ms
  122. {
  123. if (key_state == GPIO_PIN_RESET) // 按键按下
  124. {
  125. if (!sent2_key)
  126. {
  127. switch (menu.current)
  128. {
  129. case 1:
  130. case 4:
  131. case 7:
  132. if (menu.up == 0)
  133. {
  134. menu.up = 1;
  135. menu.next = 0;
  136. if(menu.current==7)
  137. {
  138. #ifdef keyDebuginfo
  139. #if keyDebuginfo ==1
  140. printf("已选择施封,解封标志:%s\r\n",sealFlag ? "true" : "false");
  141. #endif
  142. #endif
  143. }
  144. refresh = true;
  145. }
  146. else
  147. {
  148. menu.up -= 1;
  149. menu.next += 1;
  150. if(menu.current==7)
  151. {
  152. #ifdef keyDebuginfo
  153. #if keyDebuginfo ==1
  154. printf("已选择解封,解封标志:%s\r\n",sealFlag ? "true" : "false");
  155. #endif
  156. #endif
  157. }
  158. refresh = true;
  159. }
  160. break;
  161. case 2:
  162. case 5:
  163. if (menu.up == 1)
  164. {
  165. menu.up = 4;
  166. menu.next = 0;
  167. refresh = true;
  168. }
  169. else
  170. {
  171. menu.up -= 1;
  172. menu.next += 1;
  173. refresh = true;
  174. }
  175. break;
  176. case 3:
  177. //选择蓝牙
  178. break;
  179. }
  180. #ifdef keyDebuginfo
  181. #if keyDebuginfo ==1
  182. printf("******k2 pressed\t%d %d %d %d %d\n", menu.current, menu.up, menu.next, menu.enter, menu.back);
  183. #endif
  184. #endif
  185. sent2_key = true;
  186. }
  187. return 1;
  188. }
  189. else // 按键释放
  190. {
  191. sent2_key = false;
  192. return 0;
  193. }
  194. }
  195. }
  196. return 0;
  197. }
  198. uint8_t KEY_3_Scan(void)
  199. {
  200. static uint8_t key_state = 0;
  201. static uint8_t last_key_state = 0;
  202. static uint32_t debounce_time = 0;
  203. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5);
  204. if (key_state != last_key_state) // 检测按键状态变化
  205. {
  206. last_key_state = key_state;
  207. debounce_time = HAL_GetTick(); // 记录当前时间
  208. }
  209. else
  210. {
  211. if (HAL_GetTick() - debounce_time > 50) // 去抖时间大于50ms
  212. {
  213. if (key_state == GPIO_PIN_RESET) // 按键按下
  214. {
  215. if (!sent3_key) {
  216. switch (menu.current) {
  217. case 0:
  218. menu.current += 1;
  219. menu.up += 1;
  220. menu.enter += 1;
  221. refresh = true;
  222. break;
  223. case 1:
  224. if (menu.up == 0 && menu.next == 1) {
  225. menu.current += 3;
  226. menu.up = 1;
  227. menu.next = 0;
  228. menu.enter += 1;
  229. refresh = true;
  230. } else {
  231. menu.current += 1;
  232. menu.up = 4;
  233. menu.next = 0;
  234. menu.enter += 1;
  235. refresh = true;
  236. }
  237. break;
  238. case 2:
  239. menu.current += 1;
  240. menu.enter += 1;
  241. refresh = true;
  242. break;
  243. case 3:
  244. // 选择蓝牙
  245. menu.enter=4;
  246. if(menu.enter==4)
  247. {
  248. BT_CONN = true;
  249. }
  250. break;
  251. case 4:
  252. if (menu.next == 1) {
  253. menu.current += 2;
  254. menu.enter += 1;
  255. refresh = true;
  256. } else {
  257. menu.current += 1;
  258. menu.up = 4;
  259. menu.next = 0;
  260. menu.enter += 1;
  261. refresh = true;
  262. }
  263. break;
  264. case 5:
  265. menu.current = 7;
  266. menu.up = 1;
  267. menu.next = 0;
  268. menu.enter += 1;
  269. refresh = true;
  270. break;
  271. case 7:
  272. if(menu.sn==SN1)
  273. {
  274. menu.current+=1;
  275. refresh = true;
  276. if(menu.up==1)
  277. {
  278. //sealFlag=false;
  279. sendCmd_BT("AT+CONN=101000000003\r\n","+CONNECTED:0,101000000003",1,1);
  280. close_flagw=true;
  281. }
  282. else
  283. {
  284. sendCmd_BT("AT+CONN=101000000003\r\n","+CONNECTED:0,101000000003",1,1);
  285. open_flagw=true;
  286. // sealFlag=true;
  287. }
  288. }
  289. else
  290. {
  291. menu.current=7;
  292. refresh = true;
  293. }
  294. break;
  295. }
  296. #ifdef keyDebuginfo
  297. #if keyDebuginfo ==1
  298. printf("******k3 pressed\t%d %d %d %d %d\n", menu.current, menu.up, menu.next, menu.enter, menu.back);
  299. #endif
  300. #endif
  301. sent3_key = true;
  302. }
  303. return 1;
  304. }
  305. else // 按键释放
  306. {
  307. sent3_key = false;
  308. return 0;
  309. }
  310. }
  311. }
  312. return 0;
  313. }
  314. uint8_t KEY_4_Scan(void)
  315. {
  316. static uint8_t key_state = 0;
  317. static uint8_t last_key_state = 0;
  318. static uint32_t debounce_time = 0;
  319. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6);
  320. if (key_state != last_key_state) // 检测按键状态变化
  321. {
  322. last_key_state = key_state;
  323. debounce_time = HAL_GetTick(); // 记录当前时间
  324. }
  325. else
  326. {
  327. if (HAL_GetTick() - debounce_time > 50) // 去抖时间大于50ms
  328. {
  329. if (key_state == GPIO_PIN_RESET) // 按键按下
  330. {
  331. if (!sent4_key) {
  332. switch (menu.current) {
  333. case 1:
  334. menu.current = 0;
  335. menu.up = 0;
  336. menu.next = 0;
  337. menu.enter = 0;
  338. refresh = true;
  339. break;
  340. case 2:
  341. menu.current = 1;
  342. menu.up = 1;
  343. menu.next = 0;
  344. menu.enter = 1;
  345. menu.back = 0;
  346. refresh = true;
  347. break;
  348. case 3:
  349. menu.current = 2;
  350. menu.up = 4;
  351. menu.next = 0;
  352. menu.enter = 2;
  353. menu.back = 1;
  354. refresh = true;
  355. break;
  356. case 4:
  357. menu.current = 1;
  358. menu.up = 1;
  359. menu.next = 0;
  360. menu.enter = 1;
  361. menu.back = 0;
  362. refresh = true;
  363. break;
  364. case 5:
  365. menu.current = 4;
  366. menu.up = 1;
  367. menu.next = 0;
  368. menu.back = 1;
  369. refresh = true;
  370. break;
  371. case 6:
  372. menu.current = 4;
  373. menu.up = 1;
  374. menu.next = 0;
  375. menu.back = 1;
  376. refresh = true;
  377. break;
  378. case 7:
  379. menu.current = 5;
  380. menu.up = 4;
  381. menu.next = 0;
  382. menu.back = 1;
  383. refresh = true;
  384. break;
  385. case 8:
  386. refresh = true;
  387. break;
  388. }
  389. #ifdef keyDebuginfo
  390. #if keyDebuginfo ==1
  391. printf("******k4 pressed\t%d %d %d %d %d\n", menu.current, menu.up, menu.next, menu.enter, menu.back);
  392. #endif
  393. #endif
  394. sent4_key = true;
  395. }
  396. return 1;
  397. }
  398. else // 按键释放
  399. {
  400. sent4_key = false;
  401. return 0;
  402. }
  403. }
  404. }
  405. return 0;
  406. }
  407. void updatekeystate(void)
  408. {
  409. keyvalue[0]=KEY_1_Scan();
  410. keyvalue[1]=KEY_2_Scan();
  411. keyvalue[2]=KEY_3_Scan();
  412. keyvalue[3]=KEY_4_Scan();
  413. }