AVF (22.01.2019 06:50, просмотров: 251) ответил Ксения на Энкодер ... странный
если ручное управление, скорость небольшая, обрабатывать как обычныую кнопку. Опрашивать раз в 5-10мс. и счетчик. Если 3-4 раза подряд одно значение - считаем фиксируем состояние. Как то так:
#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
#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
}
}