Страница 1 из 1
Как выводить цифры на индикатор???
Добавлено: Пн июл 07, 2008 10:29:28
megasvintus
У меня очередной вопрос:
Как отобразить любую цифру на 7 сегментном индикаторе понятно, но как сделать так, чтобы программа брала значение переменной, скажем, 8, или 4, находила как ее отображать в функции-декодере и выводила на индикатор??? Я накопал много примеров, но они все на АСМе, расскажите пожалуйста как это сделать на СИ, с подробными комментариями.
Добавлено: Пн июл 07, 2008 15:29:29
Пухич
Здесь все очень просто - делаешь например switch, а внутри него сопоставляешь каждой цифре код ее отображения и затем этот код пихаешь в соотв регистр. И все.
Если речь идет о выводе чисел больше девяти по модулю, то несколько усложняется из-за того, что надо поделить число на 10, 100, 1000 и т.д. (вернее это все в обратном порядке) и определить таким образом вес каждого десятичного разряда. А затем вес каждого разряда снова передаешь в свой switch с кодами цифр.
Могу накидать на Си примерный алгоритм если надо. А может и сам разберешься. Там все в прниципе просто.
Добавлено: Пн июл 07, 2008 17:28:06
ARV
Ни в коем случае не делай по совету Пухича!!!
это крайне неудачный вариант, громоздкий, не универсальный...
зайди ко мне на сайт - я специально выкладывал статью с кодом на Си по выводу чисел на семисегментные индикаторы. воспользуйся поиском, если сразу не найдешь в разделе для начинающих...
Добавлено: Пн июл 07, 2008 17:52:14
megasvintus
Все выложенное там круто, но пока половина непонятна. Сказывается недостаток знания функций СИ
Комментарии не для самых начинающих! Позже дойдет
Для начала бы что попроще.....

Добавлено: Пн июл 07, 2008 18:50:10
ARV
гм... куда уж проще-то?
Добавлено: Пн июл 07, 2008 19:39:25
Пухич
ARV писал(а):Ни в коем случае не делай по совету Пухича!!!
это крайне неудачный вариант, громоздкий, не универсальный...
Какой вы умный!
Чем в идеологическом отношении ваше творение отличается от моих мыслей вслух? И чем оно "универсальнее"?
Статья кстати очень простая. Как раз начинающему.
Добавлено: Пн июл 07, 2008 20:32:47
Телерадиокошак
Пухич писал(а):Чем в идеологическом отношении ваше творение отличается от моих мыслей вслух?
Мне тоже интересно стало:)
Видимо речь о том, что выбор конкретного элемента массива (out
= SYMBOLS[m]) будет работать быстрее и занимать меньше памяти, чем последовательный перебор на предмет равентсва (switch, то бишь).
Хотя насчет универсальности можно поспорить, так же как и насчет "крайней неудачности".
Добавлено: Пн июл 07, 2008 20:34:59
Пухич
Да ладно, пусть аффтар делает как хочет. Это его право.
Добавлено: Пн июл 07, 2008 22:19:29
ARV
речь о том, что метод switch-ей для 3-разрядов - это одна программа, для 4-х разрядов - другая и т.д. т.е. нет универсальности - постоянно требуется правка кода. Как быть с дробными числами?
я предложил метод, который без изменения основного кода позволяет работать с любым разумным числом индикаторов. И при минимальных изменениях в коде одной функции позволит работать и с дробными числами. плюс к тому же мое предложение позволяет выводить числа в любом формате - десятичном, двоичном, шестнадцатеричном и т.д. И при этом все, что требуется - изменить одну константу.
P.S. Я не настаиваю - делайте, как хотите. Но если уж учиться - надо учиться делать красиво, логично и удобно - во всяком случае стремиться к этому.
Добавлено: Вт июл 08, 2008 10:44:40
megasvintus
А смысл в слове "быстрее" будет работать???? При производительности чипа на 16 мегагерцах абсолютно всеравно....
И памяти благо-выше крыши... Может конечно я неправ.
Разъясните пожалуйста как ЭТО работает, вот строчки, приведенные с вашего сайта:
void convert(unsigned int NUM){
int i, m;
for(i=MAX_SIZE-1; i>=0; i--){
// цикл заполнения выходного массива СПРАВА НАЛЕВО
m = NUM % DIG_BASE; // находим остаток от деления числа на основание
out = SYMBOLS[m]; // этот остаток есть ВЫВОДИМАЯ ЦИФРА
NUM /= DIG_BASE; // уменьшаем число в DIG_BASE раз
}
}
1) почему сама функция convert идет с параметрами unsigned int NUM (0-65535), а объявляемые переменные i, m имеют тип int (-32768-32767) ? с for все ясно
2)void convert(unsigned int NUM) А может "unsigned int NUM" как раз то число, которое будем отображать? как вообще функции дают знать что хотим отображать?
3)пусть массив заполнили, и как то, что получилось,передается в функцию-декодер вида (число 1 это 0b00000011- , число 2 0b01101101и так далее, в зависимости от того . как выводы подключены к сегментам индикатора)
ARV, позвольте не согласитьсь с вами. что писать сразу надо красиво.
новичку сложно так. Для начала надо понять что вообще происходит, а красота и компактность придет сама и постепенно.
Добавлено: Вт июл 08, 2008 11:38:40
alex2103
megasvintus
И памяти благо-выше крыши... Может конечно я неправ.
Вот в этом как раз и не правы... Памяти много когда просто ногой дергаешь. А потом оказываеться что ее очень мало

А метод
ARV мегаудобный и мало памяти занимает

Сам им пользуюсь и очень нравиться. Вы бы сели и один раз разобрались с этим...
1) почему сама функция convert идет с параметрами unsigned int NUM (0-65535), а объявляемые переменные i, m имеют тип int (-32768-32767) ? с for все ясно
непринципиально...
2)void convert(unsigned int NUM) А может "unsigned int NUM" как раз то число, которое будем отображать? как вообще функции дают знать что хотим отображать?
не понятен вопрос... unsigned int NUM - это параметр который мы будем передавать функции. Функция же ничего не возврашает...она заполняет значениями глобальный массив.
3)пусть массив заполнили, и как то, что получилось,передается в функцию-декодер вида (число 1 это 0b00000011- , число 2 0b01101101и так далее, в зависимости от того . как выводы подключены к сегментам индикатора)
Потом в прерывании обрабатываете полученный массив и дергаете там ногами...
Добавлено: Вт июл 08, 2008 12:44:50
ARV
1. NUM - это как раз то число, которое хотим вывести на индикатор
2. как уже было сказано ранее, тип локальных переменных внутри функции некритичен, т.к. они вспомогательные
3. как заполненный массив преобразуется в сегменты? я писал, что у нас есть глобальный массив "символов", соответствующих представлению чисел от 0 до 9 в виде "сегментов". если этот массив вы заполните байтами, каждый бит которых будет отвечать за свечение нужного сегмента (например 0b01100000 может обозначать цифру 1 - два сегмента, а 0b11111100 - цифру 0 - 6 сегментов), то функция преобразования convert() занесет в "экранную область" уже эти самые значения. вам останется в прерывании поочереди вывести байты из экранной области - и на индикаторе засияет ваше число.
судя по всему, надо подготовить очередную статью о динамической индикации - похоже, вопросы все равно есть, хотя на эту тему уже столько написано...
Добавлено: Чт июл 10, 2008 01:47:25
megasvintus
Добавлено: Чт июл 10, 2008 12:17:46
KIP
megasvintus писал(а):
Разъясните пожалуйста как ЭТО работает, вот строчки, приведенные с вашего сайта.
Дайте ссылку на полный текс программы
Добавлено: Чт июл 10, 2008 16:47:27
megasvintus
на кнопку WWW у автора сообщений ARV кликните....
Добавлено: Чт июл 10, 2008 17:15:29
Тарас
Вот здесь очень отличная стаття на ATtiny 2313 c 3 секцыями 7-сигментников!
http://avru.cwx.ru/viewtopic.php?t=16&s ... 000d766586
Добавлено: Чт июл 10, 2008 20:12:09
megasvintus
Есть что почерпнуть! Нравится и то, что массив записан сразу в EEPROM
Добавлено: Чт июл 10, 2008 20:17:54
Сэр Мурр
Послушайте мнение модератора- Товарищ АРВ очень грамотный спец, отмеченный лично Котом- Духом Сайта. Так что следуйте его рекомендациям.
Добавлено: Пт июл 11, 2008 15:21:25
megasvintus
Полностью согласен, что у ARV абсолютно универсальный алгоритм, и его легче всего переделать.
И уж тем более не хочу сказать что у ARV квалификация не очень.
Я всего лишь говорю что в приведенной ссылке я тоже нашел пищу для ума.
Ведь если одну и ту-же задачу будут решать 10 хороших программистов, то получатся 10 разных листингов, и из каждого будет можно что-то эдакое выдрать
Кстати в том алгоритме есть косяк... Я ведь испытываю его на реальном устройстве. Косяк я поправил, кстати получил опыт поиска ошибок в программе. Но в конечном итоге я пришел к варианту ARV.