学习完OLED的显示之后,不满足于写段文字,显示个图像啥的,就想做个菜单,为以后做项目做准备,在本站已经有博主提供了很好的程序代码和比较详细的讲解,比如这篇摇杆操作OLED多级菜单 这个博客的源代码链接在这里

unsigned char funIndex = 0;

KEY_TABLE table[9] =
{
  {0, 0, 1, 0, 2, (*menu11)},
  {1, 0, 1, 1, 4, (*menu12)},
  {2, 2, 3, 0, 5, (*menu21)},
  {3, 2, 3, 0, 7, (*menu22)},
  {4, 4, 4, 1, 4, (*menu23)},
  {5, 5, 6, 2, 5, (*menu31)},
  {6, 5, 6, 2, 6, (*menu32)},
  {7, 7, 8, 3, 7, (*menu33)},
  {8, 7, 8, 3, 8, (*menu34)},
};

unsigned char keyScan(void)
{
  static unsigned char keyUp = 1;

  valueX = analogRead(pinX);
  valueY = analogRead(pinY);

  if (keyUp && ((valueX <= 10) || (valueX >= 1010) || (valueY <= 10) || (valueY >= 1010)))
  {
    delay(10);
    keyUp = 0;
    if (valueX <= 10)return 1;
    else if (valueX >= 1010)return 2;
    else if (valueY <= 10)return 3;
    else if (valueY >= 1010)return 4;
  } else if ((valueX > 10) && (valueX < 1010) && (valueY > 10) && (valueY < 1010))keyUp = 1;
  return 0;
}
void loop()
{
  keyValue = keyScan();

  if (keyValue != 0) //每发生一次有效按键就根据按键功能获取对应函数并执行
  {
    switch (keyValue)//获取按键对应序号
    {
      case 1: funIndex = table[funIndex].right; break;
      case 2: funIndex = table[funIndex].left; break;
      case 3: funIndex = table[funIndex].down; break;
      case 4: funIndex = table[funIndex].up; break;
    }
    current = table[funIndex].operation;//根据需要获取对应需要执行的函数
    (*current)();//执行获取到的函数
  }
}

以上是截取的部分代码内容,也是我当初看不明白的地方。上下左右4个键,返回的键值keyValue也是1-4,但是funIndex的值是从0-8,怎么匹配的上呢。

现在解释一下,首先funIndex的初始值是0,假设说现在按下的是右键得到的是2,显示的是menu21这个界面

arduino 菜单 架构 arduino menu_arduino 菜单 架构


arduino 菜单 架构 arduino menu_摇杆_02


在这个新界面再次按下右键,funIndex就是5,显示的是menu31这个界面

arduino 菜单 架构 arduino menu_摇杆_03


arduino 菜单 架构 arduino menu_右键_04


现在回想起来还是没有静下心来看代码,我觉得这个代码写的很“高级”,决心一定要搞懂,如果有朋友碰到同样的困惑可以看看。感谢原博主的文章写的很好。

今天我实际测试了一下代码,发现了一些问题,比如上键和左键有效,下键和右键没有响应。检查发现用我的摇杆来控制时,analogRead得到的最大值是978,是无法超过1010的,所以需要修改原代码里面的值。

KEY_TABLE table[9] =
 {
 {0, 0, 1, 0, 2, (*menu11)},
 {1, 0, 1, 1, 4, (*menu12)},
 {2, 2, 3, 0, 5, (*menu21)},
 {3, 2, 3, 0, 7, (*menu22)},
 {4, 4, 4, 1, 4, (*menu23)},
 {5, 5, 6, 2, 5, (*menu31)},
 {6, 5, 6, 2, 6, (*menu32)},
 {7, 7, 8, 3, 7, (*menu33)},
 {8, 7, 8, 3, 8, (*menu34)},
 };


以上代码可以精简为:

KEY_TABLE table[9] =
 {
 {0, 0, 1, 0, 2, menu11},
 {1, 0, 1, 1, 4, menu12},
 {2, 2, 3, 0, 5, menu21},
 {3, 2, 3, 0, 7, menu22},
 {4, 4, 4, 1, 4, menu23},
 {5, 5, 6, 2, 5, menu31},
 {6, 5, 6, 2, 6, menu32},
 {7, 7, 8, 3, 7, menu33},
 {8, 7, 8, 3, 8, menu34},
 };

arduino 菜单 架构 arduino menu_arduino 菜单 架构_05


这两行代码可以精简为:

table[funIndex].operation();