//#include <avr/interrupt.h>
#define led_1_Pin 2 // Пин для светодиода
#define led_2_Pin 3 // Пин для светодиода
#define led_3_Pin 4
#define led_4_Pin 5
#define limPin 11 // Пин кнопки включения светодиода
#define tempPin 12 // Пин кнопки выключения светодиода
#define selectPin 13 // Пин кнопки выключения светодиода
#define stopPin A5 // Пин кнопки выключения светодиода
volatile uint8_t state_lim = 0;
volatile uint8_t state_temp = 0;
volatile uint8_t state_select = 0;
volatile uint8_t state_stop = 0;
volatile uint8_t state_lim_old = 0;
volatile uint8_t state_temp_old = 0;
volatile uint8_t state_select_old = 0;
volatile uint8_t state_stop_old = 0;
uint8_t oldPINB = 0xFF;
uint8_t oldPINC = 0xFF;
//uint8_t oldPIND = 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_b = PINB ^ oldPINB;
oldPINB = PINB;
if (changedbits_b & (1 << PB3)) { // Изменился D11 концевик
if (digitalRead(limPin) == 0) state_lim = 0;
else state_lim = 1; //
}
if (changedbits_b & (1 << PB4)) { // Изменился D12 температура
if (digitalRead(tempPin) == 0) state_temp = 0; //
else state_temp = 1;
}
if (changedbits_b & (1 << PB5)) { // Изменился D13 селектор
if (digitalRead(selectPin) == 0) state_select = 0; //
else state_select = 1;
}
//if (changedbits_b & (1 << PB2)) { ... } - аналогичные условия для остальных пинов
}
ISR (PCINT1_vect) { // Обработчик запросов прерывания от пинов A0..A5
uint8_t changedbits_c = PINC ^ oldPINC; // аналогично PCINT0_vect, только изменить на PINC, oldPINC, PCx
oldPINC = PINC;
if (changedbits_c & (1 << PC5)) { // Изменился A5 стоп
if (digitalRead(stopPin) == 0) state_stop = 0; //
else state_stop = 1;
}
}
//ISR (PCINT2_vect) { // Обработчик запросов прерывания от пинов D0..D7
// uint8_t changedbits_d = PIND ^ oldPIND; // аналогично PCINT0_vect, только изменить на PIND, oldPIND, PDx
// oldPIND = PIND;
//}
void setup() {
//Serial.begin(9600);
pinMode(led_1_Pin, OUTPUT);
pinMode(led_2_Pin, OUTPUT);
pinMode(led_3_Pin, OUTPUT);
pinMode(led_4_Pin, OUTPUT);
pinMode(limPin, INPUT_PULLUP); // Подтянем пины-источники PCINT к питанию
pinMode(tempPin, INPUT_PULLUP); // Подтянем пины-источники PCINT к питанию
pinMode(selectPin, INPUT_PULLUP); // Подтянем пины-источники PCINT к питанию
pinMode(stopPin, INPUT_PULLUP); // Подтянем пины-источники PCINT к питанию
pciSetup(limPin); // И разрешим на них прерывания
pciSetup(tempPin); // И разрешим на них прерывания
pciSetup(selectPin); // И разрешим на них прерывания
pciSetup(stopPin); // И разрешим на них прерывания
//pciSetup(8); // И разрешим на них прерывания
//pciSetup(9); // И разрешим на них прерывания
//pciSetup(A0); // И разрешим на них прерывания
//pciSetup(A1); // И разрешим на них прерывания
}
void loop() {
//interrupts();
if (state_lim == 1) {
digitalWrite(led_1_Pin, 1);
}
else {
digitalWrite(led_1_Pin, 0);
}
if (state_temp == 1) {
digitalWrite(led_2_Pin, 1);
}
else {
digitalWrite(led_2_Pin, 0);
}
if (state_select == 1) {
digitalWrite(led_3_Pin, 1);
}
else {
digitalWrite(led_3_Pin, 0);
}
if (state_stop == 1) {
digitalWrite(led_4_Pin, 1);
}
else {
digitalWrite(led_4_Pin, 0);
}
//noInterrupts();
delay(500);
}