目录结构:

(箭头应都为双向,表示是双向链表)
VS模拟实现:
1.数据结构:
/*-------------------Lamp状态结构体------------------*/
struct Lamp_Status {
uint8_t status;
uint8_t Light;
uint16_t Speed;
uint8_t Clock;
uint8_t Clock_Hour;
uint8_t Clock_Min;
uint8_t Clock_Sec;
}Lamp_Status;
/*-------------------------------------------------*/
/*------------------目录界面结构体------------------*/
typedef struct menu_item {
char name[10]; //项的姓名
struct menu_item* parent; //父节点
struct menu_item* children[4]; //子节点数组
uint8_t child_count; //子节点数量
void (*function)(void); //回调函数
} menu_item_t;
2.界面显示函数:
void menu_0(void) //设置界面
{
cout << "1.手动模式" << endl;
cout << "2.自动模式" << endl;
cout << "3.夜灯模式" << endl;
cout << "4.闹钟模式" << endl;
}
void menu_1(void) //模式一界面
{
cout << "1.显示模式" << endl;
cout << "2.调整亮度" << endl;
}
void menu_1_1(void) //模式一显示模式
{
Lamp_Status.status ? cout << "状态:开启" << endl : cout << "状态:关闭" << endl;
cout << "亮度:" << Lamp_Status.Light << "%" << endl;
cout << "PWM:" << Lamp_Status.Speed << endl;
cout << "Mode:" << "模式一" << endl;
}
void menu_1_2(void) //模式一调整亮度
{
cout << "亮度:" << Lamp_Status.Light << "%" << endl;
cout << "PWM:" << Lamp_Status.Speed << endl;
}
void menu_2(void) //模式二自动模式
{
Lamp_Status.status ? cout << "状态:开启" << endl : cout << "状态:关闭" << endl;
cout << "亮度:" << Lamp_Status.Light << "%" << endl;
cout << "PWM:" << Lamp_Status.Speed << endl;
cout << "Mode:" << "模式二" << endl;
}
void menu_3(void) //模式三夜灯模式
{
Lamp_Status.Light = 20;
Lamp_Status.Speed = 200;
Lamp_Status.status ? cout << "状态:开启" << endl : cout << "状态:关闭" << endl;
cout << "亮度:" << Lamp_Status.Light << "%" << endl;
cout << "PWM:" << Lamp_Status.Speed << endl;
cout << "Mode:" << "模式三" << endl;
}
void menu_4(void) //模式四闹钟模式
{
cout << "1.当前定时" << endl;
cout << "2.闹钟设置" << endl;
}
void menu_4_1(void) //模式四当前闹钟状态模式
{
if (Lamp_Status.Clock)
{
cout << "倒计时:" << Lamp_Status.Clock_Hour << ":" << Lamp_Status.Clock_Min << ":" << Lamp_Status.Clock_Sec << endl;
}
else
{
cout << "闹钟关闭" << endl;
}
}
void menu_4_2(void) //模式四设置闹钟状态模式
{
cout << "闹钟设置" << endl;
}
单片机驱动OLED时只需要将cout输出改为OLED输出即可!!!!!!!
3.成员创建,树的构建以及初始化
/*------------------------------创建目录实例--------------------------*/
menu_item_t Menu_0;
menu_item_t Menu_1;
menu_item_t Menu_1_1;
menu_item_t Menu_1_2;
menu_item_t Menu_2;
menu_item_t Menu_3;
menu_item_t Menu_4;
menu_item_t Menu_4_1;
menu_item_t Menu_4_2;
menu_item_t* temp = &Menu_0;
/*--------------------------------------------------------------------*/
/*-------------------------成员初始化,以及树的构建----------------------*/
void Menu_Init(void) {
/*---------------------------一级目录------------------------------*/
Menu_Set(&Menu_0, "Menu0", NULL, 4, menu_0);
Menu_0.children[0] = &Menu_1;
Menu_0.children[1] = &Menu_2;
Menu_0.children[2] = &Menu_3;
Menu_0.children[3] = &Menu_4;
/*---------------------------二级目录------------------------------*/
Menu_Set(&Menu_1, "Menu1", &Menu_0, 2, menu_1);
Menu_Set(&Menu_2, "Menu1", &Menu_0, 0, menu_2);
Menu_Set(&Menu_3, "Menu1", &Menu_0, 0, menu_3);
Menu_Set(&Menu_4, "Menu1", &Menu_0, 2, menu_4);
Menu_1.children[0] = &Menu_1_1;
Menu_1.children[1] = &Menu_1_2;
Menu_4.children[0] = &Menu_4_1;
Menu_4.children[1] = &Menu_4_2;
/*---------------------------三级目录------------------------------*/
Menu_Set(&Menu_1_1, "Menu1_1_1", &Menu_1, 0, menu_1_1);
Menu_Set(&Menu_1_2, "Menu1_1_2", &Menu_1, 0, menu_1_2);
Menu_Set(&Menu_4_1, "Menu1_4_1", &Menu_4, 0, menu_4_1);
Menu_Set(&Menu_4_2, "Menu1_4_2", &Menu_4, 0, menu_4_2);
}
4.目录返回上一级/进入下一级:
int main()
{
Menu_Init();
cout << "Prosse Start!!!\n";
uint8_t Key = 0;
while (1)
{
temp->function();
cout << "选择界面\"1~4 \"/或者按'b'返回" << endl;
scanf_s("%c",&Key,1);
getchar();
if (Key == 'b')
{
if (temp->parent != NULL)
{
temp = temp->parent;
}
else
{
cout << "已是最初界面,无法返回!!!" << endl;
}
}
else if (Key == '1' || Key == '2' || Key == '3' || Key == '4')
{
if ((Key-48) <= temp->child_count)
{
temp = temp->children[Key - 49];
}
else
{
cout << "没有此子目录" << endl;
}
}
else
{
cout << "没有此选项,请重新选择!" << endl;
}
}
}
大概逻辑就是这样,后续需要设置亮度/时钟可以再加相应代码,这个代码只实现了不同目录的切换
完整代码:
#include <iostream>
#include <string.h>
#include <windows.h>
#include "type.h"
using namespace std;
struct Lamp_Status {
uint8_t status;
uint8_t Light;
uint16_t Speed;
uint8_t Clock;
uint8_t Clock_Hour;
uint8_t Clock_Min;
uint8_t Clock_Sec;
}Lamp_Status;
void Lamp_Init(void)
{
Lamp_Status.Light = 50;
Lamp_Status.Speed = 500;
Lamp_Status.status = 1;
}
typedef struct menu_item {
char name[10]; //项的姓名
struct menu_item* parent; //父节点
struct menu_item* children[4]; //子节点数组
uint8_t child_count; //子节点数量
void (*function)(void); //回调函数
} menu_item_t;
/*------------------创建目录实例------------------*/
menu_item_t Menu_0;
menu_item_t Menu_1;
menu_item_t Menu_1_1;
menu_item_t Menu_1_2;
menu_item_t Menu_2;
menu_item_t Menu_3;
menu_item_t Menu_4;
menu_item_t Menu_4_1;
menu_item_t Menu_4_2;
menu_item_t* temp = &Menu_0;
/*-------------------------------------------------*/
void Menu_Set(menu_item_t* item,const char * name,menu_item_t* parent,uint8_t child_count, void (*function)(void))
{
memcpy(item->name,name,strlen(name));
item->parent = parent;
item->child_count = child_count;
item->function = function;
}
void menu_0(void) //设置界面
{
cout << "1.手动模式" << endl;
cout << "2.自动模式" << endl;
cout << "3.夜灯模式" << endl;
cout << "4.闹钟模式" << endl;
}
void menu_1(void) //模式一界面
{
cout << "1.显示模式" << endl;
cout << "2.调整亮度" << endl;
}
void menu_1_1(void) //模式一显示模式
{
Lamp_Status.status ? cout << "状态:开启" << endl : cout << "状态:关闭" << endl;
cout << "亮度:" << Lamp_Status.Light << "%" << endl;
cout << "PWM:" << Lamp_Status.Speed << endl;
cout << "Mode:" << "模式一" << endl;
}
void menu_1_2(void) //模式一调整亮度
{
cout << "亮度:" << Lamp_Status.Light << "%" << endl;
cout << "PWM:" << Lamp_Status.Speed << endl;
}
void menu_2(void) //模式二自动模式
{
Lamp_Status.status ? cout << "状态:开启" << endl : cout << "状态:关闭" << endl;
cout << "亮度:" << Lamp_Status.Light << "%" << endl;
cout << "PWM:" << Lamp_Status.Speed << endl;
cout << "Mode:" << "模式二" << endl;
}
void menu_3(void) //模式三夜灯模式
{
Lamp_Status.Light = 20;
Lamp_Status.Speed = 200;
Lamp_Status.status ? cout << "状态:开启" << endl : cout << "状态:关闭" << endl;
cout << "亮度:" << Lamp_Status.Light << "%" << endl;
cout << "PWM:" << Lamp_Status.Speed << endl;
cout << "Mode:" << "模式三" << endl;
}
void menu_4(void) //模式四闹钟模式
{
cout << "1.当前定时" << endl;
cout << "2.闹钟设置" << endl;
}
void menu_4_1(void) //模式四当前闹钟状态模式
{
if (Lamp_Status.Clock)
{
cout << "倒计时:" << Lamp_Status.Clock_Hour << ":" << Lamp_Status.Clock_Min << ":" << Lamp_Status.Clock_Sec << endl;
}
else
{
cout << "闹钟关闭" << endl;
}
}
void menu_4_2(void) //模式四设置闹钟状态模式
{
cout << "闹钟设置" << endl;
}
void Menu_Init(void) {
/*---------------------------一级目录------------------------------*/
Menu_Set(&Menu_0, "Menu0", NULL, 4, menu_0);
Menu_0.children[0] = &Menu_1;
Menu_0.children[1] = &Menu_2;
Menu_0.children[2] = &Menu_3;
Menu_0.children[3] = &Menu_4;
/*---------------------------二级目录------------------------------*/
Menu_Set(&Menu_1, "Menu1", &Menu_0, 2, menu_1);
Menu_Set(&Menu_2, "Menu1", &Menu_0, 0, menu_2);
Menu_Set(&Menu_3, "Menu1", &Menu_0, 0, menu_3);
Menu_Set(&Menu_4, "Menu1", &Menu_0, 2, menu_4);
Menu_1.children[0] = &Menu_1_1;
Menu_1.children[1] = &Menu_1_2;
Menu_4.children[0] = &Menu_4_1;
Menu_4.children[1] = &Menu_4_2;
/*---------------------------三级目录------------------------------*/
Menu_Set(&Menu_1_1, "Menu1_1_1", &Menu_1, 0, menu_1_1);
Menu_Set(&Menu_1_2, "Menu1_1_2", &Menu_1, 0, menu_1_2);
Menu_Set(&Menu_4_1, "Menu1_4_1", &Menu_4, 0, menu_4_1);
Menu_Set(&Menu_4_2, "Menu1_4_2", &Menu_4, 0, menu_4_2);
}
int main()
{
Menu_Init();
cout << "Prosse Start!!!\n";
uint8_t Key = 0;
while (1)
{
temp->function();
cout << "选择界面\"1~4 \"/或者按'b'返回" << endl;
scanf_s("%c",&Key,1);
getchar();
if (Key == 'b')
{
if (temp->parent != NULL)
{
temp = temp->parent;
}
else
{
cout << "已是最初界面,无法返回!!!" << endl;
}
}
else if (Key == '1' || Key == '2' || Key == '3' || Key == '4')
{
if ((Key-48) <= temp->child_count)
{
temp = temp->children[Key - 49];
}
else
{
cout << "没有此子目录" << endl;
}
}
else
{
cout << "没有此选项,请重新选择!" << endl;
}
}
}
6534

被折叠的 条评论
为什么被折叠?



