当前位置:   article > 正文

【速成】蓝桥杯嵌入式省一教程:(五)用按键和屏幕实现嵌入式交互系统_蓝桥杯嵌入式切换界面

蓝桥杯嵌入式切换界面

一个完整的嵌入式系统,包括任务执行部分和人机交互部分。在前四节中,我们已经讲解了LED、LCD和按键,用这三者就能够实现一个人机交互系统,也即搭建整个嵌入式系统的框架。在后续,只要将各个功能加入到这个交互系统中,即可完成整个嵌入式系统的设计。因此,尽管你什么都不会,只会使用LED、LCD和按键,也至少能获得省三或省二的奖项。下面我们就以第十四届省赛题为例,看看如何实现一个完善的交互系统。

c952c7d7e6534ec1806c47c320b4df9b.png

0332ed65b11c46d2987e0b3f4912bed3.png

9cf78ef142d146e097d4579920358009.png

698ba608e7124a0bb3a05fc6cc6f5dad.png

首先我们来看第一个要求:按下B1切换界面:

c952c7d7e6534ec1806c47c320b4df9b.png

结合第二节:LCD显示的内容,只需要将切换界面处的判断条件更换为key[0].single_flag == 1即可:

  1. if (key[0].single_flag == 1)
  2. {
  3. LCD_Clear(Black); //每切换一次界面清一次屏
  4. view++;
  5. if (view > 2)
  6. {
  7. view = 0;
  8. }
  9. key[0].single_flag = 0; //标志位清零(重要!)
  10. }

再来看第二个要求:

fffa615b384d47df9fca5f996da4aa0e.png

1556556cae2749ab895296684d8fb622.png

B2的要求相对于B1来说,只是增加了不同界面的不同功能,其本质是一样的。注意,第二个小要求需要切换选择参数,这就需要一个标志变量choose。每次重新进入参数界面时,默认可调整的参数为R,只需要在切换界面时把choose重新赋值为'R'即可。

  1. char choose = 'R';
  2. if (key[1].single_flag == 1)
  3. {
  4. if (view == 0) //数据界面
  5. {
  6. /* 5s切换模式 */
  7. if (M == 'H') M = 'L';
  8. else M = 'H';
  9. N++; //统计次数
  10. }
  11. else if (view == 1) //参数界面
  12. {
  13. if (choose == 'R') choose = 'K';
  14. else choose = 'R';
  15. }
  16. key[1].single_flag = 0; //标志位清零(重要!)
  17. }

要求3:

85f86215a2e34327b5ded00e24bc043e.png

结合要求2,当choose=='R'时,对R进行++;当choose=='K'时,对K进行++:

  1. if (key[2].single_flag == 1 && view == 1) //参数界面
  2. {
  3. if (choose == 'R')
  4. {
  5. R++;
  6. if (R > 10) R = 1;
  7. }
  8. else
  9. {
  10. K++;
  11. if (K > 10) K = 1;
  12. }
  13. key[2].single_flag = 0; //标志位清零(重要!)
  14. }

要求4:

5de81558f47947d8a6d03cf2b17b3d85.png

要求4的第1个要求与要求3类似,不再赘述。第2个要求要标志是否处于锁定状态,同样需要一个标志变量lock

  1. if (key[3].single_flag==1 && view==1) //参数界面
  2. {
  3. if (choose == 'R')
  4. {
  5. R--;
  6. if (R < 1) R = 10;
  7. }
  8. else
  9. {
  10. K--;
  11. if (K < 1) K = 10;
  12. }
  13. key[3].single_flag = 0; //标志位清零(重要!)
  14. }
  15. bool lock = 0;
  16. if (view==0 && lock==0) //数据界面,解锁状态
  17. {
  18. if (key[3].long_flag == 1) lock = 1;
  19. key[3].long_flag = 0; //标志位清零(重要!)
  20. }
  21. else if (view==0 && lock==1) //数据界面,锁定状态
  22. {
  23. if (key[3].single_flag == 1) lock = 0;
  24. key[3].single_flag = 0; //标志位清零(重要!)
  25. }

将所有有关LED、LCD与按键的操作封装成函数,在主循环中调用,即可实现一个交互系统。

  1. /* task.c */
  2. #include "task.h"
  3. uint8_t view = 0;
  4. char choose = 'R';
  5. bool lock = 0;
  6. char M = 'L';
  7. int P;
  8. double V, MH, ML;
  9. int R = 1;
  10. int K = 1;
  11. int N = 0;
  12. char text[20];
  13. void key_pro(void)
  14. {
  15. //B1
  16. if (key[0].single_flag == 1)
  17. {
  18. LCD_Clear(Black);
  19. view++;
  20. choose = 'R';
  21. if (view > 2)
  22. {
  23. view = 0;
  24. }
  25. key[0].single_flag = 0;
  26. }
  27. //B2
  28. if (key[1].single_flag == 1)
  29. {
  30. if (view == 0)
  31. {
  32. /***************
  33. 5s切换模式
  34. LED_Toggle(LD2);
  35. HAL_Delay(100);
  36. ***************/
  37. LED_Off(LD2);
  38. if (M == 'H') M = 'L';
  39. else M = 'H';
  40. N++;
  41. }
  42. else if (view == 1)
  43. {
  44. if (choose == 'R') choose = 'K';
  45. else choose = 'R';
  46. }
  47. key[1].single_flag = 0;
  48. }
  49. //B3
  50. if (key[2].single_flag == 1 && view == 1)
  51. {
  52. if (choose == 'R')
  53. {
  54. R++;
  55. if (R > 10) R = 1;
  56. }
  57. else
  58. {
  59. K++;
  60. if (K > 10) K = 1;
  61. }
  62. key[2].single_flag = 0;
  63. }
  64. //B4
  65. if (key[3].single_flag==1 && view==1)
  66. {
  67. if (choose == 'R')
  68. {
  69. R--;
  70. if (R < 1) R = 10;
  71. }
  72. else
  73. {
  74. K--;
  75. if (K < 1) K = 10;
  76. }
  77. key[3].single_flag = 0;
  78. }
  79. if (view==0 && lock==0)
  80. {
  81. if (key[3].long_flag == 1) lock = 1;
  82. key[3].long_flag = 0;
  83. }
  84. else if (view==0 && lock==1)
  85. {
  86. if (key[3].single_flag == 1) lock = 0;
  87. key[3].single_flag = 0;
  88. }
  89. }
  90. void display(void)
  91. {
  92. if (view == 0)
  93. {
  94. LCD_DisplayStringLine(Line1, (uint8_t *)" DATA ");
  95. sprintf(text, " M=%c ", M);
  96. LCD_DisplayStringLine(Line3, (uint8_t *)text);
  97. sprintf(text, " P=%d%% ", P);
  98. LCD_DisplayStringLine(Line4, (uint8_t *)text);
  99. sprintf(text, " V=%.1f ", V);
  100. LCD_DisplayStringLine(Line5, (uint8_t *)text);
  101. LED_On(LD1);
  102. }
  103. else if (view == 1)
  104. {
  105. LCD_DisplayStringLine(Line1, (uint8_t *)" PARA ");
  106. sprintf(text, " R=%d ", R);
  107. LCD_DisplayStringLine(Line3, (uint8_t *)text);
  108. sprintf(text, " K=%d ", K);
  109. LCD_DisplayStringLine(Line4, (uint8_t *)text);
  110. LED_Off(LD1);
  111. }
  112. else if (view == 2)
  113. {
  114. LCD_DisplayStringLine(Line1, (uint8_t *)" RECD ");
  115. sprintf(text, " N=%d ", N);
  116. LCD_DisplayStringLine(Line3, (uint8_t *)text);
  117. sprintf(text, " MH=%.1f ", MH);
  118. LCD_DisplayStringLine(Line4, (uint8_t *)text);
  119. sprintf(text, " ML=%.1f ", ML);
  120. LCD_DisplayStringLine(Line5, (uint8_t *)text);
  121. LED_Off(LD1);
  122. }
  123. if (lock == 1) LED_On(LD3);
  124. else LED_Off(LD3);
  125. }
  1. /* task.h */
  2. #ifndef __TASK_H
  3. #define __TASK_H
  4. #include "main.h"
  5. #include <stdio.h>
  6. #include "led.h"
  7. #include "lcd.h"
  8. #include "fonts.h"
  9. #include "key.h"
  10. void key_pro(void);
  11. void display(void);
  12. #endif /* __TASK_H */
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/427811
推荐阅读
相关标签
  

闽ICP备14008679号