display.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. #include "display.h"
  2. #include "gd32e230_libopt.h"
  3. #include "SysTick.h"
  4. //voltage
  5. #define V_COM1 GPIO_PIN_0
  6. #define V_COM2 GPIO_PIN_1
  7. #define V_COM3 GPIO_PIN_2
  8. #define V_COM4 GPIO_PIN_10
  9. #define I_COM5 GPIO_PIN_14
  10. #define I_COM6 GPIO_PIN_13
  11. #define I_COM7 GPIO_PIN_12
  12. #define I_COM8 GPIO_PIN_11
  13. #define D_A GPIO_PIN_15
  14. #define D_B GPIO_PIN_7
  15. #define D_C GPIO_PIN_9
  16. #define D_D GPIO_PIN_11
  17. #define D_E GPIO_PIN_12
  18. #define D_F GPIO_PIN_15
  19. #define D_G GPIO_PIN_8
  20. #define D_DP GPIO_PIN_10
  21. #define V_C_1_H gpio_bit_set(GPIOB,V_COM1);
  22. #define V_C_2_H gpio_bit_set(GPIOB,V_COM2);
  23. #define V_C_3_H gpio_bit_set(GPIOB,V_COM3);
  24. #define V_C_4_H gpio_bit_set(GPIOB,V_COM4);
  25. #define I_C_5_H gpio_bit_set(GPIOB,I_COM5);
  26. #define I_C_6_H gpio_bit_set(GPIOB,I_COM6);
  27. #define I_C_7_H gpio_bit_set(GPIOB,I_COM7);
  28. #define I_C_8_H gpio_bit_set(GPIOB,I_COM8);
  29. #define V_C_1_L gpio_bit_reset(GPIOB,V_COM1);
  30. #define V_C_2_L gpio_bit_reset(GPIOB,V_COM2);
  31. #define V_C_3_L gpio_bit_reset(GPIOB,V_COM3);
  32. #define V_C_4_L gpio_bit_reset(GPIOB,V_COM4);
  33. #define I_C_5_L gpio_bit_reset(GPIOB,I_COM5);
  34. #define I_C_6_L gpio_bit_reset(GPIOB,I_COM6);
  35. #define I_C_7_L gpio_bit_reset(GPIOB,I_COM7);
  36. #define I_C_8_L gpio_bit_reset(GPIOB,I_COM8);
  37. #define D_A_H gpio_bit_set(GPIOB,D_A);
  38. #define D_B_H gpio_bit_set(GPIOA,D_B);
  39. #define D_C_H gpio_bit_set(GPIOA,D_C);
  40. #define D_D_H gpio_bit_set(GPIOA,D_D);
  41. #define D_E_H gpio_bit_set(GPIOA,D_E);
  42. #define D_F_H gpio_bit_set(GPIOA,D_F);
  43. #define D_G_H gpio_bit_set(GPIOA,D_G);
  44. #define D_DP_H gpio_bit_set(GPIOA,D_DP);
  45. #define D_A_L gpio_bit_reset(GPIOB,D_A);
  46. #define D_B_L gpio_bit_reset(GPIOA,D_B);
  47. #define D_C_L gpio_bit_reset(GPIOA,D_C);
  48. #define D_D_L gpio_bit_reset(GPIOA,D_D);
  49. #define D_E_L gpio_bit_reset(GPIOA,D_E);
  50. #define D_F_L gpio_bit_reset(GPIOA,D_F);
  51. #define D_G_L gpio_bit_reset(GPIOA,D_G);
  52. #define D_DP_L gpio_bit_reset(GPIOA,D_DP);
  53. enum{
  54. CHANNEL_1 = 0,
  55. CHANNEL_2,
  56. CHANNEL_3,
  57. CHANNEL_4,
  58. CHANNEL_5,
  59. CHANNEL_6,
  60. CHANNEL_7,
  61. CHANNEL_8
  62. };
  63. uint8_t table[20][8]={
  64. {1,1,1,1,1,1,0,0}, // 0
  65. {0,1,1,0,0,0,0,0}, // 1
  66. {1,1,0,1,1,0,1,0}, // 2
  67. {1,1,1,1,0,0,1,0}, // 3
  68. {0,1,1,0,0,1,1,0}, // 4
  69. {1,0,1,1,0,1,1,0}, // 5
  70. {1,0,1,1,1,1,1,0}, // 6
  71. {1,1,1,0,0,0,0,0}, // 7
  72. {1,1,1,1,1,1,1,0}, // 8
  73. {1,1,1,1,0,1,1,0}, // 9
  74. {1,1,1,1,1,1,0,1}, // 0
  75. {0,1,1,0,0,0,0,1}, // 1.
  76. {1,1,0,1,1,0,1,1}, // 2.
  77. {1,1,1,1,0,0,1,1}, // 3.
  78. {0,1,1,0,0,1,1,1}, // 4.
  79. {1,0,1,1,0,1,1,1}, // 5.
  80. {1,0,1,1,1,1,1,1}, // 6.
  81. {1,1,1,0,0,0,0,1}, // 7.
  82. {1,1,1,1,1,1,1,1}, // 8.
  83. {1,1,1,1,0,1,1,1}, // 9.
  84. };
  85. void DisplayInit(void)
  86. {
  87. rcu_periph_clock_enable(RCU_GPIOB);
  88. rcu_periph_clock_enable(RCU_GPIOA);
  89. gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,V_COM1| V_COM2 | V_COM3 | V_COM4 | I_COM5 | I_COM6 | I_COM7 | I_COM8 | D_A);
  90. gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, V_COM1| V_COM2 | V_COM3 | V_COM4 | I_COM5 | I_COM6 | I_COM7 | I_COM8 | D_A);
  91. gpio_bit_reset(GPIOB, V_COM1| V_COM2 | V_COM3 | V_COM4 | I_COM5 | I_COM6 | I_COM7 | I_COM8);
  92. gpio_bit_set(GPIOB, D_A);
  93. gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,D_B| D_C | D_D | D_E | D_F | D_G | D_DP);
  94. gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, D_B| D_C | D_D | D_E | D_F | D_DP);
  95. gpio_bit_set(GPIOA, D_B| D_C | D_D | D_E | D_F |D_G| D_DP);
  96. }
  97. static show_num(uint16_t _com,int num)
  98. {
  99. //clear chong ying
  100. V_C_1_H
  101. V_C_2_H
  102. V_C_3_H
  103. V_C_4_H
  104. I_C_5_H
  105. I_C_6_H
  106. I_C_7_H
  107. I_C_8_H
  108. //
  109. D_A_L
  110. D_B_L
  111. D_C_L
  112. D_D_L
  113. D_E_L
  114. D_F_L
  115. D_G_L
  116. D_DP_L
  117. //
  118. switch(_com)
  119. {
  120. case CHANNEL_1:
  121. V_C_1_L
  122. break;
  123. case CHANNEL_2:
  124. V_C_2_L
  125. break;
  126. case CHANNEL_3:
  127. V_C_3_L
  128. break;
  129. case CHANNEL_4:
  130. V_C_4_L
  131. break;
  132. case CHANNEL_5:
  133. I_C_5_L
  134. break;
  135. case CHANNEL_6:
  136. I_C_6_L
  137. break;
  138. case CHANNEL_7:
  139. I_C_7_L
  140. break;
  141. case CHANNEL_8:
  142. I_C_8_L
  143. break;
  144. default:
  145. break;
  146. }
  147. //
  148. for(int i = 0; i < 8; i ++)
  149. {
  150. if(table[num][i] > 0)
  151. {
  152. switch(i)
  153. {
  154. case 0:
  155. D_A_H
  156. break;
  157. case 1:
  158. D_B_H
  159. break;
  160. case 2:
  161. D_C_H
  162. break;
  163. case 3:
  164. D_D_H
  165. break;
  166. case 4:
  167. D_E_H
  168. break;
  169. case 5:
  170. D_F_H
  171. break;
  172. case 6:
  173. D_G_H
  174. break;
  175. case 7:
  176. D_DP_H;
  177. break;
  178. default:
  179. break;
  180. }
  181. }else
  182. {
  183. switch(i)
  184. {
  185. case 0:
  186. D_A_L
  187. break;
  188. case 1:
  189. D_B_L
  190. break;
  191. case 2:
  192. D_C_L
  193. break;
  194. case 3:
  195. D_D_L
  196. break;
  197. case 4:
  198. D_E_L
  199. break;
  200. case 5:
  201. D_F_L
  202. break;
  203. case 6:
  204. D_G_L
  205. break;
  206. case 7:
  207. D_DP_L
  208. break;
  209. default:
  210. break;
  211. }
  212. }
  213. }
  214. }
  215. void num_list(uint8_t *list,uint32_t num)
  216. {
  217. int i,temp = 0;
  218. for(i =0;i <4;i++)
  219. {
  220. temp = num % 10;
  221. num = num / 10;
  222. list[4-i-1] = temp;
  223. }
  224. }
  225. void display_num_list(uint8_t *list,float num)
  226. {
  227. uint32_t n,i;
  228. if(0 <= num && num <100)
  229. {
  230. n = num *100;
  231. num_list(list,n);
  232. list[1] += 10;
  233. }else if(100 <=num < 1000)
  234. {
  235. n = num * 10;
  236. num_list(list,n);
  237. list[2] += 10;
  238. }else if(1000 <= num && num < 10000)
  239. {
  240. n = num;
  241. num_list(list,n);
  242. }else
  243. {
  244. for(i = 0; i < 4;i++)
  245. list[i] = 9;
  246. }
  247. }
  248. void display_voltage(float num_f,float num_i)
  249. {
  250. int i, t;
  251. uint8_t num[9] = {0};
  252. uint8_t channel[9] = {0};
  253. display_num_list(num,num_i);
  254. display_num_list(&num[4],num_f);
  255. for(i = 0; i < 4;i++)
  256. {
  257. if(num[i] == 0)
  258. {
  259. channel[i] = 1;
  260. if(num[i+1] == 0)
  261. {
  262. continue;
  263. }else
  264. {
  265. break;
  266. }
  267. }else
  268. {
  269. break;
  270. }
  271. }
  272. for(i = 4; i < 8;i++)
  273. {
  274. if(num[i] == 0)
  275. {
  276. channel[i] = 1;
  277. if(num[i+1] == 0)
  278. {
  279. continue;
  280. }else
  281. {
  282. break;
  283. }
  284. }else
  285. {
  286. break;
  287. }
  288. }
  289. // for(t=0;t < 10;t++)
  290. // {
  291. for(i = 0; i < 9;i++)
  292. {
  293. if(channel[i] == 0)
  294. show_num(i,num[i]);
  295. for(int j = 0; j <100;j++);
  296. }
  297. // }
  298. }
  299. void display_current(float num_f)
  300. {
  301. int i, t;
  302. uint8_t num[4] = {0};
  303. uint8_t channel[4] = {0};
  304. display_num_list(num,num_f);
  305. for(i = 0; i < 4;i++)
  306. {
  307. if(num[i] == 0)
  308. {
  309. channel[i] = 1;
  310. if(num[i+1] == 0)
  311. {
  312. continue;
  313. }else
  314. break;
  315. }
  316. }
  317. for(t=0;t < 10000;t++)
  318. {
  319. for(i = 0; i < 4;i++)
  320. {
  321. if(channel[i] == 0)
  322. show_num(i,num[i]);
  323. }
  324. }
  325. }