OLED显示屏上多级界面的实现方式

我个人学习到多级界面的实现主要应该是每一级(或者说每一个画面)之间的跳转方式。我从网上的程序理解的大致关键,如下:
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))。其他的基本相似。




猜你喜欢

转载自blog.csdn.net/kangerdong/article/details/82622791