Вт апр 05, 2016 11:16:05
class button
{
public:
button(int ST_reg, int ST_bit, int ST_const);
~button() {}
bool GetRaise() const {return raise;}
bool GetFall() const {return fall;}
private:
bool raise; // Переменная для возврата true для переднего фронта нажатия кнопки
bool fall; // Переменная для возврата true для заднего фронта нажатия кнопки
bool mid_but1; // Переменная для определения переднего и заднего фронта нажатия кнопки
bool mid_but2; // Переменная для определения переднего и заднего фронта нажатия кнопки
bool but_fix; // Переменная для фиксации состояния удерживания кнопки
int cnt1; // Переменная для отсчета состояния удерживания кнопки
int cnt2 ; // Переменная для задержки фиксации состояния нажатой кнопки (антидребезг)
};
button::button(int ST_reg, int ST_bit, int ST_const)
{
raise = 0; // Переменные для отображения нажатия кнопки - передний фронт
fall = 0; // Переменные для отображения нажатия кнопки - задний фронт
if((ST_reg & ST_bit) == ST_const) // Считываем состояние вывода порта с кнопкой
{
if(cnt2 <= 100) // Задаем условие ограничения счета для задержки антидребезга (передний фронт импульса)
cnt2++; // Счетчик задержки
if(cnt2 > 100) // Когда досчитал
mid_but1 = 1; // присваиваем промежуточной переменной значение 1
}
else
{
if(cnt2 > 0) // Задаем условие ограничения счета для задержки антидребезга (задний фронт импульса)
cnt2--; // Счетчик задержки
if(cnt2 <= 0) // Когда досчитал
mid_but1 = 0; // присваиваем промежуточной переменной значение 0
}
if(mid_but2 < mid_but1)
{
raise = 1; // Ловим момент изменения переменной - передний фронт импульса
but_fix = 1; // Присваиваем 1 промежуточной переменной
}
if(mid_but1 < mid_but2)
{
fall = 1; // Ловим момент изменения переменной - задний фронт импульса
but_fix = 0; // Присваиваем 0 промежуточной переменной
cnt1 = 0; // Сбрасываем счетчик
}
mid_but2 = mid_but1; // Приравниваем промежуточные переменные, чтобы фронт был единичным
if(but_fix == 1) // Ловим состояние зажатой кнопки
cnt1++; // пока кнопка зажата - инкрементируем счётчик
if(cnt1 > 200000 && cnt1%2000 == 0) // если зажата долго, 2-3 секунды...
raise = 1; // выдаём импульсы длительностью в такт с паузой где-то 0,1с
}
Вт апр 05, 2016 15:08:46
Вт апр 05, 2016 17:26:39
class button
{
public:
button(int ST_bit, int ST_const);
~button() {}
bool GetRaise(int ST_reg);
bool GetFall() const;
private:
int itsST_reg;
int itsST_bit;
int itsST_const;
bool raise; // Переменная для возврата true для переднего фронта нажатия кнопки
bool fall; // Переменная для возврата true для заднего фронта нажатия кнопки
bool mid_but1; // Переменная для определения переднего и заднего фронта нажатия кнопки
bool mid_but2; // Переменная для определения переднего и заднего фронта нажатия кнопки
bool but_fix; // Переменная для фиксации состояния удерживания кнопки
int cnt1; // Переменная для отсчета состояния удерживания кнопки
int cnt2; // Переменная для задержки фиксации состояния нажатой кнопки (антидребезг)
};
button::button(int ST_bit, int ST_const)
{
itsST_bit = ST_bit;
itsST_const = ST_const;
mid_but1 = 0;
mid_but2 = 0;
but_fix = 0;
cnt1 = 0;
cnt2 = 0;
}
bool button::GetRaise(int ST_reg)
{
itsST_reg = ST_reg;
raise = 0; // Переменные для отображения нажатия кнопки - передний фронт
fall = 0; // Переменные для отображения нажатия кнопки - задний фронт
if((itsST_reg & itsST_bit) == itsST_const) // Считываем состояние вывода порта с кнопкой
{
if(cnt2 <= 100) // Задаем условие ограничения счета для задержки антидребезга (передний фронт импульса)
cnt2++; // Счетчик задержки
if(cnt2 > 100) // Когда досчитал
mid_but1 = 1; // присваиваем промежуточной переменной значение 1
}
else
{
if(cnt2 > 0) // Задаем условие ограничения счета для задержки антидребезга (задний фронт импульса)
cnt2--; // Счетчик задержки
if(cnt2 <= 0) // Когда досчитал
mid_but1 = 0; // присваиваем промежуточной переменной значение 0
}
if(mid_but2 < mid_but1)
{
raise = 1; // Ловим момент изменения переменной - передний фронт импульса
but_fix = 1; // Присваиваем 1 промежуточной переменной
}
if(mid_but1 < mid_but2)
{
fall = 1; // Ловим момент изменения переменной - задний фронт импульса
but_fix = 0; // Присваиваем 0 промежуточной переменной
cnt1 = 0; // Сбрасываем счетчик
}
mid_but2 = mid_but1; // Приравниваем промежуточные переменные, чтобы фронт был единичным
if(but_fix == 1) // Ловим состояние зажатой кнопки
cnt1++; // пока зажата - инкрементируем счетчик
if(cnt1 > 200000 && cnt1%2000 == 0) // Если зажата долго, 2-3 секунды...
raise = 1; // ...выдаем импульсы длительность в такт и паузой 0,2-0,3 секунды
return raise;
}
Сб ноя 18, 2017 01:35:53
Сб ноя 18, 2017 20:22:09
Вт дек 12, 2017 04:10:17
Вт дек 12, 2017 14:01:03
Вт дек 12, 2017 20:51:15