Сделал программу-счётчик нажатий на кнопку на базе STM32VLDiscovery с подключенным 4-х разрядным семисегментным индикатором.
Теперь хочу из функции кнопки создать класс. Возникают вопросы. Вот листинг:
Код: Выделить всё
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с
}1) Keil ругается на инициализацию переменной при объявлении. Вообще в С++ это допускается. Особенности компилятора или моя ошибка?
2) Мне нужно сделать так, чтобы при первом вызове методов класса переменные bool mid_but1, bool mid_but2, bool but_fix, int cnt1, int cnt2 инициализировались нулями, а дальше меняли своё значение согласно программе и не обнулялись при повторном вызове. Когда это была функция, я делал просто - объявил переменные перед телом функции и инициализировал нулями. Здесь так не получится. Можно решить в лоб - копировать значение переменной из main() и туда же возвращать, но нет ли решения лучше?
3) Пытался создавать ссылки на переменные. Тоже Keil ругается. Листинга уже нет, но, может, кто-нибудь что-то подскажет?


