赞
踩
学习笔记
第一步先实现菜单部分的代码
首先需要定义一个结构体如下
- typedef struct
- {
- uint8_t current;//当前状态索引号
- uint8_t next; //向下一个
- uint8_t enter; //确定
- void (*current_operation)(void); //当前状态应该执行的操作
- }MENU;
- MENU menu[9]=
- {
- /*****首界面*************/
- {0,1,1,(*menu0)},
- /*****第二界面*************/
- {1,2, 4,(*menu1)}, //mode1
- {2,3, 6,(*menu2)}, //mode2
- {3,1, 0,(*menu3)},//BACK
- /*****mode1对应的界面*************/
- {4,5, 4,(*menu4)},
- {5, 4, 3, (*menu5)}, // BACK
- /*****mode2对应的界面*************/
- {6, 7, 8, (*menu6)}, //三级菜单
- {7, 8, 3, (*menu7)}, //三级菜单 BACK
-
- /*****执行对应的函数*************/
- {8 , 7, 8, (*temperature_result)},
-
- };
{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的界面程序如下:
- void menu0(void)//第一页
- {
- OLED_ShowString(1,1,"menu");
- OLED_ShowString(2,1,"mode1");
- OLED_ShowString(3,1,"mode2");
-
-
- }
-
- void menu1(void)//第二页
- {
- OLED_ShowString(1,1,"mode1 <");
- OLED_ShowString(2,1,"menu2");
- OLED_ShowString(4,1,"Back");
-
- }
- void menu2(void)//第二页
- {
- OLED_ShowString(1,1,"menu1");
- OLED_ShowString(2,1,"menu2 <");
- OLED_ShowString(4,1,"Back");
-
- }
-
-
-
- void menu3(void)//第二页
- {
- OLED_ShowString(1,1,"menu1");
- OLED_ShowString(2,1,"menu2");
- OLED_ShowString(4,1,"Back <");
-
- }
- void menu4(void)//第3页
- {
- OLED_ShowString(1,1,"adc <");
- OLED_ShowString(4,1,"Back");
-
- }
- void menu5(void)//第3页
- {
- OLED_ShowString(1,1,"adc");
- OLED_ShowString(4,1,"Back <");
-
- }
- void menu6(void)//第3页
- {
- OLED_ShowString(1,1,"tep <");
- OLED_ShowString(4,1,"Back");
- }
- void menu7(void)//第3页
- {
- OLED_ShowString(1,1,"tep");
- OLED_ShowString(4,1,"Back <");
-
- }
(更具需要自行修改,对应的oled程序由于太多就直接放源码里了,有需要自行拿或网上查找)
至此oled的菜单界面已经完成的差不多了,接下来进行cubemx进行按键中断配置
首先打开cubemx,对对应的按键引脚进行配置,如图选择GPIO_EXTlx模式(引脚不同对应的中断也有所不同)
改成下降沿触发,上拉模式
开启对应的中断
至此配置完毕
找到stm32h7xx_it.c,这是中断入口
跳转找到中断回调函数(中断完成后会进入中断回调函数)
在里面编写函数
-
- UNUSED(GPIO_Pin);
- if(GPIO_Pin==GPIO_PIN_0){//KEY3-PB0-s1 KEY4-PB1-s2
-
- if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0){
-
- i=menu[i].next;//按键next按下后的索引号
-
- }
- }
-
- if(GPIO_Pin==GPIO_PIN_1){//KEY3-PB0-s1 KEY4-PB1-s2
-
- if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0){
-
- i=menu[i].enter;
- OLED_Clear();
- }
- }
-
-
- OLED_Clear();
- menu[i].current_operation();
-
-
本人用的是按键KEY3来对应nxet KEY4对应enter(没有按键消抖,建议自行按键消抖)
最后一行代码是执行当前索引值对应的函数
程序完毕
链接:https://pan.baidu.com/s/1hQEO6DIGKjm6uHfakMwMQw
提取码:y9w1
(源码仅供参考,仍有很多不足)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。