u8glib скроллинг в меню на дисплее 128x32
- Войдите на сайт для отправки комментариев
Доброго времени суток. Собственно,суть проблемы такая - в примере библиотеки u8glib не прописан скроллинг(графический) меню дальше 3-х пунктов для дисплеев меньше 128x64,при скроллинге меню дальше 3-х пунктов которые влезают в дисплей 128x32(i2c),4-й пункт выбирается,но ниже дисплей не прокручивается,т.е выделение уходит за пределы рабочей области,в гугле решения этой проблемы к сожалению не удалось найти. В прошлом году я уже делал меню на этом дисплее(ну как делал,редактировал под свои нужды пример,добавлял команды на выполнение определенного действия при нажатии кнопки и выбранном пункте меню,и впиливал в свой проект),но тогда все работало.К сожалению,после переустановки винды хватился файлов только сейчас и все делать пришлось заново,а вот на меню затуп(
У кого-нибудь есть идеи как можно сделать прокрутку меню вниз при выборе в меню 4 пункта (menu_current = 3) ?
#include "U8glib.h" U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE); // I2C / TWI #define KEY_NONE 0 #define KEY_PREV 1 #define KEY_NEXT 2 #define KEY_SELECT 3 #define KEY_BACK 4 // DOGS102 shield configuration values //uint8_t uiKeyPrev = 2; //uint8_t uiKeyNext = 4; //uint8_t uiKeySelect = 5; //uint8_t uiKeyBack = 3; // DOGM128-Shield configuration values // DOGXL60-Shield configuration values uint8_t uiKeyPrev = 7; uint8_t uiKeyNext = 3; uint8_t uiKeySelect = 2; uint8_t uiKeyBack = 8; uint8_t uiKeyCodeFirst = KEY_NONE; uint8_t uiKeyCodeSecond = KEY_NONE; uint8_t uiKeyCode = KEY_NONE; void uiSetup(void) { // configure input keys pinMode(uiKeyPrev, INPUT_PULLUP); // set pin to input with pullup pinMode(uiKeyNext, INPUT_PULLUP); // set pin to input with pullup pinMode(uiKeySelect, INPUT_PULLUP); // set pin to input with pullup pinMode(uiKeyBack, INPUT_PULLUP); // set pin to input with pullup } void uiStep(void) { uiKeyCodeSecond = uiKeyCodeFirst; if ( digitalRead(uiKeyPrev) == LOW ) uiKeyCodeFirst = KEY_PREV; else if ( digitalRead(uiKeyNext) == LOW ) uiKeyCodeFirst = KEY_NEXT; else if ( digitalRead(uiKeySelect) == LOW ) uiKeyCodeFirst = KEY_SELECT; else if ( digitalRead(uiKeyBack) == LOW ) uiKeyCodeFirst = KEY_BACK; else uiKeyCodeFirst = KEY_NONE; if ( uiKeyCodeSecond == uiKeyCodeFirst ) uiKeyCode = uiKeyCodeFirst; else uiKeyCode = KEY_NONE; } #define MENU_ITEMS 4 const char *menu_strings[MENU_ITEMS] = { "First Line", "Second Item", "3333333", "abcdefg" }; uint8_t menu_current = 0; uint8_t menu_redraw_required = 0; uint8_t last_key_code = KEY_NONE; void drawMenu(void) { uint8_t i, h; u8g_uint_t w, d; u8g.setFont(u8g_font_6x13); u8g.setFontRefHeightText(); u8g.setFontPosTop(); h = u8g.getFontAscent()-u8g.getFontDescent(); w = u8g.getWidth(); for( i = 0; i < MENU_ITEMS; i++ ) { d = (w-u8g.getStrWidth(menu_strings[i]))/2; u8g.setDefaultForegroundColor(); if ( i == menu_current ) { u8g.drawBox(0, i*h+1, w, h); u8g.setDefaultBackgroundColor(); } u8g.drawStr(d, i*h, menu_strings[i]); } } void updateMenu(void) { if ( uiKeyCode != KEY_NONE && last_key_code == uiKeyCode ) { return; } last_key_code = uiKeyCode; switch ( uiKeyCode ) { case KEY_NEXT: menu_current++; if ( menu_current >= MENU_ITEMS ) menu_current = 0; menu_redraw_required = 1; break; case KEY_PREV: if ( menu_current == 0 ) menu_current = MENU_ITEMS; menu_current--; menu_redraw_required = 1; break; } } void setup() { // rotate screen, if required // u8g.setRot180(); uiSetup(); // setup key detection and debounce algorithm menu_redraw_required = 1; // force initial redraw } void loop() { uiStep(); // check for key press if ( menu_redraw_required != 0 ) { u8g.firstPage(); do { drawMenu(); } while( u8g.nextPage() ); menu_redraw_required = 0; } updateMenu(); // update menu bar }