#define ledPin 13 // Пин для светодиода
#define setLedOnPin 8 // Пин кнопки включения светодиода
#define setLedOffPin 9 // Пин кнопки выключения светодиода
volatile uint8_t state = 0;
uint8_t oldPINB = 0xFF;
void pciSetup(byte pin) {
*digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin)); // Разрешаем PCINT для указанного пина
PCIFR |= bit (digitalPinToPCICRbit(pin)); // Очищаем признак запроса прерывания для соответствующей группы пинов
PCICR |= bit (digitalPinToPCICRbit(pin)); // Разрешаем PCINT для соответствующей группы пинов
}
ISR (PCINT0_vect) { // Обработчик запросов прерывания от пинов D8..D13
uint8_t changedbits = PINB ^ oldPINB;
oldPINB = PINB;
if (changedbits & (1 << PB0)) { // Изменился D8
state = 1; // Зажигаем светодиод
}
if (changedbits & (1 << PB1)) { // Изменился D9
state = 0; // Гасим светодиод
}
}
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(setLedOnPin, INPUT_PULLUP); // Подтянем пины-источники PCINT к питанию
pinMode(setLedOffPin, INPUT_PULLUP);
pciSetup(setLedOnPin); // И разрешим на них прерывания
pciSetup(setLedOffPin);
}
void loop() {
digitalWrite(ledPin, state);
}