#include <TinyWireM.h>
#include <Tiny4kOLED.h>
#define BUTTON_UP_PIN PB4 //PB4
#define BUTTON_DOWN_PIN PB3 //PB3
#define BUTTON_ENTER_PIN PB1 //PB5
#include "fontpixelop16b.h"
#include "fontpixelop16.h"
constexpr int NUM_ITEMS = 7;
constexpr int MAX_ITEM_LENGTH = 11;
const char menu_items[NUM_ITEMS][MAX_ITEM_LENGTH] = {
"Health", "Defense", "Accuracy",
"Dexterity", "Move", "Attack", "Damage"
};
int8_t stats[NUM_ITEMS] = {20, 20, 20, 20, 2, 20, 2};
int item_selected = 0;
bool current_screen = false;
bool button_enter_clicked = false;
void setup() {
pinMode(BUTTON_UP_PIN, INPUT_PULLUP);
pinMode(BUTTON_DOWN_PIN, INPUT_PULLUP);
pinMode(BUTTON_ENTER_PIN, INPUT_PULLUP);
oled.begin(128, 64, sizeof(tiny4koled_init_128x64), tiny4koled_init_128x64);
oled.enableChargePump();
oled.setRotation(1);
oled.clear();
oled.on();
oled.setFont(FONTPIXELOP16B);
oled.setCursor(40, 19);
oled.print("Loading...");
delay(2000);
screen_refresh();
}
void screen_refresh() {
oled.clear();
if (current_screen) {
// Stat adjustment screen
oled.setFont(FONTPIXELOP16B);
oled.setCursor(30, 1);
oled.print(menu_items[item_selected]);
draw_stat_value();
} else {
// Menu screen
for (int i = 0; i < 4; i++) {
int index = (item_selected + i) % NUM_ITEMS;
int y = i * 10;
oled.setCursor(10, y);
oled.setFont(index == item_selected ? FONTPIXELOP16B : FONTPIXELOP16);
oled.print(menu_items[index]);
oled.setCursor(90, y);
oled.print(stats[index]);
}
}
}
void draw_stat_value() {
oled.setCursor(50, 36);
oled.print("< ");
oled.print(stats[item_selected]);
oled.print(" >");
}
void blink_stat_value() {
// Clear stat value area by printing spaces
oled.setCursor(35, 35);
oled.print(" "); // Overwrite with spaces to clear
delay(100); // Short delay for the blink effect
// Redraw stat value
draw_stat_value();
}
void loop() {
bool enter_pressed = digitalRead(BUTTON_ENTER_PIN) == LOW;
if (enter_pressed && !button_enter_clicked) {
button_enter_clicked = true;
current_screen = !current_screen; // Toggle between menus
screen_refresh();
}
if (!enter_pressed && button_enter_clicked) {
button_enter_clicked = false;
}
if (digitalRead(BUTTON_UP_PIN) == LOW) {
if (current_screen) {
// Increase stat value with feedback
if (stats[item_selected] < 20) stats[item_selected]++;
blink_stat_value();
} else {
// Navigate up in the menu
item_selected = (item_selected - 1 + NUM_ITEMS) % NUM_ITEMS;
screen_refresh();
}
}
if (digitalRead(BUTTON_DOWN_PIN) == LOW) {
if (current_screen) {
// Decrease stat value with feedback
if (stats[item_selected] > 0) stats[item_selected]--;
blink_stat_value();
} else {
// Navigate down in the menu
item_selected = (item_selected + 1) % NUM_ITEMS;
screen_refresh();
}
}
}