在比赛中我们要实现多种不同的题目时,在这个时候我们就需要多级菜单来依次实现各个功能,有俩种选择,OLED与串口屏,今天我学习的是OLED多级菜单,可用来完成各个功能的实现,这是我们队对电赛的准备工作。
文章后面有完整代码。
一,引脚介绍
GND 电源地
VCC 接5V或3.3v电源
SCL 接PB5(SCL)
SDA 接PB7(SDA)
二,原理分析
代码理解:
在.h文件里面定义结构体,里面存放基本需求。在.c文件定义结构体数组,每一个数组元素代表一种选择的情况。
才开始进去的时候,uint8_t func_index = 0所以当前的索引就为0,而当按键按下的时候,即enter被触发,此时进入到【1】也就是二级菜单。以此类推,此时的索引为1,所以位于1界面,按下key0则将next给func_index,则下一个则指向2对应的界面,紧接着如果wake_up被按下,enter触发,则进入到6所对应的函数。如果没有按下key0【相当于未进行next】,此时按下wake_up则进行入到5页面。
结构体
typedef struct
{
uint8_t current; //???????????
uint8_t next; //???°?
uint8_t enter; //???????
void (*current_operation)(void);//??????????е????
}Menu_table;
Menu_table table[19] =
{
{0, 0, 1, (*fun0)}, //???????
{1,2,7,(*fun1)},
{2,1,3,(*fun2)},
{3,4,11,(*fun3)},
{4,5,12,(*fun4)},
{5,6,13,(*fun5)},
{6,3,14,(*fun6)},
{7,8,15,(*fun7)},
{8,9,16,(*fun8)},
{9,10,17,(*fun9)},
{10,7,18,(*fun10)},
{11,11,1,(*fun11)},
{12,12,1,(*fun12)},
{13,13,1,(*fun13)},
{14,14,1,(*fun14)},
{15,15,1,(*fun15)},
{16,16,1,(*fun16)},
{17,17,1,(*fun17)},
{18,18,1,(*fun18)},
};
三,主要代码
menu.h
#ifndef __MENU_H
#define __MENU_H
#include "stm32f10x.h"
extern u8 taskFlag;
//??ж???
void Menu_key_set(void);
void menu1_func(void);
void menu2_func(void);
void menu3_func(void);
void menu4_func(void);
void fun0(void);
void fun1(void);
void fun2(void);
void fun3(void);
void fun4(void);
void fun5(void);
void fun6(void);
void fun7(void);
void fun8(void);
void fun9(void);
void fun10(void);
void fun11(void);
void fun12(void);
void fun13(void);void fun14(void);
void fun15(void);
void fun16(void);
void fun17(void);
void fun18(void);
typedef struct
{
uint8_t current; //???????????
uint8_t next; //???°?
uint8_t enter; //???????
void (*current_operation)(void);//??????????е????
}Menu_table;
extern uint8_t Data_current[8];
#endif /* __MENU_H */
menu.c
Menu_table table[19] =
{
{0, 0, 1, (*fun0)}, //???????
{1,2,7,(*fun1)},
{2,1,3,(*fun2)},
{3,4,11,(*fun3)},
{4,5,12,(*fun4)},
{5,6,13,(*fun5)},
{6,3,14,(*fun6)},
{7,8,15,(*fun7)},
{8,9,16,(*fun8)},
{9,10,17,(*fun9)},
{10,7,18,(*fun10)},
{11,11,1,(*fun11)},
{12,12,1,(*fun12)},
{13,13,1,(*fun13)},
{14,14,1,(*fun14)},
{15,15,1,(*fun15)},
{16,16,1,(*fun16)},
{17,17,1,(*fun17)},
{18,18,1,(*fun18)},
};
void Menu_key_set(void)
{
key_state = KEY_Scan(0);
if (key_state == 1)
{
OLED_Clear();
func_index = table[func_index].next;
}
if(key_state == 2)
{
TIM_SetCompare1(TIM3,14.5);
}
if(key_state == 3)
{
OLED_Clear();
func_index = table[func_index].enter;
}
current_operation_index = table[func_index].current_operation;
(*current_operation_index)();
}
四。完整代码
链接:https://pan.baidu.com/s/11qmBzyHP8_JG4XrbMMy9dg
提取码:1234
谢谢观看。