|
Модераторы: bsa |
|
Alxad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 5.4.2016 Репутация: нет Всего: нет |
Здравствуйте! Разбираюсь понемногу с STM32 и С++.
Сделал программу-счётчик нажатий на кнопку на базе 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с } Сразу возникают вопрос: Мне нужно сделать так, чтобы при первом вызове методов класса переменные bool mid_but1, bool mid_but2, bool but_fix, int cnt1, int cnt2 инициализировались нулями, а дальше меняли своё значение согласно программе и не обнулялись при повторном вызове. Когда это была функция, я делал просто - объявил переменные перед телом функции и инициализировал нулями. Здесь так не получится. Можно решить в лоб - копировать значение переменной из main() и туда же возвращать, но это громоздко. Нет ли решения лучше? |
|||
|
||||
rudolfninja |
|
|||
Опытный Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Создайте пустой конструктор (без параметров), и в нем обнулите нужные переменные.
Либо в уже существующем конструкторе сделайте обнуление переменных |
|||
|
||||
Alxad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 5.4.2016 Репутация: нет Всего: нет |
Я пробовал при определении конструктора в его теле инициализировать переменную. В итоге каждый раз при обращении к классу я возвращаюсь к тому значению, которым инициализировал.
P.S. Я новичок, и мало знаю, поэтому прошу по возможности с пониманием относиться, если я где-то написал глупость) P.P.S. Я её таки написал - глупость. Всё верно, спасибо)) Это сообщение отредактировал(а) Alxad - 5.4.2016, 14:40 |
|||
|
||||
baldman88 |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: 1 Всего: 7 |
Что-то Вы делаете не так. Если правильно понял Вашу мысль, то нужно создать у класса еще один метод, куда и переместить весь код из конструктора. А в конструкторе просто инициализировать переменные нужными значениями:
Не совсем понятно, зачем используется тип bool. Гораздо проще было бы Вам помочь, если бы Вы привели ту часть кода, где используется этот класс. |
|||
|
||||
Alxad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 5.4.2016 Репутация: нет Всего: нет |
baldman88, спасибо! Я понемногу начал это понимать) У меня с классами первое знакомство - читаю учебник и пробую сразу на практике, - поэтому попутно собираю все грабли))
Вот код, здесь всё просто - пока использую только передний фронт импульса нажатой кнопки для управления:
Это сообщение отредактировал(а) Alxad - 5.4.2016, 15:38 |
|||
|
||||
Alxad |
|
||||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 5.4.2016 Репутация: нет Всего: нет |
Спасибо всем, доделал класс и код - работает в железе!))
Привожу листинг:
Теперь хочу сделать класс для 4-х разрядного семисегментного индикатора, думаю, будет интересно)) |
||||
|
|||||
math64 |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Ну, обычно вывод на индикаторы и опрос кнопок лучше делать по прерыванию.
Что-то типа так:
|
|||
|
||||
Alxad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 5.4.2016 Репутация: нет Всего: нет |
Спасибо за совет. Я пока не добрался до прерываний)) Но позже обязательно разберусь.
|
|||
|
||||
math64 |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Без прерваний яркость свечения индикаторов будет неравномерна (если у них нет аппаратного обновления)
|
|||
|
||||
Alxad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 5.4.2016 Репутация: нет Всего: нет |
У меня плата STM32VLDiscovery. К ней по принципу динамической индикации подключен 4-х разрядный семисегментный индикатор, сегменты напрямую, общие аноды через транзисторы. Пока реализовал банальный счётчик нажатий на пользовательскую кнопку с выводом результата на дисплей, с определением "зажатия" кнопки и ускорением счёта при этом и обнулением счёта после 9999)). При этом я сделал небольшой код, чтобы понять, как влияет скважность на яркость при динамической индикации.
В принципе, кроме запланированных, других неравномерностей яркости не увидел)) |
|||
|
||||
math64 |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
В тестовой программе неравномерность не будет заметна. В реальной программе, когда кроме обработчиков нажатий кнопок появятся другие вычисления, при обновлении дисплея без прерываний это будет заметно.
|
|||
|
||||
Alxad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 5.4.2016 Репутация: нет Всего: нет |
Понятно. Что ж, спасибо за совет. Думаю, это сэкономило мне пару шишек. Буду разбираться))
|
|||
|
||||
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |