Dwin.c 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. #include "Dwin.h"
  2. #include "usart.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "CollectMaster485.h"
  6. #include "TerminalSlave485.h"
  7. #include "ScreenMaster485.h"
  8. #include "Elec_Seal.h"
  9. #include "main.h"
  10. #include "KeySlave485.h"
  11. #include "cmsis_os.h"
  12. Run_mode_key Run_mode_key_info;
  13. uint8_t Lcd_sleep_flag =2;//1休眠状态 3 唤醒状态 2执行唤醒
  14. uint8_t DateDwin[8];
  15. uint8_t time_Set_Dwin[14]={0x5A, 0xA5, 0x0B ,0x82 ,0x00 ,0x9C ,0x5A ,0xA5 ,0x13 ,0x05 ,0x1B ,0x0b ,0x1b ,0x19};
  16. #define UI_VERSION_00 (0X00)
  17. #define UI_VERSION_2B (0X2B)
  18. static uint8_t ui_version = UI_VERSION_00;
  19. SemaphoreHandle_t xSemaphore = NULL;
  20. int Init_Dwin_Signal(void)
  21. {
  22. xSemaphore = xSemaphoreCreateMutex();
  23. if(xSemaphore==NULL)
  24. {
  25. return 0;
  26. }
  27. usart3_rx_flag=1;
  28. return 1;
  29. }
  30. /******************************************************************************
  31. 写8位数据
  32. 输入:写入地址:addr16, 写入数据:data16
  33. 输出返回:无
  34. 5A A5 04 83 00 10 04
  35. 将会收到: 年 月 日 星期;时,分,秒.
  36. 5A A5 0C 83 00 10 04 15 01 06 03 14 28 11 00
  37. 5A A5 0C 83 00 10 04 15 01 07 04 15 1C 30 00
  38. ******************************************************************************/
  39. void GetDateFromDwin(void)
  40. {
  41. uint8_t TxDwinDataBuf[7];
  42. TxDwinDataBuf[0]=STARTSIGN_H;
  43. TxDwinDataBuf[1]=STARTSIGN_L;
  44. TxDwinDataBuf[2]=0x04;
  45. TxDwinDataBuf[3]=0x83;
  46. TxDwinDataBuf[4]=0x00;
  47. TxDwinDataBuf[5]=0x10;
  48. TxDwinDataBuf[6]=0x04;
  49. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 5) == pdFALSE)
  50. {
  51. return;
  52. }
  53. ScreenMaster485_Send_Data(TxDwinDataBuf,7);
  54. if(xSemaphore)
  55. xSemaphoreGive( xSemaphore );
  56. //HAL_Delay(20);//
  57. }
  58. /******************************************************************************
  59. 写8位数据
  60. 输入:写入地址:addr16, 写入数据:data16
  61. 输出返回:无
  62. 5A A5 05 82 10 01 00 03
  63. ******************************************************************************/
  64. void WrDwinCmd8(uint16_t addr16,uint8_t data8)
  65. {
  66. uint8_t TxDwinDataBuf[7];
  67. TxDwinDataBuf[0]=STARTSIGN_H;
  68. TxDwinDataBuf[1]=STARTSIGN_L;
  69. TxDwinDataBuf[2]=0x04;
  70. TxDwinDataBuf[3]=0x82;
  71. TxDwinDataBuf[4]=addr16>>8;
  72. TxDwinDataBuf[5]=addr16;
  73. TxDwinDataBuf[6]=data8;
  74. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 5) == pdFALSE)
  75. {
  76. return;
  77. }
  78. ScreenMaster485_Send_Data(TxDwinDataBuf,7);
  79. if(xSemaphore)
  80. xSemaphoreGive( xSemaphore );
  81. // HAL_Delay(10);//
  82. }
  83. /******************************************************************************
  84. 写16位数据
  85. 输入:写入地址:addr16, 写入数据:data16
  86. 输出返回:无
  87. 5A A5 05 82 10 01 00 03
  88. ******************************************************************************/
  89. void WrDwinCmd16(uint16_t addr16,uint16_t data16)
  90. {
  91. uint8_t TxDwinDataBuf[8];
  92. TxDwinDataBuf[0]=STARTSIGN_H;
  93. TxDwinDataBuf[1]=STARTSIGN_L;
  94. TxDwinDataBuf[2]=0x05; //数据长度+命令+地址+数据
  95. TxDwinDataBuf[3]=0x82;
  96. TxDwinDataBuf[4]=addr16>>8;
  97. TxDwinDataBuf[5]=addr16;
  98. TxDwinDataBuf[6]=data16>>8;
  99. TxDwinDataBuf[7]=data16;
  100. //taskENTER_CRITICAL();
  101. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 500) == pdFALSE)
  102. {
  103. return;
  104. }
  105. ScreenMaster485_Send_Data(TxDwinDataBuf,8);
  106. if(xSemaphore)
  107. xSemaphoreGive( xSemaphore );
  108. //taskEXIT_CRITICAL();
  109. //osDelay(10);//HAL_Delay(10);//
  110. }
  111. /******************************************************************************
  112. 发送命令
  113. 写32位数据
  114. 输入:写入地址:addr16, 写入数据:data32
  115. 输出返回:无
  116. 5A A5 07 82 00 84 5A 01 00 03
  117. ******************************************************************************/
  118. void WrDwinCmd32(uint16_t addr16,uint32_t data32)
  119. {
  120. uint8_t TxDwinDataBuf[10];
  121. TxDwinDataBuf[0]=STARTSIGN_H;
  122. TxDwinDataBuf[1]=STARTSIGN_L;
  123. TxDwinDataBuf[2]=0x07; //数据长度+命令+地址+数据
  124. TxDwinDataBuf[3]=0x82;
  125. TxDwinDataBuf[4]=addr16>>8;
  126. TxDwinDataBuf[5]=addr16;
  127. TxDwinDataBuf[6]=data32>>24;
  128. TxDwinDataBuf[7]=data32>>16;
  129. TxDwinDataBuf[8]=data32>>8;
  130. TxDwinDataBuf[9]=data32;
  131. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 500) == pdFALSE)
  132. {
  133. return;
  134. }
  135. ScreenMaster485_Send_Data(TxDwinDataBuf,10);
  136. if(xSemaphore)
  137. xSemaphoreGive( xSemaphore );
  138. //osDelay(15);//HAL_Delay(15);//
  139. }
  140. /******************************************************************************
  141. 发送命令
  142. 写16位数据
  143. 输入:写入地址:addr16, 写入数据:*buf
  144. 输出返回:无
  145. ******************************************************************************/
  146. void WrDwinBuf16(uint16_t addr16,uint16_t *buf)
  147. {
  148. uint8_t TxDwinDataBuf[8];
  149. TxDwinDataBuf[0]=STARTSIGN_H;
  150. TxDwinDataBuf[1]=STARTSIGN_L;
  151. TxDwinDataBuf[2]=0x05;
  152. TxDwinDataBuf[3]=0x82;
  153. TxDwinDataBuf[4]=addr16>>8;
  154. TxDwinDataBuf[5]=addr16;
  155. TxDwinDataBuf[6]=(*buf)>>8;
  156. TxDwinDataBuf[7]=*buf;
  157. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 150) == pdFALSE)
  158. {
  159. return;
  160. }
  161. ScreenMaster485_Send_Data(TxDwinDataBuf,8);
  162. if(xSemaphore)
  163. xSemaphoreGive( xSemaphore );
  164. //HAL_Delay(10);//
  165. }
  166. /******************************************************************************
  167. 发送命令
  168. 写16位数据
  169. 输入:写入地址:addr16, 写入数据:*buf
  170. 输出返回:无
  171. ******************************************************************************/
  172. void WrDwinBuf32(uint16_t addr16,uint16_t *buf)
  173. {
  174. uint8_t TxDwinDataBuf[10];
  175. TxDwinDataBuf[0]=STARTSIGN_H;
  176. TxDwinDataBuf[1]=STARTSIGN_L;
  177. TxDwinDataBuf[2]=0x07;
  178. TxDwinDataBuf[3]=0x82;
  179. TxDwinDataBuf[4]=addr16>>8;
  180. TxDwinDataBuf[5]=addr16;
  181. TxDwinDataBuf[6]=(*buf)>>8;
  182. TxDwinDataBuf[7]=*buf++;
  183. TxDwinDataBuf[8]=(*buf)>>8;
  184. TxDwinDataBuf[9]=*buf;
  185. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 5) == pdFALSE)
  186. {
  187. return;
  188. }
  189. ScreenMaster485_Send_Data(TxDwinDataBuf,10);
  190. if(xSemaphore)
  191. xSemaphoreGive( xSemaphore );
  192. // HAL_Delay(10);//
  193. }
  194. /******************************************************************************
  195. 发送命令
  196. 写N个数据(字)
  197. 输入:写入地址:addr16, 写入数据:*buf n: 发送的地址个数
  198. 输出返回:无
  199. ******************************************************************************/
  200. //void WrDwinBuf(uint16_t addr16,uint16_t *buf,uint8_t n)
  201. //{
  202. // uint8_t i,num;
  203. // uint8_t TxDwinDataBuf[100];
  204. // num = (n<<1);
  205. // TxDwinDataBuf[0]=STARTSIGN_H;
  206. // TxDwinDataBuf[1]=STARTSIGN_L;
  207. // TxDwinDataBuf[2]=num+3;
  208. // TxDwinDataBuf[3]=0x82;
  209. // TxDwinDataBuf[4]=addr16>>8;
  210. // TxDwinDataBuf[5]=addr16;
  211. // for(i=0;i<num;i+=2)
  212. // {
  213. // TxDwinDataBuf[i+6]=(*buf)>>8;
  214. // TxDwinDataBuf[i+7]=*buf++;
  215. // }
  216. // ScreenMaster485_Send_Data(TxDwinDataBuf,6+num);
  217. // HAL_Delay(20);//
  218. //
  219. //}
  220. uint8_t TxDwinDataBuf[512];
  221. void WrDwinBuf(uint16_t addr16,uint16_t *buf,uint16_t n,uint8_t LSB_Mode)
  222. {
  223. uint16_t i,num;
  224. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 200) == pdFALSE)
  225. {
  226. return;
  227. }
  228. num = (n<<1);
  229. if(num>255-7)
  230. {
  231. num = 255-7;//防止溢出错误
  232. }
  233. TxDwinDataBuf[0]=STARTSIGN_H;
  234. TxDwinDataBuf[1]=STARTSIGN_L;
  235. TxDwinDataBuf[2]=num+3;
  236. TxDwinDataBuf[3]=0x82;
  237. TxDwinDataBuf[4]=addr16>>8;
  238. TxDwinDataBuf[5]=addr16;
  239. for(i=0;i<num;i+=2)
  240. {
  241. if(LSB_Mode==1)//先发送低位字节
  242. {
  243. TxDwinDataBuf[i+7]=(*buf)>>8;
  244. TxDwinDataBuf[i+6]=*buf++;
  245. }
  246. else //先发送高位字节
  247. {//李伟修改 20210531 迪文屏的高低存储跟常规的是反过来的
  248. TxDwinDataBuf[i+6]=(*buf)>>8;
  249. TxDwinDataBuf[i+7]=*buf++;
  250. }
  251. }
  252. ScreenMaster485_Send_Data(TxDwinDataBuf,6+num);
  253. // osDelay(10);
  254. #if 0
  255. if(num<10)
  256. {
  257. HAL_Delay(10);
  258. }
  259. else
  260. {
  261. //HAL_Delay(num);
  262. ;//HAL_Delay(20);
  263. osDelay(20);
  264. }
  265. #endif
  266. if(xSemaphore)
  267. xSemaphoreGive( xSemaphore );
  268. }
  269. /******************************************************************************
  270. 发送命令
  271. 写N个数据(字)
  272. 输入:写入地址:addr16, 写入数据:*buf n: 发送的地址个数
  273. 输出返回:无
  274. ******************************************************************************/
  275. void WrDwinBuf_u8(uint16_t addr16,uint8_t *buf,uint8_t n)
  276. {
  277. uint8_t i,num;
  278. uint8_t TxDwinDataBuf[100];
  279. num = (n);
  280. TxDwinDataBuf[0]=STARTSIGN_H;
  281. TxDwinDataBuf[1]=STARTSIGN_L;
  282. TxDwinDataBuf[2]=num+3;
  283. TxDwinDataBuf[3]=0x82;
  284. TxDwinDataBuf[4]=addr16>>8;
  285. TxDwinDataBuf[5]=addr16;
  286. for(i=0;i<num;i+=1)
  287. {
  288. TxDwinDataBuf[i+6]=(*buf);
  289. //TxDwinDataBuf[i+7]=*buf++;
  290. }
  291. ScreenMaster485_Send_Data(TxDwinDataBuf,6+num);
  292. // HAL_Delay(10);//
  293. }
  294. /******************************************************************************
  295. 读取一个字的,读16位数据
  296. 输入:写入地址:addr16, 写入数据:*buf
  297. 输出返回:无
  298. ******************************************************************************/
  299. void RdDwinData16(uint16_t addr16,uint8_t len)
  300. {
  301. uint8_t TxDwinDataBuf[8];
  302. TxDwinDataBuf[0]=STARTSIGN_H;
  303. TxDwinDataBuf[1]=STARTSIGN_L;
  304. TxDwinDataBuf[2]=0x04;
  305. TxDwinDataBuf[3]=0x83;
  306. TxDwinDataBuf[4]=addr16>>8;
  307. TxDwinDataBuf[5]=addr16;
  308. TxDwinDataBuf[6]=len;
  309. ScreenMaster485_Send_Data(TxDwinDataBuf,7);
  310. // HAL_Delay(10);//
  311. }
  312. /******************************************************************************
  313. 读取一个字的,读16位数据
  314. 输入:写入地址:addr16, 写入数据:*buf
  315. 输出返回:无
  316. ******************************************************************************/
  317. void Restart_LCD(void)
  318. {
  319. uint8_t TxDwinDataBuf[10];
  320. TxDwinDataBuf[0]=STARTSIGN_H;
  321. TxDwinDataBuf[1]=STARTSIGN_L;
  322. TxDwinDataBuf[2]=0x07;
  323. TxDwinDataBuf[3]=0x82;
  324. TxDwinDataBuf[4]=0x00;//addr16>>8;
  325. TxDwinDataBuf[5]=0x04;//addr16;
  326. TxDwinDataBuf[6]=0x55;
  327. TxDwinDataBuf[7]=0xAA;
  328. TxDwinDataBuf[8]=0x5a;//
  329. TxDwinDataBuf[9]=0xa5;//
  330. if(xSemaphore && xSemaphoreTake( xSemaphore, ( TickType_t ) 50) == pdFALSE)
  331. {
  332. return;
  333. }
  334. ScreenMaster485_Send_Data(TxDwinDataBuf,10);
  335. if(xSemaphore)
  336. xSemaphoreGive( xSemaphore );
  337. HAL_Delay(10);//
  338. }
  339. /******************************************************************************
  340. 读取2个字的数据32位
  341. 输入:无
  342. 输出返回:无
  343. ******************************************************************************/
  344. void RdDwinData32(uint16_t addr16,uint8_t len)
  345. {
  346. uint8_t TxDwinDataBuf[8];
  347. TxDwinDataBuf[0]=STARTSIGN_H;
  348. TxDwinDataBuf[1]=STARTSIGN_L;
  349. TxDwinDataBuf[2]=0x06; //êy?Y3¤?è+?üá?+μ??·
  350. TxDwinDataBuf[3]=0x83;
  351. TxDwinDataBuf[4]=addr16>>8;
  352. TxDwinDataBuf[5]=addr16;
  353. TxDwinDataBuf[6]=len;
  354. ScreenMaster485_Send_Data(TxDwinDataBuf,7);
  355. // HAL_Delay(10);//
  356. }
  357. /******************************************************************************
  358. 接收液晶发下来的数据,并存在结构体中
  359. 输入:无
  360. 输出返回:无
  361. ******************************************************************************/
  362. //void RxAddrData (void)
  363. //{
  364. // u16 i;
  365. // DIWEN_com();
  366. // for(i = 0; i < CMDBUF_SIZE; i++)
  367. // {
  368. // if(ADDR_COMM == RxCmdBuf[i].Cmd_Addr)
  369. // {
  370. // ADDR_COMM=0xff;
  371. // RxCmdBuf[i].Cmd_Flag = 1;
  372. // RxCmdBuf[i].Cmd_Data = DATA_COMM;
  373. // }
  374. // }
  375. //}
  376. /******************************************************************************
  377. 分析数据并处理数据
  378. 输入:无
  379. 输出返回:无
  380. ******************************************************************************/
  381. void Lcd_Cmd_Handle(void)
  382. {
  383. // RxAddrData();
  384. }
  385. /******************************************************************************
  386. 界面跳转
  387. 输入:ID
  388. 输出返回:无
  389. ******************************************************************************/
  390. void Jump_page_id(uint8_t id)
  391. {
  392. WrDwinCmd32(0x0084,0x5A010000|id);
  393. Run_mode_key_info.current_page = id;
  394. }
  395. /******************************************************************************
  396. 首页
  397. 数字:表示页面,在工程中可以看出
  398. 输入:无
  399. 输出返回:无
  400. ******************************************************************************/
  401. uint8_t Special_Stor;
  402. void Go_homepage(void)
  403. {
  404. switch (all_Store)
  405. {
  406. case 1:
  407. {
  408. Jump_page_id(1);//跳到主界面常规1仓
  409. Run_mode_key_info.Main_Page_id =1;//状态界面
  410. Run_mode_key_info.Full_oil_id = 10;//装油界面
  411. Run_mode_key_info.offLoading_oil_id =19;//卸油界面
  412. }break;
  413. case 2:
  414. {
  415. // if((StoreNumber == 1)&&Special_Stor)//跳到1仓2盖((Config_info_all.ManHole_Big_info&0x0f)==0x02)
  416. // {
  417. // Jump_page_id(2);
  418. // Run_mode_key_info.Main_Page_id =2;
  419. // Run_mode_key_info.Full_oil_id = 11;
  420. // Run_mode_key_info.offLoading_oil_id =20;
  421. // }
  422. // else //常规2仓
  423. // {
  424. Jump_page_id(3);
  425. Run_mode_key_info.Main_Page_id =3;
  426. Run_mode_key_info.Full_oil_id = 12;
  427. Run_mode_key_info.offLoading_oil_id =21;
  428. // }
  429. } break;
  430. case 3:
  431. {
  432. Jump_page_id(4);
  433. Run_mode_key_info.Main_Page_id =4;
  434. Run_mode_key_info.Full_oil_id = 13;
  435. Run_mode_key_info.offLoading_oil_id =22;
  436. } break;
  437. case 4:
  438. {
  439. Jump_page_id(5);
  440. Run_mode_key_info.Main_Page_id =5;
  441. Run_mode_key_info.Full_oil_id = 14;
  442. Run_mode_key_info.offLoading_oil_id =23;
  443. } break;
  444. case 5:
  445. {
  446. Jump_page_id(6);
  447. Run_mode_key_info.Main_Page_id =6;
  448. Run_mode_key_info.Full_oil_id = 15;
  449. Run_mode_key_info.offLoading_oil_id =24;
  450. } break;
  451. case 6:
  452. {
  453. Jump_page_id(7);
  454. Run_mode_key_info.Main_Page_id =7;
  455. Run_mode_key_info.Full_oil_id = 16;
  456. Run_mode_key_info.offLoading_oil_id =25;
  457. }break;
  458. case 7:
  459. {
  460. Jump_page_id(8);
  461. Run_mode_key_info.Main_Page_id =8;
  462. Run_mode_key_info.Full_oil_id = 17;
  463. Run_mode_key_info.offLoading_oil_id =26;
  464. }break;
  465. case 8:
  466. {
  467. Jump_page_id(9);
  468. Run_mode_key_info.Main_Page_id =9;
  469. Run_mode_key_info.Full_oil_id = 18;
  470. Run_mode_key_info.offLoading_oil_id =27;
  471. }break;
  472. default:break;
  473. }
  474. Run_mode_key_info.Liquid_id = 54;
  475. }
  476. /******************************************************************************
  477. 屏幕初始化
  478. 输入:无
  479. 输出返回:无
  480. ******************************************************************************/
  481. void Lcd_Init(void)
  482. {
  483. //初始化界面
  484. WrDwinCmd16(ADDR_DWIN_CoverSmall,0x00);//人孔小盖关
  485. // HAL_Delay(15);
  486. WrDwinCmd16(ADDR_DWIN_CoverBig,0x00);//人孔大盖关
  487. // HAL_Delay(15);
  488. if(UI_VERSION_2B > ui_version){
  489. WrDwinCmd16(ADDR_DWIN_HaiDiFa,0x00);//底阀关
  490. WrDwinCmd16(ADDR_DWIN_XieYouFa,0x00);//卸油阀关
  491. }else{
  492. for(int i=0;i<StoreNumber;i++){
  493. WrDwinCmd16(ADDR_DWIN_UnloadVlave_Status+2*i, VALVESTATUS_CLOSE);
  494. WrDwinCmd16(ADDR_DWIN_SeaVlave_Status+2*i, VALVESTATUS_CLOSE);
  495. }
  496. }
  497. // HAL_Delay(15);
  498. WrDwinCmd16(ADDR_DWIN_Seal_Lock,0xff);//锁不显示--
  499. // HAL_Delay(15);
  500. WrDwinCmd16(ADDR_DWIN_Seal_UnLock,0xff);//锁开不显示
  501. // HAL_Delay(15);
  502. WrDwinCmd16(ADDR_DWIN_Car_State,0x00);//状态正常
  503. // HAL_Delay(15);
  504. Go_homepage();//回到首页
  505. // //位控制
  506. // WrDwinCmd16(0x1000,0xff);//人孔小盖开 位控制
  507. // WrDwinCmd16(0x1003,0xff);//人孔大盖开
  508. // WrDwinCmd16(0x1006,0xff);//底阀开
  509. // WrDwinCmd16(0x1009,0xff);//卸油阀开
  510. // WrDwinCmd16(0x100c,0xFF);//锁不显示
  511. // WrDwinCmd16(0x100F,0x00);//锁开显示
  512. //
  513. // WrDwinCmd16(0x1000,0x00);//人孔小盖关
  514. // WrDwinCmd16(0x1003,0x00);//人孔大盖关
  515. // WrDwinCmd16(0x1006,0x00);//底阀关
  516. // WrDwinCmd16(0x1009,0x00);//卸油阀关
  517. //
  518. // WrDwinCmd16(0x100c,0x00);//锁显示
  519. // WrDwinCmd16(0x100F,0xff);//锁开不显示
  520. //
  521. // WrDwinCmd16(0x100c,0xff);//锁不显示
  522. // WrDwinCmd16(0x100F,0xff);//锁开不显示
  523. // WrDwinCmd16(0x1022,0x00);//状态正常
  524. //
  525. //
  526. // WrDwinCmd16(0x1012,0x04);//油量 数值控制
  527. // WrDwinCmd16(0x1014,0x01);//
  528. // WrDwinCmd16(0x1016,0x02);//
  529. // WrDwinCmd16(0x1018,0x03);//油量
  530. // WrDwinCmd16(0x101a,0x04);//
  531. // WrDwinCmd16(0x101c,0x02);//
  532. // WrDwinCmd16(0x101e,0x00);//油量
  533. // WrDwinCmd16(0x1020,0x01);//
  534. // WrDwinCmd16(0x1022,0x01);//状态异常
  535. //
  536. // //进入装油界面
  537. // WrDwinCmd32(0x0084,0x5A010000|18);
  538. //
  539. // WrDwinCmd16(0x1028,0x01);//装油模式 上装
  540. // WrDwinCmd16(0x1026,0x00);//油量仓
  541. // WrDwinCmd16(0x1024,0x01);//罐仓状态 装油中
  542. // WrDwinCmd16(0x102a,0x01);//装油动画开始 1
  543. // WrDwinCmd16(0x102c,0x01);//装油动画开始 2
  544. // WrDwinCmd16(0x102e,0x01);//装油动画开始 3
  545. // WrDwinCmd16(0x1030,0x01);//装油动画开始 4
  546. // WrDwinCmd16(0x1032,0x01);//装油动画开始 5
  547. // WrDwinCmd16(0x1034,0x01);//装油动画开始 6
  548. // WrDwinCmd16(0x1036,0x01);//装油动画开始 7
  549. // WrDwinCmd16(0x1038,0x01);//装油动画开始 8
  550. //
  551. //
  552. //
  553. // WrDwinCmd16(0x1028,0x00);//装油模式 下装
  554. // WrDwinCmd16(0x1026,0x08);//油量仓
  555. // WrDwinCmd16(0x1024,0x00);//罐仓状态 空闲中
  556. // WrDwinCmd16(0x102a,0x00);//装油动画停止 1
  557. // WrDwinCmd16(0x102c,0x00);//装油动画停止 2
  558. // WrDwinCmd16(0x102e,0x00);//装油动画停止 3
  559. // WrDwinCmd16(0x1030,0x00);//装油动画停止 4
  560. // WrDwinCmd16(0x1032,0x00);//装油动画停止 5
  561. // WrDwinCmd16(0x1034,0x00);//装油动画停止 6
  562. // WrDwinCmd16(0x1036,0x00);//装油动画停止 7
  563. // WrDwinCmd16(0x1038,0x00);//装油动画停止 8
  564. //
  565. //
  566. //
  567. ////进入卸油界面
  568. // WrDwinCmd32(0x0084,0x5A010000|27);
  569. // WrDwinCmd16(0x1024,0x00);//罐仓状态 空闲中
  570. // WrDwinCmd16(0x1026,0x01);//油量仓
  571. // WrDwinCmd16(0x1024,0x01);//罐仓状态 卸油中
  572. //
  573. // WrDwinCmd16(0x1012,0x00);//1仓油量 数值控制
  574. // WrDwinCmd16(0x102a,0x01);//卸油动画开始 1
  575. //
  576. // WrDwinCmd16(0x1014,0x00);//1仓油量 数值控制
  577. // WrDwinCmd16(0x102c,0x01);//卸油动画开始 2
  578. //
  579. // WrDwinCmd16(0x1016,0x00);//1仓油量 数值控制
  580. // WrDwinCmd16(0x102e,0x01);//卸油动画开始 3
  581. //
  582. // WrDwinCmd16(0x1018,0x00);//1仓油量 数值控制
  583. // WrDwinCmd16(0x1030,0x01);//卸油动画开始 4
  584. //
  585. //
  586. // WrDwinCmd16(0x101a,0x00);//1仓油量 数值控制
  587. // WrDwinCmd16(0x1032,0x01);//卸油动画开始 5
  588. //
  589. // WrDwinCmd16(0x101c,0x00);//1仓油量 数值控制
  590. // WrDwinCmd16(0x1034,0x01);//卸油动画开始 6
  591. //
  592. // WrDwinCmd16(0x101e,0x00);//1仓油量 数值控制
  593. // WrDwinCmd16(0x1036,0x01);//卸油动画开始 7
  594. //
  595. // WrDwinCmd16(0x1020,0x00);//1仓油量 数值控制
  596. // WrDwinCmd16(0x1038,0x01);//卸油动画开始 8
  597. // WrDwinCmd16(0x103a,0x01);//仓数显示
  598. // WrDwinCmd16(0x103c,0x01);//装油警告,弹窗
  599. // WrDwinCmd16(0x103e,0x01);//卸油油警告,弹窗
  600. // WrDwinCmd16(0x1040,0x01);//指纹识别,弹窗
  601. //卸油阀异常 1042
  602. //底阀异常 1044
  603. //人孔小盖异常 1046
  604. //人孔大盖异常 1048
  605. //登录用户名 104a
  606. //登录密码 104c
  607. //密码错误 104e
  608. //时间设置
  609. //年 104e
  610. //月 1050
  611. //日 1052
  612. //时 1054
  613. //分 1056
  614. //秒 1058
  615. }
  616. /******************************************************************************
  617. 显示车辆状态与阀门状态
  618. 输入:无
  619. 输出返回:无
  620. ******************************************************************************/
  621. uint8_t a=0,b=0,c=0,d=0;
  622. uint8_t e1=0,f1=0,g1=0,h1=0;
  623. void Dispaly_CarAndValveState(void)
  624. {
  625. uint8_t e=0,f=0,g=0,h=0;
  626. uint8_t i=0;
  627. uint8_t SeaValue001=0x00;//8个海底阀的状态
  628. uint8_t UnloadingValve001=0x00;//8个泄油阀的状态
  629. uint8_t ManHole_CoverBig001=0x00;//8个人孔大盖的状态
  630. uint8_t ManHole_CoverSmall001=0x00;//8个人孔小盖的状态
  631. //uint8_t Unloaded001=0x00;//8个卸尽状态, 卸尽仓置1
  632. static uint8_t static_unloadvalve_state[8] ={VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK\
  633. ,VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK};
  634. static uint8_t static_seavalve_state[8] ={VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK\
  635. ,VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK,VALVESTATUS_BREAK};
  636. for(i=0;i<StoreNumber;i++)
  637. {
  638. //a|= (0x0001&(IO_Date.IO_state[0]>>i*4))<<i;
  639. //b|= (0x0001&(IO_Date.IO_state[0]>>(i*4+1)))<<i;
  640. //c|= (0x0001&(IO_Date.IO_state[0]>>(i*4+2)))<<i;
  641. //d|= (0x0001&(IO_Date.IO_state[0]>>(i*4+3)))<<i;
  642. e|= (0x0001&(IO_Date.IO_normalstate[0]>>i*4))<<i;
  643. f|= (0x0001&(IO_Date.IO_normalstate[0]>>(i*4+1)))<<i;
  644. g|= (0x0001&(IO_Date.IO_normalstate[0]>>(i*4+2)))<<i;
  645. h|= (0x0001&(IO_Date.IO_normalstate[0]>>(i*4+3)))<<i;
  646. if((((Full_Oil_allinfo.Start_Decrease_flag&(1<<i))==(1<<i))||(Full_Oil_allinfo.Loading_Oil_state&(1<<i))==(1<<i))&&(Run_mode_key_info.current_page !=Run_mode_key_info.Main_Page_id))
  647. WrDwinCmd16(ADDR_DWIN_Loading_Oil+(i*2),(((~IO_Date.IO_unload_switch>>i)&0x01)==0x01?0:00));//本仓在卸油或者装油,显示动画,不显示油量Ever_Oil_baseaddr
  648. else
  649. WrDwinCmd16(ADDR_DWIN_Loading_Oil+(i*2),(((~IO_Date.IO_unload_switch>>i)&0x01)==0x01?0x00:0x04));
  650. }
  651. // WrDwinCmd16(0x1000,a);//人孔小盖关
  652. // WrDwinCmd16(0x1003,b);//人孔大盖关
  653. // WrDwinCmd16(0x1006,d);//底阀关
  654. // WrDwinCmd16(0x1009,c);//卸油阀关
  655. PreProcess_GetValveStatus(&ManHole_CoverBig001, &ManHole_CoverSmall001, &SeaValue001, &UnloadingValve001);
  656. if(a!=ManHole_CoverBig001)
  657. {
  658. WrDwinCmd16(ADDR_DWIN_CoverBig,ManHole_CoverBig001);//人孔大盖开关
  659. a=ManHole_CoverBig001;
  660. }
  661. if(b!=ManHole_CoverSmall001)
  662. {
  663. WrDwinCmd16(ADDR_DWIN_CoverSmall,ManHole_CoverSmall001);//人孔小盖开关
  664. b=ManHole_CoverSmall001;
  665. }
  666. if(e1!=e)
  667. {
  668. WrDwinCmd16(ADDR_DWIN_StateYiChang_CoverSmall,e);//人孔小盖异常
  669. e1=e;
  670. }
  671. if(f1!=f)
  672. {
  673. WrDwinCmd16(ADDR_DWIN_StateYiChang_CoverBig,f);//人孔大盖异常
  674. f1=f;
  675. }
  676. if(UI_VERSION_2B > ui_version){
  677. if(c!=SeaValue001)
  678. {
  679. WrDwinCmd16(ADDR_DWIN_HaiDiFa,SeaValue001);//海底阀开关
  680. c=SeaValue001;
  681. }
  682. if(d!=UnloadingValve001)
  683. {
  684. WrDwinCmd16(ADDR_DWIN_XieYouFa,UnloadingValve001);//卸油阀开关
  685. d=UnloadingValve001;
  686. }
  687. if(h1!=h)
  688. {
  689. WrDwinCmd16(ADDR_DWIN_StateYiChang_HaiDiFa,h);//底阀异常
  690. h1 = h;
  691. }
  692. if(g1!=g)
  693. {
  694. WrDwinCmd16(ADDR_DWIN_StateYiChang_XieYouFa,g);//卸油阀异常
  695. g1 = g;
  696. }
  697. }else{
  698. for(i=0;i<StoreNumber;i++)
  699. {
  700. uint8_t status = VALVESTATUS_CLOSE;
  701. if((g&(0x01<<i)) > 0){ //异常了
  702. status = VALVESTATUS_EXCEPTION;
  703. }else{
  704. if((UnloadingValve001&(0x01<<i)) == 0){ //关
  705. status = VALVESTATUS_CLOSE;
  706. }else{ //开
  707. status = VALVESTATUS_OPEN;
  708. }
  709. }
  710. if(static_unloadvalve_state[i] != status){
  711. WrDwinCmd16(ADDR_DWIN_UnloadVlave_Status+2*i, status);
  712. static_unloadvalve_state[i] = status;
  713. }
  714. //SealVlave
  715. if((h&(0x01<<i)) > 0){ //异常了
  716. status = VALVESTATUS_EXCEPTION;
  717. }else{
  718. if((SeaValue001&(0x01<<i)) == 0){ //关
  719. status = VALVESTATUS_CLOSE;
  720. }else{ //开
  721. status = VALVESTATUS_OPEN;
  722. }
  723. }
  724. if(static_seavalve_state[i] != status){
  725. WrDwinCmd16(ADDR_DWIN_SeaVlave_Status+2*i, status);
  726. static_seavalve_state[i] = status;
  727. }
  728. }
  729. }
  730. #if 0
  731. if(Full_Oil_allinfo.Null_ID!=Full_Oil_allinfo.Null_ID_disp)
  732. {
  733. WrDwinCmd16(0x1012,(((Full_Oil_allinfo.Null_ID>>0)&0x01)==0x01?0:0x04));//油量 数值控制 1 0x04为油量
  734. WrDwinCmd16(0x1014,(((Full_Oil_allinfo.Null_ID>>1)&0x01)==0x01?0:0x04));// 2
  735. WrDwinCmd16(0x1016,(((Full_Oil_allinfo.Null_ID>>2)&0x01)==0x01?0:0x04));// 3
  736. WrDwinCmd16(0x1018,(((Full_Oil_allinfo.Null_ID>>3)&0x01)==0x01?0:0x04));//油量 4
  737. // WrDwinCmd16(0x101a,(((Full_Oil_allinfo.Null_ID>>4)&0x01)==0x01?0:0x04));// 5
  738. // WrDwinCmd16(0x101c,(((Full_Oil_allinfo.Null_ID>>5)&0x01)==0x01?0:0x04));// 6
  739. // WrDwinCmd16(0x101e,(((Full_Oil_allinfo.Null_ID>>6)&0x01)==0x01?0:0x04));//油量 7
  740. // WrDwinCmd16(0x1020,(((Full_Oil_allinfo.Null_ID>>7)&0x01)==0x01?0:0x04));// 8
  741. Full_Oil_allinfo.Null_ID_disp=Full_Oil_allinfo.Null_ID;
  742. }
  743. #endif
  744. if((Full_Oil_allinfo.Auto_sealedOK_ID ==0)&&(Full_Oil_allinfo.Break_sealing_Id ==0))//
  745. {//解封状态两把锁均不显示
  746. WrDwinCmd16(ADDR_DWIN_Seal_Lock,0xff);//锁不显示
  747. WrDwinCmd16(ADDR_DWIN_Seal_UnLock,0xff);//锁开不显示
  748. }
  749. else
  750. { //显示施封图片--一把锁上的锁;该处逻辑是反的----某一位为0,则显示该位的锁
  751. WrDwinCmd16(ADDR_DWIN_Seal_Lock,(~Full_Oil_allinfo.Auto_sealedOK_ID));//锁显示
  752. }
  753. if((Full_Oil_allinfo.Break_sealing_Id>0)&&(IO_Date.IO_unload_switch>0))
  754. {
  755. WrDwinCmd16(ADDR_DWIN_Seal_UnLock,(~Full_Oil_allinfo.Break_sealing_Id));//锁开显示
  756. //WrDwinCmd16(ADDR_DWIN_Seal_Lock,(~Full_Oil_allinfo.Auto_sealedOK_ID));//锁显示
  757. // WrDwinCmd16(ADDR_DWIN_Seal_Lock,(Full_Oil_allinfo.Break_sealing_Id));//锁不显示 李伟添加 20211028 避免图标混乱
  758. //
  759. // FM25L16B_WriteByte(ADDR_Auto_sealedOK_ID,(uint8_t)Full_Oil_allinfo.Auto_sealedOK_ID);//保存施封状态20200428
  760. // FM25L16B_WriteByte(ADDR_Break_sealing_Id,Full_Oil_allinfo.Break_sealing_Id);//保存破封状态20200428
  761. // //WrDwinCmd16(ADDR_DWIN_Seal_UnLock,(~Full_Oil_allinfo.Auto_sealedOK_ID));//锁不显示 李伟添加 20211028 避免图标混乱
  762. }
  763. else
  764. {
  765. WrDwinCmd16(ADDR_DWIN_Seal_UnLock,(~Full_Oil_allinfo.Break_sealing_Id));//锁开bu显示
  766. }
  767. if(Full_Oil_allinfo.Car_state!=Full_Oil_allinfo.Car_state_disp)
  768. {
  769. if (Full_Oil_allinfo.Car_state == 0) //车辆状态OK
  770. WrDwinCmd16(ADDR_DWIN_Car_State, 0x00); //状态正常
  771. else if (Full_Oil_allinfo.Car_state == 1)
  772. WrDwinCmd16(ADDR_DWIN_Car_State, 0x02); //状态NOK
  773. else
  774. WrDwinCmd16(ADDR_DWIN_Car_State, 0x01); //状态破封
  775. Full_Oil_allinfo.Car_state_disp=Full_Oil_allinfo.Car_state;
  776. }
  777. if(Lcd_sleep_flag ==1)//屏幕休眠
  778. {
  779. WrDwinCmd16(0x0082,0x0000);//亮度调节0x0000~0x6464
  780. }
  781. else if(Lcd_sleep_flag==2)//唤醒休眠
  782. {
  783. Lcd_sleep_flag =3;
  784. //Jump_page_id(Run_mode_key_info.current_page);
  785. WrDwinCmd16(0x0082,0x3600);//亮度调节0x0000~0x646
  786. }
  787. }
  788. /******************************************************************************
  789. 装油动画
  790. 输入:mode 装油模式 sedata 装油的仓
  791. 输出返回:无
  792. ******************************************************************************/
  793. void FULL_oil_draw(uint8_t mode,uint8_t se_data)//装油动画
  794. {
  795. uint8_t i=0;
  796. if(se_data!=0)
  797. WrDwinCmd16(ADDR_DWIN_Operation_State,0x01);//罐仓状态 装油中
  798. else
  799. WrDwinCmd16(ADDR_DWIN_Operation_State,0x00);//罐仓状态 空闲中
  800. WrDwinCmd16(ADDR_DWIN_Loading_Oil_Mode,mode);//装油模式 上装1 下装0
  801. WrDwinCmd16(ADDR_DWIN_Num_Of_CangId,se_data);//油量仓12345678
  802. for(i=0;i<StoreNumber;i++)
  803. {
  804. WrDwinCmd16(ADDR_DWIN_UnLoading_Oil_Mode+i*2,(se_data&(0x01<<i))>>i);
  805. //HAL_Delay(10);//
  806. }
  807. // WrDwinCmd16(0x102a,0x01);//装油动画开始 1
  808. // WrDwinCmd16(0x102c,0x01);//装油动画开始 2
  809. // WrDwinCmd16(0x102e,0x01);//装油动画开始 3
  810. // WrDwinCmd16(0x1030,0x01);//装油动画开始 4
  811. // WrDwinCmd16(0x1032,0x01);//装油动画开始 5
  812. // WrDwinCmd16(0x1034,0x01);//装油动画开始 6
  813. // WrDwinCmd16(0x1036,0x01);//装油动画开始 7
  814. // WrDwinCmd16(0x1038,0x01);//装油动画开始 8
  815. }
  816. /******************************************************************************
  817. 卸油动画
  818. 输入: sedata 装油的仓
  819. 输出返回:无
  820. ******************************************************************************/
  821. void Off_loading_draw(uint8_t se_data)
  822. {
  823. uint8_t i=0;
  824. if(se_data!=0)
  825. WrDwinCmd16(ADDR_DWIN_Operation_State,0x01);//罐仓状态 卸油中
  826. else
  827. WrDwinCmd16(ADDR_DWIN_Operation_State,0x00);//罐仓状态 空闲中
  828. WrDwinCmd16(ADDR_DWIN_Num_Of_CangId,se_data);//卸量仓12345678
  829. for(i=0;i<StoreNumber;i++)
  830. {
  831. WrDwinCmd16(ADDR_DWIN_UnLoading_Oil_Mode+i*2,(se_data&(0x01<<i))>>i);
  832. //HAL_Delay(10);//
  833. }
  834. // WrDwinCmd16(0x1024,0x00);//罐仓状态 空闲中
  835. // WrDwinCmd16(0x1026,0x01);//油量仓
  836. // WrDwinCmd16(0x1024,0x01);//罐仓状态 卸油中
  837. //
  838. // WrDwinCmd16(0x1012,0x00);//1仓油量 数值控制
  839. // WrDwinCmd16(0x102a,0x01);//卸油动画开始 1
  840. //
  841. // WrDwinCmd16(0x1014,0x00);//1仓油量 数值控制
  842. // WrDwinCmd16(0x102c,0x01);//卸油动画开始 2
  843. //
  844. // WrDwinCmd16(0x1016,0x00);//1仓油量 数值控制
  845. // WrDwinCmd16(0x102e,0x01);//卸油动画开始 3
  846. //
  847. // WrDwinCmd16(0x1018,0x00);//1仓油量 数值控制
  848. // WrDwinCmd16(0x1030,0x01);//卸油动画开始 4
  849. //
  850. //
  851. // WrDwinCmd16(0x101a,0x00);//1仓油量 数值控制
  852. // WrDwinCmd16(0x1032,0x01);//卸油动画开始 5
  853. //
  854. // WrDwinCmd16(0x101c,0x00);//1仓油量 数值控制
  855. // WrDwinCmd16(0x1034,0x01);//卸油动画开始 6
  856. //
  857. // WrDwinCmd16(0x101e,0x00);//1仓油量 数值控制
  858. // WrDwinCmd16(0x1036,0x01);//卸油动画开始 7
  859. //
  860. // WrDwinCmd16(0x1020,0x00);//1仓油量 数值控制
  861. // WrDwinCmd16(0x1038,0x01);//卸油动画开始 8
  862. /*
  863. 5A A5 07 82 0082 6420 07D0
  864. (10秒后进入背光,点击变亮,10000/5=2000 换算成16进制为07D0,范围00-64,100级亮度调节)
  865. */
  866. }
  867. void Read_REAL_Time(void)
  868. {
  869. /*
  870. 5A A5 0B 82 009C 5A A5 12 06 1B 15 15 15 (18年6月27号21时21分21秒,16进制数据) 读RTC:5A A5 04 83 0010 04
  871. */
  872. RdDwinData16(0x0010,4);
  873. }
  874. void Wakeup_lcd(void)
  875. {
  876. uint8_t PopWinCmdBuf[14]={0x5A ,0xA5 ,0x0B ,0x82 ,0x00 ,0xD4 ,0x5A ,0xA5 ,0x00 ,0x04 ,0x00 ,0x00 ,0x00 ,0x00};
  877. //5A A5 0B 82 00D4 5AA5 0004 00EE 008F
  878. UartWrite(&huart2,PopWinCmdBuf,14);
  879. }
  880. void Display_input_time(uint8_t flag,uint8_t *time)
  881. {
  882. uint8_t arr[6]={0};
  883. uint8_t i =0;
  884. for(i=0;i<6;i++)
  885. {
  886. //arr[i]=time[i*2]-0x30+time[i*2+1]-0x30;
  887. if(time[i*2]!=0x00)
  888. {
  889. if(time[i*2+1]!=0x00)
  890. arr[i] = (time[i*2]-0x30)*10+(time[i*2+1]-0x30);
  891. else
  892. arr[i] = time[i*2]-0x30;
  893. }
  894. else
  895. {
  896. break;
  897. }
  898. }
  899. WrDwinCmd16(0x104e,arr[0]);//年
  900. HAL_Delay(10);//
  901. WrDwinCmd16(0x1050,arr[1]);//月
  902. HAL_Delay(10);//
  903. WrDwinCmd16(0x1052,arr[2]);//日
  904. HAL_Delay(10);//
  905. WrDwinCmd16(0x1054,arr[3]);//时
  906. HAL_Delay(10);//
  907. WrDwinCmd16(0x1056,arr[4]);//分
  908. HAL_Delay(10);//
  909. WrDwinCmd16(0x1058,arr[5]);//秒
  910. HAL_Delay(10);//
  911. if(flag ==1)//发送时间确认修改
  912. {
  913. flag =0;
  914. Send_Time(arr);
  915. }
  916. }
  917. //time 要修改的时间
  918. void Send_Time(uint8_t * time)
  919. {
  920. // u8 i =0;
  921. memcpy(time_Set_Dwin+8,time,6);
  922. UartWrite(&huart2,time_Set_Dwin,14);
  923. /* delay_ms(100);*/
  924. }
  925. //flag 显示密码错误信息 pawd_num 密码个数
  926. //登录用户名 104a
  927. //登录密码 104c
  928. //密码错误 105a
  929. void Dispay_login(uint8_t flag,uint8_t pawd_num)
  930. {
  931. WrDwinCmd16(0x104a,0);
  932. HAL_Delay(10);//
  933. if(pawd_num<7)
  934. WrDwinCmd16(0x104c,pawd_num);
  935. HAL_Delay(10);//
  936. if(flag==1)
  937. WrDwinCmd16(0x105a,1);//密码错误提示
  938. else
  939. WrDwinCmd16(0x105a,0);
  940. }