Napríklad takto:
Kód: Vybrať všetko
#include <TimerOne.h>
#include <util/atomic.h>
#define TL_PIN 2
#define TL_PIN_AVR 2
#define DEBUG true
volatile uint8_t release;
uint16_t counter=0;
uint8_t ledVal=0;
void setup() {
pinMode(TL_PIN, INPUT_PULLUP);
pinMode(13, OUTPUT);
if (DEBUG){
Serial.begin(9600);
Serial.println("Startujem hodinky pre tlacitko");
}
Timer1.initialize(50000); //pretecenie kazdych 50ms
Timer1.attachInterrupt(timer1Callback);
}
void timer1Callback()
{
static uint8_t lastPin=(1 << TL_PIN_AVR); //globalna privatna premenna
uint8_t pin; //aktualny stav na pinoch portu
uint8_t changePin; //piny ktore sa zmenili od posledneho prerusenia
//precita stav pinov kde su tlacitka (teraz jedno)
pin = PIND & (1 << TL_PIN_AVR); //Plati pre UNO!!! Nie som si isty ci vsetky dosky maju pin 2 na porte D
changePin = lastPin ^ pin; //vypocita pozicie kde sa hodnota oproti predoslemu stavu zmenila
//ak bola zmena stavu tlacitka a sucasne je pin v HIGH tak bolo uvolnenie stlacenia
if (changePin && pin){ //pre jedno tlacitko sa to da zjednodusit takto
release = 1 << TL_PIN_AVR;
}
if (DEBUG){
Serial.print("timer - " ); Serial.print(lastPin);
Serial.print(" , " ); Serial.print(pin);
Serial.print(" , " ); Serial.print(changePin);
Serial.print(" , " ); Serial.println(release);
}
lastPin=pin; //odpameta sa novy stav
}
void loop() {
if (release){
release=0;
ledVal++;
digitalWrite(13, ledVal & 1);
if (DEBUG) {
ATOMIC_BLOCK(ATOMIC_RESTORESTATE){
Serial.print("pustil tlacitko " ); Serial.println(ledVal);
}
}
}
}