ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 ноября
755377 Топик полностью
AVF (12.05.2017 19:03, просмотров: 145) ответил michas на Подскажите изящный цифровой фильтр для битовых значений (т.е. считываю данные с порта, на который подцеплены дискретные входы).
очень давно использую такую вещь файл "button.h" #ifndef _BUTTON_H #define _BUTTON_H #define NUMKEYMAX 32 typedef struct { unsigned char bsHoldCounter : 8; // Для проверки удерживания unsigned char bsJitter : 2; // Для подавления дребезга // Состояния unsigned bsPressed :1; // Состояния кнопок unsigned bsHold :1; // Состояние длительного удерживания unsigned bsShort :1; // Короткое нажатие и отпускание unsigned bsJustPressed :1; // Кнопки только что нажаты unsigned bsJustReleased :1; // Кнопки только что отпущены unsigned bsChanged :1; // Состояние кнопок изменилось // События: } TBUTTON; extern void buttonControl(TBUTTON *, unsigned int _pKeyIn, unsigned int _numKey ); extern void initButton(TBUTTON * _but, unsigned int _numButton); // пример от tester // http://www.microch …p?p=76612&postcount=12 #endif файл "button.c" #include "button.h" void initButton(TBUTTON * _but, unsigned int _numButton) { int i; if (_numButton > NUMKEYMAX) _numButton = 0; for (i = 0; i < _numButton; i++) { _but[i].bsChanged = 0; _but[i].bsHoldCounter = 0; _but[i].bsHold = 0; _but[i].bsJitter = 0; _but[i].bsJustPressed = 0; _but[i].bsJustReleased = 0; _but[i].bsPressed = 0; _but[i].bsShort = 0; } } void buttonControl(TBUTTON * _button, unsigned int _pKeyIn, unsigned int _numButton ) { unsigned int i; if (_numButton > NUMKEYMAX) _numButton = 0; for(i = 0; i < _numButton; i++) { //------------------------------------------------------------------------------ // Кнопка еще не нажата //------------------------------------------------------------------------------ if (!_button[i].bsPressed) { _button[i].bsJitter++; // активный уровень 0 if ((_pKeyIn & (1<<i))) _button[i].bsJitter = 0; // Подавляем дребезг if (_button[i].bsJitter == 3) // Перестала дребезжать { _button[i].bsPressed = 1; // Нажата _button[i].bsJustPressed = 1; // Нажата только что (сбрасывается вручную) _button[i].bsHold = 0; // Не удерживается _button[i].bsShort = 0; // Не короткое нажатие _button[i].bsHoldCounter = 0; } // if jitter } else { // if button pressed //------------------------------------------------------------------------------ // Кнопка нажата, проверяем удерживание //------------------------------------------------------------------------------ _button[i].bsJitter++; // активный уровень 0 if (!(_pKeyIn & (1<<i))) _button[i].bsJitter = 0; // Подавляем шорох if (_button[i].bsJitter == 3) // Кнопку только что отпустили { _button[i].bsPressed = 0; if (!_button[i].bsHold) // Если не было удерживаниядольше 1 сек, _button[i].bsShort = 1; // то установить флаг "короткого нажатия" _button[i].bsHold = 0; _button[i].bsHoldCounter = 0; } // if jitter _button[i].bsHoldCounter++; if (_button[i].bsHoldCounter >= 50) // Проверяем удерживание _button[i].bsHold = 1; } // if button pressed } }