AP

Size: a a a
AP
AP
D
AP
AP
AP
AP
AP
AP
AP
AP
AP
#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; // Гасим светодиод
}
//if (changedbits & (1 << PB2)) { ... } - аналогичные условия для остальных пинов
}
ISR (PCINT1_vect) { // Обработчик запросов прерывания от пинов A0..A5
// Обработка аналогична PCINT0_vect, только изменить на PINC, oldPINC, PCx
}
ISR (PCINT2_vect) { // Обработчик запросов прерывания от пинов D0..D7
// Обработка аналогична PCINT0_vect, только изменить на PIND, oldPIND, PDx
}
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(setLedOnPin, INPUT_PULLUP); // Подтянем пины-источники PCINT к питанию
pinMode(setLedOffPin, INPUT_PULLUP);
pciSetup(setLedOnPin); // И разрешим на них прерывания
pciSetup(setLedOffPin);
}
void loop() {
digitalWrite(ledPin, state);
}