学习完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这个界面
在这个新界面再次按下右键,funIndex就是5,显示的是menu31这个界面
现在回想起来还是没有静下心来看代码,我觉得这个代码写的很“高级”,决心一定要搞懂,如果有朋友碰到同样的困惑可以看看。感谢原博主的文章写的很好。
今天我实际测试了一下代码,发现了一些问题,比如上键和左键有效,下键和右键没有响应。检查发现用我的摇杆来控制时,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},
};
这两行代码可以精简为:
table[funIndex].operation();