标准文字LCD菜单系统


10

是否有用于C的简单菜单系统的模式,用于文本LCD。我发现自己经常重写代码来处理简单的文本LCD菜单。

我发现大多数系统都有一个主菜单和一些子菜单,选择这些菜单后,您便可以在最小和最大值之间设置参数。

理想情况下,可以使用4个简单的键(例如Enter,Cancel,Up和Down)浏览此菜单系统。

在我的应用程序中,我使用的是2行x 16字符的文本LCD,尽管理想的解决方案应该可以应用于任何NxM显示器。


与电子设计无关!问题将结束。
莱昂·海勒

5
我对编程问题是否也适用于嵌入式系统感到印象深刻。也许我错了...
mjh2007

我也有类似的印象。是否有关于此的官方说明?
AndrejaKo 2011年

根据常见问题解答,只有非常低级的东西。这个问题是关于用户界面的。
莱昂·海勒

3
+1我也很感兴趣...我总是手工酿造它们。您使用的是控制台输出还是NxM字符显示...。不是我有一个答案。环形缓冲区,无需上/下和下/后退。
肯尼,

Answers:


5

我在C语言中用于菜单系统的模式是这样的:

struct menuitem
{
  const char *name; // name to be rendered
  functionPointer handlerFunc; // handler for this leaf node (optionally NULL)
  struct menu *child; // pointer to child submenu (optionally NULL)
};

struct menu
{
  struct menu *parent; // pointer to parent menu
  struct **menuitem; // array of menu items, NULL terminated
};

然后,我声明一个的数组,menu每个数组包含menuitems和指向child子菜单的指针。上下移动当前选定的menuitems 数组。后退移至parent菜单,前进/选择后移至child子菜单或handlerFunc为叶节点调用a 。

渲染菜单仅涉及遍历菜单项。

这种方案的优点是它是完全由数据驱动的,菜单结构可以在ROM中静态声明,而与渲染器和处理函数无关。


2

托比的答案是一个很好的起点。提到的结构假定菜单是静态的,您只需在菜单中浏览即可。

如果您需要动态菜单(例如,显示某些值,例如温度,时间等),则需要能够生成该菜单。

一种方法是注册一个函数来构建您的字符串。

struct menuitem
{
  const char *name; // name to be rendered
  const char * (*builderFunc)( const char *name );  // callback to generate string, if not null.
  functionPointer handlerFunc; // handler for this leaf node (optionally NULL)
  struct menu *child; // pointer to child submenu (optionally NULL)
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.