当前位置:   article > 正文

有关stm32oled的按键中断多级菜单并实现对应的功能(基于HAL库)(附带源码)_stm32按键菜单

stm32按键菜单

学习笔记

第一步先实现菜单部分的代码

首先需要定义一个结构体如下

  1. typedef struct
  2. {
  3. uint8_t current;//当前状态索引号
  4. uint8_t next; //向下一个
  5. uint8_t enter; //确定
  6. void (*current_operation)(void); //当前状态应该执行的操作
  7. }MENU;

  1. MENU menu[9]=
  2. {
  3. /*****首界面*************/
  4. {0,1,1,(*menu0)},
  5. /*****第二界面*************/
  6. {1,2, 4,(*menu1)}, //mode1
  7. {2,3, 6,(*menu2)}, //mode2
  8. {3,1, 0,(*menu3)},//BACK
  9. /*****mode1对应的界面*************/
  10. {4,5, 4,(*menu4)},
  11. {5, 4, 3, (*menu5)}, // BACK
  12. /*****mode2对应的界面*************/
  13. {6, 7, 8, (*menu6)}, //三级菜单
  14. {7, 8, 3, (*menu7)}, //三级菜单 BACK
  15. /*****执行对应的函数*************/
  16. {8 , 7, 8, (*temperature_result)},
  17. };

{0,0,1,(*menu)}对应MENU分别结构体中的current,next,enter,void (current_operation)(void)

后续我们将通过按键方式来进行菜单移动,例如我们指定一个按键对应结构体的next,利用另一个变量x来保存值,例如x=menu[x].next,上述程序的第一行的next对应1,按键按下,x=1,然后再次按下按键时menu[1].next=2,x=2,menu[2].next=...以此类推,通过索引的方式来进行,讲的比较模糊,建议看一遍关于结构体的知识
(上图中的temperature_result是温度代码,记得删除)

程序里的*menu0,*menu1.....对应oled的界面程序如下:

  1. void menu0(void)//第一页
  2. {
  3. OLED_ShowString(1,1,"menu");
  4. OLED_ShowString(2,1,"mode1");
  5. OLED_ShowString(3,1,"mode2");
  6. }
  7. void menu1(void)//第二页
  8. {
  9. OLED_ShowString(1,1,"mode1 <");
  10. OLED_ShowString(2,1,"menu2");
  11. OLED_ShowString(4,1,"Back");
  12. }
  13. void menu2(void)//第二页
  14. {
  15. OLED_ShowString(1,1,"menu1");
  16. OLED_ShowString(2,1,"menu2 <");
  17. OLED_ShowString(4,1,"Back");
  18. }
  19. void menu3(void)//第二页
  20. {
  21. OLED_ShowString(1,1,"menu1");
  22. OLED_ShowString(2,1,"menu2");
  23. OLED_ShowString(4,1,"Back <");
  24. }
  25. void menu4(void)//3
  26. {
  27. OLED_ShowString(1,1,"adc <");
  28. OLED_ShowString(4,1,"Back");
  29. }
  30. void menu5(void)//3
  31. {
  32. OLED_ShowString(1,1,"adc");
  33. OLED_ShowString(4,1,"Back <");
  34. }
  35. void menu6(void)//3
  36. {
  37. OLED_ShowString(1,1,"tep <");
  38. OLED_ShowString(4,1,"Back");
  39. }
  40. void menu7(void)//3
  41. {
  42. OLED_ShowString(1,1,"tep");
  43. OLED_ShowString(4,1,"Back <");
  44. }

(更具需要自行修改,对应的oled程序由于太多就直接放源码里了,有需要自行拿或网上查找)

至此oled的菜单界面已经完成的差不多了,接下来进行cubemx进行按键中断配置

首先打开cubemx,对对应的按键引脚进行配置,如图选择GPIO_EXTlx模式(引脚不同对应的中断也有所不同)

改成下降沿触发,上拉模式

开启对应的中断

至此配置完毕

找到stm32h7xx_it.c,这是中断入口

跳转找到中断回调函数(中断完成后会进入中断回调函数)

在里面编写函数

  1. UNUSED(GPIO_Pin);
  2. if(GPIO_Pin==GPIO_PIN_0){//KEY3-PB0-s1 KEY4-PB1-s2
  3. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0){
  4. i=menu[i].next;//按键next按下后的索引号
  5. }
  6. }
  7. if(GPIO_Pin==GPIO_PIN_1){//KEY3-PB0-s1 KEY4-PB1-s2
  8. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0){
  9. i=menu[i].enter;
  10. OLED_Clear();
  11. }
  12. }
  13. OLED_Clear();
  14. menu[i].current_operation();

本人用的是按键KEY3来对应nxet  KEY4对应enter(没有按键消抖,建议自行按键消抖)
最后一行代码是执行当前索引值对应的函数

程序完毕

链接:https://pan.baidu.com/s/1hQEO6DIGKjm6uHfakMwMQw 
提取码:y9w1

(源码仅供参考,仍有很多不足)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/309439
推荐阅读
相关标签
  

闽ICP备14008679号