Здравствуйте! Разбираюсь понемногу с 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с }
Сразу возникают вопросы: 1) Keil ругается на инициализацию переменной при объявлении. Вообще в С++ это допускается. Особенности компилятора или моя ошибка? 2) Мне нужно сделать так, чтобы при первом вызове методов класса переменные bool mid_but1, bool mid_but2, bool but_fix, int cnt1, int cnt2 инициализировались нулями, а дальше меняли своё значение согласно программе и не обнулялись при повторном вызове. Когда это была функция, я делал просто - объявил переменные перед телом функции и инициализировал нулями. Здесь так не получится. Можно решить в лоб - копировать значение переменной из main() и туда же возвращать, но нет ли решения лучше? 3) Пытался создавать ссылки на переменные. Тоже Keil ругается. Листинга уже нет, но, может, кто-нибудь что-то подскажет?
_________________ Нужно добиваться того чего хочется. В противном случае останется лишь довольствоваться тем, что есть.
С инициализацией я, кажется, разобрался. Правда, код после замены функции на класс ещё не возобновил работу, поэтому есть ещё один насущный вопрос - где подробно описано, как пользоваться отладчиком?
_________________ Нужно добиваться того чего хочется. В противном случае останется лишь довольствоваться тем, что есть.
Ну что ж, спасибо всем неравнодушным за молчаливую поддержку. Класс в итоге заработал, хоть и пришлось в итоге голову поломать. Если кому интересно, ниже листинг:
Код:
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; // Переменная для задержки фиксации состояния нажатой кнопки (антидребезг) };
Друзья, пишу в кейле (HAL + cube). Суть в чём, main файл пустого проекта совсем не пустой, и часто приходится скакать то в начало файла к переменным например, то в конец к обработчикам. И отнимает много времени прокрутка. Пока докрутишь, позабудешь зачем полез) Однако, код генерируемый кубом хорошо структурирован и для переноса на другие МК пользовательский код помещается между комментариями пользователя в которых всегда присутствует слово "USER CODE". И тут мысль, а нет ли в кейле возможности автоматически свернуть всё кроме областей между этими комментариями?
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Доброго времени суток, товарищи. Кейлом пользуюсь уже который год, но что-то дал он сбой... Раньше в проекте пересобирались только необходимые файлы, компиляция обычно занимала секунды 2-3. ПОтом что-то случилось, и начал при каждой компиляции весь проект пересобираться полностью, а это две минуты. Как так получилось - не знаю, честно. Помогите, пожалуйста, может сталкивался кто. А то сплошное мучение - при каждой правке столько ждать
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения