OLED 多级目录-树的方式实现

目录结构:

                                                     (箭头应都为双向,表示是双向链表)

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;
        }
    }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值