#include <LiquidCrystal_I2C.h>
#define PbUp 2
#define PbOk 3
#define PbDown 4
// Lcd
LiquidCrystal_I2C lcd(0x27, 20, 4); // I2C address 0x27, 16 column and 2 rows
// declarar array
# define MenuItems 16 // tem de ser em multiplos de 4
char Items[MenuItems][18] {"Item 00", "Item 01", "Item 02", "Item 03", "Item 04", "Item 05", "Item 06",
"Item 07", "Item 08", "Item 09", "Item 10", "Item 11", "Item 12", "Item 13", "Item 14", "Item 15"
};
int Page = 0;
int CurrPage = -1;
int SelItem = 0; // item seleccionado
int IdScreen = 0; // tela apresentada
int CursorPos = 0; // posição do curor
// functions
void PrintPage();
void CalcPage(); // Calcula o screen e a poscição do cursor
void PrintCursor();
//#######################################################################################################
void setup()
{
// LCD
Serial.begin(115200); // Serial
lcd.init();
lcd.backlight();
// Set encoder pins as inputs
pinMode(PbUp, INPUT_PULLUP);
pinMode(PbOk, INPUT_PULLUP);
pinMode(PbDown, INPUT_PULLUP);
CalcPage();
delay(1);
}
//#######################################################################################################
void loop()
{
if (digitalRead(PbDown) == LOW && SelItem < MenuItems - 1)
{
SelItem++;
//Serial.println(SelItem);
CalcPage();
while (digitalRead(PbDown) == LOW);
}
if (digitalRead(PbUp) == LOW && SelItem > 0)
{
SelItem--;
//Serial.println(SelItem);
CalcPage();
while (digitalRead(PbUp) == LOW);
}
}
//#######################################################################################################
void PrintPage() // imprime no Lcd 4 items de cada vez em funcao do IdScreen
{
int Pos = Page * 4;
lcd.setCursor(1, 0);
lcd.print(Items[Pos + 0]);
lcd.setCursor(1, 1);
lcd.print(Items[Pos + 1]);
lcd.setCursor(1, 2);
lcd.print(Items[Pos + 2]);
lcd.setCursor(1, 3);
lcd.print(Items[Pos + 3]);
}
//#######################################################################################################
void CalcPage() // Calcula o screen e a poscição do cursor
{
Page = int(SelItem / 4);
if (CurrPage != Page)
{
// muda de página
PrintPage();
CurrPage = Page;
CursorPos = SelItem - (4 * Page); // posição do curor
Serial.print("Cursor...: ");
Serial.println(CursorPos);
PrintCursor();
}
else
{
// muda posição do cursor
CursorPos = SelItem - (4 * Page); // posição do curor
PrintCursor();
}
}
//#######################################################################################################
void PrintCursor() // imprime cursor
{ ««««« ver aqui
// for (int n= 0; n= 3; n++)
/* {
lcd.setCursor(1, n);
lcd.print(" ");
}
lcd.setCursor(1, CursorPos);
lcd.print(">");
*/
}