#include <LiquidCrystal_I2C.h>
// Piny
#define SW_pin_bit 3 // pin pre tlacidlo
// Intervaly
#define odkmyt_tlacitka 50 // Približne 50 ms (s deličom 1024 na Timer1)
LiquidCrystal_I2C lcd(0x27, 16, 2);
int cislo = 0;
bool stlacenie = true;
ISR(INT1_vect) {
EIMSK &= ~(1 << INT1); // Vypne prerusenia z tlacidla
TCNT1 = 0; // Vynuluje casovac
TIMSK1 |= 1 << OCIE1A; // Zapne prerusenia z casovaca 1
// Nastavime zdroj hodinoveho signalu na interny oscilator 16 MHz a delic 1024
TCCR1B |= (1 << CS10) | (1 << CS12);
TCCR1B &= ~(1 << CS11);
TCCR1B |= (1 << WGM12);
}
ISR(TIMER1_COMPA_vect) {
if (!(PIND & (1 << SW_pin_bit))) { // Ak je tlacidlo stale stlacene
stlacenie = true;
}
TIMSK1 &= ~(1 << OCIE1A); // Vypne prerusenia z casovaca
// Odpoji zdroj hodinoveho signalu -> vypne casovac
TCCR1B &= ~((1 << CS10) | (1 << CS11) | (1 << CS12) | (1 << WGM12));
TCNT1 = 0;
EIMSK |= (1 << INT1); // Znovu povoli prerusenie od tlacidla
}
void setup() {
// Prerusenia z tlacidla
DDRD &= ~(1 << SW_pin_bit); // Nastavi pin tlacidla na vstup
PORTD &= ~(1 << SW_pin_bit); // Nastavi stav vysokej impedancie
EICRA |= (1 << ISC10); // Nastavi reakciu preruseni na "any change"
EICRA &= ~(1 << ISC11);
EIMSK |= (1 << INT1);
// Casovac 1 nastavenie
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = odkmyt_tlacitka; // Nastavi hodnotu pri ktorej vyvola prerusenie
SREG |= (1 << 7); // Povoli globalne prerusenia
lcd.init();
lcd.backlight();
lcd.clear();
}
void loop() {
if (stlacenie) {
lcd.clear();
cislo++;
lcd.print(cislo);
stlacenie = false;
}
}