一:前言
刚做完stm32的健康监测手表,想和大家分享多级菜单这部分,在此分享一篇OLED菜单选择框的运动算法。我用的是stm32f103c8t6,7针SPI的0.96寸的OLED屏。
1.准备工作
想必大家在做到多级菜单这部时已经把SPI硬件的配置和u8g2的移植配置好了吧!如果还没有的话可以去看我的上一篇文章噢。
2.菜单结构体定义
多级菜单使用双向链表结构
typedef struct Function_Obj{ //小菜单结构体
struct Function_Obj *Next; //指向上一个菜单
struct Function_Obj *Last; //指向下一个菜单
struct Function_Obj *Head; //指向链表头
struct Function_Obj *Final; //指向最后一个菜单
//函数指针指向每一个函数具体功能
//Fc f; //传入地址类型
//const uint8_t *img; //菜单图标
uint16_t NowY;
char *Fname; //菜单名
uint16_t ListNum; //列表节点个数
}Function;
3.初始化菜单链表
对于初始化定义,选择定义为全局变量,菜单个数自主选择。对于菜单链接这里使用链表尾插法。
Function* Function_init(char *Fname,uint16_t nowY,Function* Fc,const uint8_t *img) //菜单初始化函数
{
Function *fc=(Function*)malloc(sizeof(Function)); //使用malloc函数给新菜单分配空间,注意需要导入string.h
fc->Fname=Fname; //初始化菜单名
//fc->img=img;
fc->NowY=nowY;
fc->ListNum=1; //当前列表的节点个数初始化为1
fc->Next=NULL;
fc->Last=NULL;
fc->Final=NULL;
fc->Head=Fc;
//fc->f=NULL;
return fc;
}
void Function_List(Function *Head,Function *FinalList) //需传入头节点,和需要尾插的节点
{
if(Head->Next==NULL) //头节点的下一个无任何节点
{
Head->Next=FinalList;
Head->Final=FinalList;
FinalList->Last=Head; //直接将传入的尾节点插入尾部
(Head->ListNum)++; //每插入一个节点个数加1
}
else //有则使用双向链表尾插法
{
FinalList->Last=Head->Final;
Head->Final->Nex