ARDUINO Меню на дисплее 12864 без I2C (ST7920)

Cancer_litus

✩✩✩✩✩✩✩
27 Июл 2023
5
0
Оформи код соответствующим тэгом
Всем привет
нужна помощь в создании меню на дисплее 12864 на ST7920 через библиотеку u8glib

если есть возможность подскажите пожалуйста как реализовать погружение в меню
с базовой менюшкой разобрался а с погружением проблемы

код

#define CLK 3
#define DT 4
#define SW 2
#include "GyverEncoder.h" //энкодер
Encoder enc1(CLK, DT, SW); // тоже энкодер
#include "U8glib.h"
#include "cyr_6x10.h" //ярусский подключил
int value = 0; //энкодер
U8GLIB_ST7920_128X64_4X u8g(10);
#define KEY_NONE 0
#define KEY_PREV 1
#define KEY_NEXT 2
#define KEY_SELECT 3
#define KEY_BACK 4
uint8_t uiKeyCodeFirst = KEY_NONE;
uint8_t uiKeyCodeSecond = KEY_NONE;
uint8_t uiKeyCode = KEY_NONE;



void uiStep(void) {

uiKeyCodeSecond = uiKeyCodeFirst; //жмем кнопку крутим энкодер
if (enc1.isRight())
{
uiKeyCodeFirst = KEY_NEXT;
uiKeyCode = uiKeyCodeFirst;
}
else if (enc1.isLeft())
{
uiKeyCodeFirst = KEY_PREV;
uiKeyCode = uiKeyCodeFirst;
}
else if (enc1.isPress())
{
uiKeyCodeFirst = KEY_SELECT;
uiKeyCode = uiKeyCodeFirst;
}
else
{
uiKeyCodeFirst = KEY_NONE;
uiKeyCode = uiKeyCodeFirst;
}
}

#define MENU_1 4 // базовая страница меню
const char *menu_strings[MENU_1] = { "Первый", "Second Item", "3333333", "QWERTY" };
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(cyr_6x10);
u8g.setFontRefHeightText();
u8g.setFontPosTop();

h = u8g.getFontAscent()-u8g.getFontDescent();
w = u8g.getWidth();
for( i = 0; i < MENU_1; i++ ) {
d = (w-u8g.getStrWidth(menu_strings))/2;
u8g.setDefaultForegroundColor();
if ( i == menu_current ) {
u8g.drawBox(0, i*h+1, w, h);
u8g.setDefaultBackgroundColor();
}
u8g.drawStr(d, i*h, menu_strings);
}
}
void updateMenu_1(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_1 )
menu_current = 0;
menu_redraw_required = 1;
break;
case KEY_PREV:
if ( menu_current == 0 )
menu_current = MENU_1;
menu_current--;
menu_redraw_required = 1;
break;
case KEY_SELECT:
break;
}
}

void setup() {
enc1.setType(TYPE1);
enc1.setFastTimeout(50);

menu_redraw_required = 1;
}
void loop() {
enc1.tick();

uiStep();

if ( menu_redraw_required != 0 ) {
u8g.firstPage();
do {
drawMenu();
} while( u8g.nextPage() );
menu_redraw_required = 0;
}
updateMenu_1();

}


погружение получилось но хочется увидеть менее топорные решения))