转自: https://blog.csdn.net/calmuse/article/details/79346742
我个人学习到多级界面的实现主要应该是每一级(或者说每一个画面)之间的跳转方式。我从网上的程序理解的大致关键,如下:
1.首先定义一个结构体
typedef struct
{
u8 current;//当前状态索引号
u8 next; //向下一个
u8 enter; //确定
void (*current_operation)(void); //当前状态应该执行的操作
} Menu_table;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
结构体里包含了当前的状态索引号、按下next键后状态的索引号、按下确定键按键后状态的索引号,(这实际上取决于你为这个界面设计了多少个按键,我这里因为板子上只留了两个按键,所以只设计了next和enter两个按键),以及当前状态对应的函数,这个函数确定了你这一级的界面是什么样子的,我一开始对此不是很了解。
2.接下来我来介绍索引号以及索引号的使用方法,这是程序思想的关键。先定义一个结构体数组
Menu_table table[56]=
{
{0,0,1,(*fun0)},//一级界面
{1,2,0,(*fun1)},//二级界面第一行
{2,3,4,(*fun2)},//二级界面第二行
{3,1,5,(*fun3)},//二级界面第三行
{4,4,1,(*fun4)},//三级界面
{5,5,1,(*fun5)},//三级界面
};
u8 func_index = 0;//主程序此时所在界面的索引值
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
再定义这个函数,这是索引号随着按键按下改变的执行部分。
void Menu_key_set(void)
{
Get_key_next = get_button(button1);
Get_key_enter = get_button(button2);
if(Get_key_next == 1)
{
func_index=table[func_index].next;
OLED_Clear();
}
if(Get_key_enter == 1)
{
func_index=table[func_index].enter;
OLED_Clear();
}
current_operation_index=table[func_index].current_operation;
(*current_operation_index)();//执行当前操作函数
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
这个结构体数组,实际上就包含了界面设计的精髓,首先,我的思想是,首先我们在主界面(主界面只显示开机界面),这时按下next无反应,所以按下next,索引号仍然变为0,但按下enter键,界面进入第二级界面(第二级界面有三行,EXIT、function1、function2),在哪一行,哪一行高亮。所以数组中第一个是(0,0,1,(fun0)),同理可得,进入第二行后,想将光标(假装是光标)移动,则按下next,令其索引号为3,按下enter,令其索引号为0(即是退回到了第一级界面了),所以数组中第二个是(1,2,0,(fun1))。其他的基本相似。