本帖最后由 迷你强 于 2015-11-13 14:49 编辑
在网上查到一篇老外的 关于用 Arduino 如何制作 交互式菜单的文章,非常好奇,但是不会玩。
文章里提到 u8glib 的 菜单库 M2tklib ,和 示例 here 链接 无法打开,顺便把链接贴上去,
菜单库 M2tklib: https://code.google.com/p/m2tklib/
versoin 1.03 版本的示例 http://code.google.com/p/u8glib/ ... duino/Menu/Menu.pde
能翻墙的朋友帮帮忙。 我的空间 老来疯
下面是用 必应 翻译的,自认为无大错,感兴趣的朋友可以研究一下。
U8g 交互式菜单
交互式菜单
如何用 U8glib绘制和处理一个交互式选择菜单?
交互式图形编程提示
注: U8glib还有完整的菜单库, U8glib: M2tklib.。使用 M2tklib 创建菜单和其他数据输入对话框屏幕要 简单得多。此示例的其余部分将构建一个简单的菜单,只能通过使用从 U8glib 的图形基元。
示例
作为一个例子,本教程将演示如何生成一个带有四个条目的选择菜单。菜单将有一个光标栏,允许选择四行之一。以下图片显示光标栏上的最后一个条目:
图片在最后, 不会把他贴在这! 见谅!有谁会教教我
这个here. versoin 1.03 版本的示例也是 Arduino 发行版的一部分。Arduino 的完整源代码这里是可用的。
原理;
所有的 交互 (可变) 图形,应分成两个不同的程序:
draw(): 是画这幅画的过程。通常这样一幅画面将取决于一些全局变量。例如选择菜单将取决于光标栏的位置。
update (): 是一个变量,影响图片的程序。在本例中我们需要一个过程,其中修改光标栏的位置。
下面两个函数必须放置在不同的位置:
Draw() 函数, 必须使用图片的内循环。
update () 函数, 必须在图片循环外使用 。
代码
绘制菜单
下面的代码示例使用"C"API。该代码绘制菜单包括光标栏。光标栏的位置存储在全局变量 menu_current 中。
- //*****************************************
- #define MENU_ITEMS 4char *menu_strings[MENU_ITEMS] = { "First Line", "Second Item", "3333333", "abcdefg" };
- void draw_menu(void) { uint8_t i, h;
- u8g_uint_t w, d;
- u8g_SetFont(&u8g, u8g_font_6x13);
- u8g_SetFontRefHeightText(&u8g);
- u8g_SetFontPosTop(&u8g);
- h = u8g_GetFontAscent(&u8g)-u8g_GetFontDescent(&u8g);
- w = u8g_GetWidth(&u8g); for( i = 0; i < MENU_ITEMS; i++ ) { // draw all menu items
- d = (w-u8g_GetStrWidth(&u8g, menu_strings[i]))/2;
- u8g_SetDefaultForegroundColor(&u8g);
- if ( i == menu_current ) { // current selected menu item
- u8g_DrawBox(&u8g, 0, i*h+1, w, h); // draw cursor bar
- u8g_SetDefaultBackgroundColor(&u8g);
- }
- u8g_DrawStr(&u8g, d, i*h, menu_strings[i]);
- }
- }
- //*********************************************************************
- 更新菜单
- 外部按钮,触摸屏或其他传感器可能修改光标栏位置:
- //********************************************
- void update_menu(void){ if ( up ) {
- menu_current++;
- if ( menu_current >= MENU_ITEMS )
-
- menu_current = 0; } else if ( down ) {
- if ( menu_current == 0 )
- menu_current = MENU_ITEMS;
- menu_current--;
- }
- }
- //*****************************************
- 主程序
- //************************************************************
- draw_menu() and update_menu() are put together in the main procedure:
- ...
- u8g_FirstPage(&u8g);
- do {
- draw_menu(); // inside picture loop
- }
- while( u8g_NextPage(&u8g) );
- update_menu(); // outside picture loop
- ...
- Code Optimization
- //**************************************************************
- 上面的示例中,可以使用菜单,不过,代码还有一个小问题: 他总是刷新菜单。这可能会导致一些闪烁现象。如果已更改光标栏:,它将更好的重绘菜单,
- 主要程序无法更改
- //**************************************************************:
- ...
- if ( menu_redraw_required != 0 ) {
- u8g_FirstPage(&u8g);
-
- do {
- draw_menu(); // inside picture loop
- }
- while( u8g_NextPage(&u8g) );
- menu_redraw_required = 0; // menu updated, reset redraw flag
- }
- update_menu(); // outside picture loop
- ...
- //**************************************************************
- 当然,必须在 update_menu() 程序中设置 menu_redraw_required:
- //***************************************************************
- void update_menu(void){
- if ( up ) {
- menu_current++;
- if ( menu_current >= MENU_ITEMS )
- menu_current = 0;
- menu_redraw_required = 1;
- }
- else if ( down ) {
- if ( menu_current == 0 )
- menu_current = MENU_ITEMS;
- menu_current--;
- menu_redraw_required = 1;
- }
- }
- //*************************************************
复制代码
结论:
菜单和其他交互式图形应实行两个不同的程序:
绘制过程,取决于一些全局变量。
更新过程中,可以修改这些全局变量。 |