Как отобразить любую цифру на 7 сегментном индикаторе понятно, но как сделать так, чтобы программа брала значение переменной, скажем, 8, или 4, находила как ее отображать в функции-декодере и выводила на индикатор??? Я накопал много примеров, но они все на АСМе, расскажите пожалуйста как это сделать на СИ, с подробными комментариями.
Как выводить цифры на индикатор???
У меня очередной вопрос:
Как отобразить любую цифру на 7 сегментном индикаторе понятно, но как сделать так, чтобы программа брала значение переменной, скажем, 8, или 4, находила как ее отображать в функции-декодере и выводила на индикатор??? Я накопал много примеров, но они все на АСМе, расскажите пожалуйста как это сделать на СИ, с подробными комментариями.
Как отобразить любую цифру на 7 сегментном индикаторе понятно, но как сделать так, чтобы программа брала значение переменной, скажем, 8, или 4, находила как ее отображать в функции-декодере и выводила на индикатор??? Я накопал много примеров, но они все на АСМе, расскажите пожалуйста как это сделать на СИ, с подробными комментариями.
Трудно быть деревянным, совсем трудно....
- Реклама
- Сообщения: 4673
- Зарегистрирован: Вс июн 01, 2008 00:17:35
- Откуда: Я всего лишь плод вашего воображения...
Здесь все очень просто - делаешь например switch, а внутри него сопоставляешь каждой цифре код ее отображения и затем этот код пихаешь в соотв регистр. И все.
Если речь идет о выводе чисел больше девяти по модулю, то несколько усложняется из-за того, что надо поделить число на 10, 100, 1000 и т.д. (вернее это все в обратном порядке) и определить таким образом вес каждого десятичного разряда. А затем вес каждого разряда снова передаешь в свой switch с кодами цифр.
Могу накидать на Си примерный алгоритм если надо. А может и сам разберешься. Там все в прниципе просто.
Если речь идет о выводе чисел больше девяти по модулю, то несколько усложняется из-за того, что надо поделить число на 10, 100, 1000 и т.д. (вернее это все в обратном порядке) и определить таким образом вес каждого десятичного разряда. А затем вес каждого разряда снова передаешь в свой switch с кодами цифр.
Могу накидать на Си примерный алгоритм если надо. А может и сам разберешься. Там все в прниципе просто.
Знание - сила!
Ни в коем случае не делай по совету Пухича!!!
это крайне неудачный вариант, громоздкий, не универсальный...
зайди ко мне на сайт - я специально выкладывал статью с кодом на Си по выводу чисел на семисегментные индикаторы. воспользуйся поиском, если сразу не найдешь в разделе для начинающих...
это крайне неудачный вариант, громоздкий, не универсальный...
зайди ко мне на сайт - я специально выкладывал статью с кодом на Си по выводу чисел на семисегментные индикаторы. воспользуйся поиском, если сразу не найдешь в разделе для начинающих...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
гм... куда уж проще-то?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
- Сообщения: 4673
- Зарегистрирован: Вс июн 01, 2008 00:17:35
- Откуда: Я всего лишь плод вашего воображения...
Какой вы умный!ARV писал(а):Ни в коем случае не делай по совету Пухича!!!
это крайне неудачный вариант, громоздкий, не универсальный...
Чем в идеологическом отношении ваше творение отличается от моих мыслей вслух? И чем оно "универсальнее"?
Статья кстати очень простая. Как раз начинающему.
Знание - сила!
- Сообщения: 200
- Зарегистрирован: Пт ноя 17, 2006 21:57:43
Мне тоже интересно стало:)Пухич писал(а):Чем в идеологическом отношении ваше творение отличается от моих мыслей вслух?
Видимо речь о том, что выбор конкретного элемента массива (out = SYMBOLS[m]) будет работать быстрее и занимать меньше памяти, чем последовательный перебор на предмет равентсва (switch, то бишь).
Хотя насчет универсальности можно поспорить, так же как и насчет "крайней неудачности".
- Сообщения: 4673
- Зарегистрирован: Вс июн 01, 2008 00:17:35
- Откуда: Я всего лишь плод вашего воображения...
речь о том, что метод switch-ей для 3-разрядов - это одна программа, для 4-х разрядов - другая и т.д. т.е. нет универсальности - постоянно требуется правка кода. Как быть с дробными числами?
я предложил метод, который без изменения основного кода позволяет работать с любым разумным числом индикаторов. И при минимальных изменениях в коде одной функции позволит работать и с дробными числами. плюс к тому же мое предложение позволяет выводить числа в любом формате - десятичном, двоичном, шестнадцатеричном и т.д. И при этом все, что требуется - изменить одну константу.
P.S. Я не настаиваю - делайте, как хотите. Но если уж учиться - надо учиться делать красиво, логично и удобно - во всяком случае стремиться к этому.
я предложил метод, который без изменения основного кода позволяет работать с любым разумным числом индикаторов. И при минимальных изменениях в коде одной функции позволит работать и с дробными числами. плюс к тому же мое предложение позволяет выводить числа в любом формате - десятичном, двоичном, шестнадцатеричном и т.д. И при этом все, что требуется - изменить одну константу.
P.S. Я не настаиваю - делайте, как хотите. Но если уж учиться - надо учиться делать красиво, логично и удобно - во всяком случае стремиться к этому.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
А смысл в слове "быстрее" будет работать???? При производительности чипа на 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, позвольте не согласитьсь с вами. что писать сразу надо красиво.
новичку сложно так. Для начала надо понять что вообще происходит, а красота и компактность придет сама и постепенно.
И памяти благо-выше крыши... Может конечно я неправ.
Разъясните пожалуйста как ЭТО работает, вот строчки, приведенные с вашего сайта:
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, позвольте не согласитьсь с вами. что писать сразу надо красиво.
новичку сложно так. Для начала надо понять что вообще происходит, а красота и компактность придет сама и постепенно.
Трудно быть деревянным, совсем трудно....
megasvintus

А метод ARV мегаудобный и мало памяти занимает
Сам им пользуюсь и очень нравиться. Вы бы сели и один раз разобрались с этим...
Вот в этом как раз и не правы... Памяти много когда просто ногой дергаешь. А потом оказываеться что ее очень малоИ памяти благо-выше крыши... Может конечно я неправ.
А метод ARV мегаудобный и мало памяти занимает
непринципиально...1) почему сама функция convert идет с параметрами unsigned int NUM (0-65535), а объявляемые переменные i, m имеют тип int (-32768-32767) ? с for все ясно
не понятен вопрос... unsigned int NUM - это параметр который мы будем передавать функции. Функция же ничего не возврашает...она заполняет значениями глобальный массив.2)void convert(unsigned int NUM) А может "unsigned int NUM" как раз то число, которое будем отображать? как вообще функции дают знать что хотим отображать?
Потом в прерывании обрабатываете полученный массив и дергаете там ногами...3)пусть массив заполнили, и как то, что получилось,передается в функцию-декодер вида (число 1 это 0b00000011- , число 2 0b01101101и так далее, в зависимости от того . как выводы подключены к сегментам индикатора)
1. NUM - это как раз то число, которое хотим вывести на индикатор
2. как уже было сказано ранее, тип локальных переменных внутри функции некритичен, т.к. они вспомогательные
3. как заполненный массив преобразуется в сегменты? я писал, что у нас есть глобальный массив "символов", соответствующих представлению чисел от 0 до 9 в виде "сегментов". если этот массив вы заполните байтами, каждый бит которых будет отвечать за свечение нужного сегмента (например 0b01100000 может обозначать цифру 1 - два сегмента, а 0b11111100 - цифру 0 - 6 сегментов), то функция преобразования convert() занесет в "экранную область" уже эти самые значения. вам останется в прерывании поочереди вывести байты из экранной области - и на индикаторе засияет ваше число.
судя по всему, надо подготовить очередную статью о динамической индикации - похоже, вопросы все равно есть, хотя на эту тему уже столько написано...
2. как уже было сказано ранее, тип локальных переменных внутри функции некритичен, т.к. они вспомогательные
3. как заполненный массив преобразуется в сегменты? я писал, что у нас есть глобальный массив "символов", соответствующих представлению чисел от 0 до 9 в виде "сегментов". если этот массив вы заполните байтами, каждый бит которых будет отвечать за свечение нужного сегмента (например 0b01100000 может обозначать цифру 1 - два сегмента, а 0b11111100 - цифру 0 - 6 сегментов), то функция преобразования convert() занесет в "экранную область" уже эти самые значения. вам останется в прерывании поочереди вывести байты из экранной области - и на индикаторе засияет ваше число.
судя по всему, надо подготовить очередную статью о динамической индикации - похоже, вопросы все равно есть, хотя на эту тему уже столько написано...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Вот здесь очень отличная стаття на ATtiny 2313 c 3 секцыями 7-сигментников!
http://avru.cwx.ru/viewtopic.php?t=16&s ... 000d766586
http://avru.cwx.ru/viewtopic.php?t=16&s ... 000d766586
Мяу-у-у-у-у
Есть что почерпнуть! Нравится и то, что массив записан сразу в EEPROMТарас писал(а):Вот здесь очень отличная стаття на ATtiny 2313 c 3 секцыями 7-сигментников!
http://avru.cwx.ru/viewtopic.php?t=16&s ... 000d766586
Трудно быть деревянным, совсем трудно....
Полностью согласен, что у ARV абсолютно универсальный алгоритм, и его легче всего переделать.
И уж тем более не хочу сказать что у ARV квалификация не очень.
Я всего лишь говорю что в приведенной ссылке я тоже нашел пищу для ума.
Ведь если одну и ту-же задачу будут решать 10 хороших программистов, то получатся 10 разных листингов, и из каждого будет можно что-то эдакое выдрать
Кстати в том алгоритме есть косяк... Я ведь испытываю его на реальном устройстве. Косяк я поправил, кстати получил опыт поиска ошибок в программе. Но в конечном итоге я пришел к варианту ARV.
И уж тем более не хочу сказать что у ARV квалификация не очень.
Я всего лишь говорю что в приведенной ссылке я тоже нашел пищу для ума.
Ведь если одну и ту-же задачу будут решать 10 хороших программистов, то получатся 10 разных листингов, и из каждого будет можно что-то эдакое выдрать
Кстати в том алгоритме есть косяк... Я ведь испытываю его на реальном устройстве. Косяк я поправил, кстати получил опыт поиска ошибок в программе. Но в конечном итоге я пришел к варианту ARV.
Трудно быть деревянным, совсем трудно....


