//------------------------------------------------------------------------------------ // Пример использования библиотеки опроса кнопок button_lib // // Короткое нажатие - инвертирует соответствующий вывод // Длинное нажатие - инвертирует все выводы // // //------------------------------------------------------------------------------------ #define F_CPU 8000000UL #include #include #include //------------------------------------------------------------------------------------ //настройки параметров библиотеки #define BTN_LOCK_TIME 20 /* время обработки дребезга в милисекундах (10-100) */ #define BTN_LONG_TIME 1000 /* время фиксации длинного нажатия в милисекундах (1000 - 2500) */ //настройка портов и линий кнопок #define BTN_PORT PORTB /* порт кнопок */ #define BTN_PIN PINB #define BTN_LINE1 (1<<0) /* линии кнопок */ #define BTN_LINE2 (1<<1) #define BTN_LINE3 (1<<2) #define BTN_LINE4 (1<<3) //----------------------------------------------------------------------------------------------------------------------- //глобальные переменные volatile uint8_t BtnFlags; //регистр флагов нажатых кнопок #define BTN_SHRT1 (1<<0) /* флаги короткого нажатия кнопок */ #define BTN_SHRT2 (1<<1) #define BTN_SHRT3 (1<<2) #define BTN_SHRT4 (1<<3) #define BTN_LONG1 (1<<4) /* флаги длинного нажатия кнопок */ #define BTN_LONG2 (1<<5) #define BTN_LONG3 (1<<6) #define BTN_LONG4 (1<<7) //объявления функций void BtnInit (void); //инициализация библиотеки uint8_t BtnGet (void); //функция чтения маски нажатой кнопки //------------------------------------------------------------------------------------ int main(void) { //настройка таймера на прерывание с частотой 100Гц OCR2 = F_CPU / 1024 / 100; //формула для получения частоты 100Гц TIMSK |= (1<= (BTN_LONG_TIME/10)) return; if (++BtnLongCoun >= (BTN_LONG_TIME/10)) BtnFlags |= (BtnMask << 4); //установка бита длинного нажатия (старшие 4 бита флагов ButtonByte) } else{ //клавиша отжата if (BtnLockCoun){ //обработка дребезга BtnLockCoun --; return; } if (! BtnLockBit) //отжатие зафиксировано return; BtnLockBit =0; if (BtnLongCoun < (BTN_LONG_TIME/10)) BtnFlags |= BtnMascLast; //установка бита короткого нажатия (младшие 4 бита флагов ButtonByte) BtnLongCoun = 0; } } //------------------------------------------------------------------------------------