#include <LiquidCrystal_I2C.h>
#define clk 2
#define sw 3
#define dt 4
LiquidCrystal_I2C lcd(0x27,16,2);
// Stav led
bool ledky[4] = {0,0,0,0};
String menu[4] = {"LED 1",
"LED 2",
"LED 3",
"LED 4"}; // Pole reťazcov pre názvy položiek v menu
byte poloha = 0; // Poloha v menu
bool zmena = true; // Premenná indikujúca zmenu vo vstupoch
ISR(INT0_vect) // prerusenie
{
zmena = true;
// Kontrola smeru rotácie
if(PIND & (1<<4)) {
// Rotácia smerom nahor
if(poloha > 0)
poloha--;
// Rotácia nahor nie je povolená, ak sme na prvej LED
} else {
// Rotácia smerom dolu
// Povoliť rotáciu len ak nie sme na poslednej polohe
if(poloha < 3)
poloha++;
// Inak rotácia nie je povolená
}
}
ISR(INT1_vect) // prerusenie tlacidlo
{
zmena = true;
ledky[poloha] = (~(ledky[poloha]) & 1);
}
void setup()
{
DDRD &= ~(1<<2); // vstupy enkodera
DDRD &= ~(1<<3);
DDRD &= ~(1<<4);
PORTD |= 1<<2; // pull-up
PORTD |= 1<<3;
PORTD |= 1<<4;
DDRB |= (1<<0); // led vystupy
DDRB |= (1<<1);
DDRB |= (1<<2);
DDRB |= (1<<3);
PORTB &= ~(1 << 0); //na log. nulu
PORTB &= ~(1 << 1);
PORTB &= ~(1 << 2);
PORTB &= ~(1 << 3);
SREG |= 1<<7; // globalne prerusenie
EIMSK |= 1<<INT0; // Aktivacia externych preruseni pin 2 3
EIMSK |= 1<<INT1;
EICRA &= ~(1<<ISC00); // Nastavenie externych prerušeni na dobežnu hranu
EICRA |= 1<<ISC01;
EICRA &= ~(1<<ISC10);
EICRA |= 1<<ISC11;
lcd.init(); // Inicializacia LCD
lcd.backlight();
}
void loop()
{
if(zmena) // Ak bola zmena, aktualizujeme stav LED a zobrazíme menu na LCD displeji
{
for(byte LED = 0; LED < 4; LED++) // Aktualizácia stavu LED
if(ledky[LED])
PORTB |= 1<<(3 - LED);
else
PORTB &= ~(1<<(3 - LED));
lcd.clear(); // Vymazanie LCD displeja
lcd.print(">"); // vypis kurzora
for(byte i = 0; i < 2; i++) // Pre každý riadok displeja
{
lcd.setCursor(1,i);
byte zobrazenaPoloha = poloha + i; // vypocet
if(zobrazenaPoloha < 4) // Zobrazenie polozky menu, LED 1 az LED 2
{
lcd.print(menu[zobrazenaPoloha]);
lcd.setCursor(11,i);
if(ledky[zobrazenaPoloha])
lcd.print("ON");
else
lcd.print("OFF");
}
else
{
break;// ukoncenie cyklu
}
}
zmena = false;
}
}