Семи сигметный индикатор и массив из разрядов и сигментов
- Войдите на сайт для отправки комментариев
Дань добрый. Сижу 3й день, не могу понять как правильно реализовать.
Хочу через про мини подсоединить семи сигметный индикатор (+точка) на 9 разрядов. Физически это сделал, портов хватило. Начал кодить и тут - повалились проблемы. Не буду приводить свой код, т.к. уже не знаю сколько раз он переписан и первоначальный вариант утерян, остался с кучей костылей и нерабочий.
Суть такая: Хочу создать массив из разрядов, в котором есть массив из сигментов. Но только, чтоб это был не int, а текстовый формат. Т.е, чтобы засветить "0" на первом разряде, а "1" - на втором, массив выглядит следующим образом
prt[0]=('11111100'); // ABCDEFGH prt[1]=('01100000');
после, при выводе, на номере разряда(номере ячейки) включать ногу катода, а каждое значение ячейки разбивать на символы и "зажигать" сигменты.
Как нужно вначале объявить prt массив, чтоб не ругался о неоответствии конвертации форматов? Как разбить значение ячейки, чтобы обработать каждый символ?
Прошу помощи, т.к. я уже запутался.
Суть такая: Хочу создать массив из разрядов, в котором есть массив из сигментов. Но только, чтоб это был не int, а текстовый формат.
Текстовой формат - это глупость. Сегменты в индикаторе задаются битами в байте. И в самом девайсе для зажигания тоже используется байты. Мало того, что текстовой формат займет в 8 раз больше места, так еще понадобится куча кода. чтобы сначала преобразовать байт в строку нулей и единиц, а потом разделить строку на символы и обратно превратить в байты.
Не занимайтесь ерундой. Очевидно, что вы выбрали этот путь только потому. что боитесь бинарного формата. Но если пока для вас байты - темный лес, это совершенно не повод писать говнокод с двойной конверсией через текст. Лучше возьмите учебник и разберитесь, что такое байты и биты и как с ними работать..
например для девяти элементов
char prt[9][]=('11111100');
Может Вы и правы, пытался и как Вы описываете, но знаний не хватает. Уже несколько дней пытаюсь разобраться, только больше запутываюсь. По-этому на форум и обратился.
Может Вы и правы, пытался и как Вы описываете, но знаний не хватает. Уже несколько дней пытаюсь разобраться, только больше запутываюсь. По-этому на форум и обратился.
Jtest. что вы от форума-то хотите? Не хватает знаний - для этого придуманы книги. Форум вряд ли их заменит. Вы же тут третий код - знаете, что самый быстрый путь получить помощь - это выложить свой код и задавать конкретные вопросы.
Сейчас в трех разрядах мигают нули (при source_f = String("101");). при source_f = String("11111"); - 5 единиц.
Вопрос.1) Почему заметно мерцание, если задержка только "1", 2) почему неверное отображение? Где моя ошибка, я уже не в состоянии отследить (запутался)?
Ну текствый формат не глупость. Так можно создать char строку и вывести на экран дисплея. Это удобно при написании программ. Но не все символы ASCII можно вывести на семисегментник. Так что приходится писать свою кодировку для знаков, что бы реализовать это. Укорочено это кодировка в 17 знаков (0123456789AbcdEF и пробел)
qwone, я хочу добавить нексолько русских символов, для обозначения режимов работы. Например, буква "P" у меня дожна выглядеть так:
Я делал так:
В программе заполнял myVal[ ] тем что нужно выводить на экран. И в прерывании от таймера:
Порты B и C - условные, что-то мне не найти скетч где использовались реальные. При этом порт С - общие для разрядов, порт В собственно выводы разряда.
P.S. Да говнокод, но давно я это писал и не переписывал ибо работает.
Глючный форум дважды отправил пост.
Jtest . Программирование это смесь фундаментальных знаний и копромисов. Сильно много умов решались оптимизировать процесс программирования. И не оперется на их опыт глупо. Но я не хочу ради вам переносить эти знания сюда в вашу тему. Уж лучше вы туда идите.
Есть ASCII код. И в нем нет русских знаков. Русские знаки в уникоде. И все это байда нужна только что бы все написать просто
Alex-GK, для меня Ваш код - дремучий лес)) Не "дорос" до этого уровня. qwone, я, наверно, понял, что Вы хотели сказать, но у меня другой механизм.
Alex-GK, для меня Ваш код - дремучий лес)) Не "дорос" до этого уровня. qwone, я, наверно, понял, что Вы хотели сказать, но у меня другой механизм.
Не поверите, мне знакомо это чувство, до сих пор частенько бывает.
Выложите схему подключения вашего индикатора к ардуине, и тот код, что у вас есть, я вечером или свой адаптирую под вашу схему или ваш до ума доведу.
Alex-GK, Хорошо если до вечера ничего не придумаю, так и сделаю. Все-же хочется понять самому механизм, чтобы больше не обращаться.
Механизм простой - отвяжитесь от char-ов, кодируйте зажигаемые сегменты битами, для наглядности можете записывать их как B01010101.
И в вашем коде в сообщении 4 управление анодным пином засуньте в цикл перебора разрядов.
Alex-GK, здесь вы не разобрались в принципах. У ТС есть семисегметный дисплей. Но он без внутреней памяти и динамической индикации. Вот Ардуине и надо ее организовать. Если у ТС 10 сегментов то нужен массив char buff[10]; из которого и обновлять изображение на дисплее. Но вот вопрос как заносить информацию в этот буфер . Можно так void write(byte Pos,byte Data); а можно void print(char *Str);Если в первом случае можно по форме зажигаемого символ. То во втором уже ASCII коде в котором все незажигаемые символы банально игнорируются.
ПС: Пляска вокруг точки легко решается "1" и "1." печатаются в одно знакоместо
Вы не правы, я разобрался уже давно и не раз реализовал.
Только у меня буфер в int , Он у меня называется myVal [ ].
А вот у ТС все немного иначе, вместо буфера у него строка source_f. И он в функции ALS_write, проходит по строке и пытается выводить символы процедурой displayMessage, в которой опять же перебирает строковую переменную digw в которой "закодирован" выводимый символ.
Я предлагаю закодировать символы битами одного байта. Байты сложить в массив - этакий знакогенератор. И выводить сразу символ, а не посегментно.
Я предлагаю закодировать символы битами одного байта. Байты сложить в массив - этакий знакогенератор. И выводить сразу символ, а не посегментно.
Это хорошо, если все сегменты по порядку висят на одном регистре, на практике при разводке платы такое не очень удобно. Проще все таки перебрать байт и отправить нужные биты в требуемые места.
Всем спасибо. Сделал по своему, получилось. Выводит и цифры и буквы (насколько можно). Сейчас обвешиваю устровйство основным фукнционалом. Если интересно, через день-два, отшлифую код, размещу.
Это хорошо, если все сегменты по порядку висят на одном регистре, на практике при разводке платы такое не очень удобно. Проще все таки перебрать байт и отправить нужные биты в требуемые места.
В принципе можно и так, все таки биты в байте, а не символы в стринг.
Но есть один момент, если делать динамическую индикацию в loop, то как только программа захочет еще что нибудь сделать, например датчик температуры опросить или посчитать чего, то индикация остановится - визуально неприятный эффект.
Поэтому красивее вывод сделать в прерывании, а в прерывании биты лучше не перебирать, быстренько вытолкнул в порт и свалил из прерывания. А плату двухслойную можно развести как угодно.
Jtest, как только функционалом наполните, так сразу только что описанное мной вылезет.
Я в прерывании только номер индикатора изменяю, при изменении номера распихиваем биты по пинам и зажигаем. Функции вызываются последовательно после возврата из прерывания, потом назад в луп. Дисплей правда из двух индикаторов + DS18B20 и опрос IR. Дрыганья не заметно, хотя при увеличении датчиков и индикаторов возможно и проявилось бы.
Ну если два...
А я 12 в ряд запихал на меге, там заметно. У ТС вроде бы 9, тоже не мало.
Вот такой у меня получился приборчик с применением pro mini и индикатора АЛС318А (без дешифраторов):
https://youtu.be/-4n8-n5b_ss