Работа с 7-сегментным индикатором.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Прорезались зубы
Аватара пользователя
Сообщения: 203
Зарегистрирован: Вт июл 28, 2009 17:58:25

Сообщение diman27 »

Привет всем. Подскажите как перевести символы семисегментника в двоичный, либо десятичный, либо шестнадцатиричный код. Как вообще получают символы? У меня есть таблица цифр от 0 до 9, но как их вообще получить? У меня была программа для перевода, но сейчас найти не могу. Если есть у кого таблица различных знаков, то не откажусь, но хотелось бы самому понять.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Выделите порт (8 бит для с запятой или 7 бит для без запятой)
Назначьте каждому биту порта имя отождествляемое с сегментом индикатора.
Например, 7 бит = A, 6 = B, 5 = C, 4 = D, 3 = E, 2 = F, 1 = G и 0 = H.
Далее, для индикаторов с общим анодом, активным уровнем будет логический 0.
Тогда таблица (привожу начало) будет такой:
"0" - A=0, B=0, C = 0, D = 0, E = 0, F = 0, G = 1, H = 1;
"1" - A=1, B=0, C = 0, D = 1, E = 1, F = 1, G = 0, H = 1;
"2" - A=0, B=0, C = 1, D = 0, E = 0, F = 1, G = 0, H = 1.
Для индикаторов с общим катодом, заменяем нули на единицы.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 203
Зарегистрирован: Вт июл 28, 2009 17:58:25

Сообщение diman27 »

Вот моя таблица символов:
Dig[1] = 24;
Dig[2] = 109;
Dig[3] = 124;
Dig[4] = 58;
Dig[5] = 118;
Dig[6] = 119;
Dig[7] = 28;
Dig[8] = 127;
Dig[9] = 126;
это в десятичном виде.
А как записать, например буквы алфавита.
Meteor, как я понял, символ A будет 00010001? верно?
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

как я понял, символ A будет 00010001? верно?
Верно, с буквами поступаем также как с цифрами, единственно дабы отличать B и D от 8 и 0 я делаю их строчными, для "b" код будет
"b" - A=1, B=1, C = 0, D = 0, E = 0, F = 0, G = 0, H = 1;
PS Таблицу составляю только для значений от 0 до 9 и букв от A,b,C,d,E и F.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Изображение

P.S.
прога не моя
Вложения
lenivec7.zip
(166.98 КБ) 325 скачиваний
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 203
Зарегистрирован: Вт июл 28, 2009 17:58:25

Сообщение diman27 »

Чет не получается у меня буква А получился сверху квадрат и снизу палка.
Meteor, есть готовая таблица для букв? если не жалко.
Сейчас проверил в протеусе, и вместо b получил ее вверх ногами, что не так?
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 203
Зарегистрирован: Вт июл 28, 2009 17:58:25

Сообщение diman27 »

Danko, попробовал написать А, а получил символ b :( может у меня с исходником проблема?
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

левой кнопкой мыши засвечиваешь сегмент, а правой выбираешь к какому разряду (биту) подсоединен.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 203
Зарегистрирован: Вт июл 28, 2009 17:58:25

Сообщение diman27 »

А нет обратного конвертора из десятичной в символы?
Переразвел индикатор под конертор, все нормально, только у меня в исходнике теперь символ g мигает в единицах часов, надо исходник править. А выбирать правой кнопкой что? Зачем там менять и по какому алгоритму?
Прошу прощения за ламерские вопросы, но хочу разобраться :)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1287
Зарегистрирован: Пн окт 13, 2008 11:45:54
Откуда: РФ, Крым, г.Бахчисарай

Сообщение Danko »

Meteor писал(а):Назначьте каждому биту порта имя отождествляемое с сегментом индикатора.
Например, 7 бит = A, 6 = B, 5 = C, 4 = D, 3 = E, 2 = F, 1 = G и 0 = H.
diman27, по умолчанию в программе установлены А-бит0, В-бит1 и т.д., а у Вас как ?

Если также то ничего выбирать не нужно, если иначе то переназначите биты для своей схемы.
Первое, что привлекает в программировании, объяснить просто: ты говоришь компьютеру что то сделать, и он это делает. Безошибочно. Всегда. Без возражений.
---------------------
Линус Торвальдс. "Just for fun. Рассказ нечаянного революционера"
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 203
Зарегистрирован: Вт июл 28, 2009 17:58:25

Сообщение diman27 »

Вот моя таблица:
Dig[1] = 0011000;
Dig[2] = 1101101;
Dig[3] = 1111100;
Dig[4] = 0111010;
Dig[5] = 1110110;
Dig[6] = 1110111;
Dig[7] = 0011100;
Dig[8] = 1111111;
Dig[9] = 1111110;
Как поправить в программе?
Встал на лапы
Сообщения: 135
Зарегистрирован: Чт окт 25, 2007 11:00:10
Откуда: Russland

Сообщение krant »

А мне вот лично жаль целый порт (да ещё без селекции разряда!!) тратить на сегментник, ИМХО гораздо проще использовать драйверы , на целом порте можно легко построить секцию из 3ёх разрядов, с точкой!
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

есть готовая таблица для букв? если не жалко.
Не жалко но давно уже не пользовался этими кодами - остались на старой работе, за ненадобностью :dont_know:
diman27 писал(а):Вот моя таблица:
........
Как поправить в программе?
Dig[1] = 0011000;Это сегмент B
Dig[2] = 1101101;Сегмент С
Dig[3] = 1111100;Сегмент D
Dig[4] = 0111010;Сегмент G
Dig[5] = 1110110;Сегмент F
Dig[6] = 1110111;Сегмент E
Dig[7] = 0011100;Сегмент А
Как уж поправить и в схеме или программе вам решать.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 203
Зарегистрирован: Вт июл 28, 2009 17:58:25

Сообщение diman27 »

Спасибо всем, поправил в программе. Как я понял, здесь стандарта ни какого нет, кто как хочет так и делает.
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

Каждый определяет в силу своих способностей, испорченности и в меру возможности изменить схему и\или комплектацию
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18862
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

вот файлик, которым я пользуюсь давно и считаю его очень удобным. надеюсь, и вам понравится.

Код: Выделить всё

/** \file leds7.h
 * \brief Заголовочный файл описания символов 7-сегментных индикаторов
 * Константы, определяющие сегментное представление разных символов
 * \par
 * \author ARV
 * \note При описании сегментов используется "прямая" логика: единичка означает свечение сегмента.
 * Для учета рода индикатора (с общим анодом или катодом) используются
 * макрос <b>common_anode</b>, который должен быть описан в проекте, если индикатор с общим анодом.
 * для индикаторов с общим катодом этого макроса быть не должно.
 * \n \date	12.11.2008 ... 	__.__.2008
 * \par
 * \version v1.00	\n
 * Copyright 2008 © ARV. All rights reserved. </b>
 * \par
 * Для сборки проекта требуется:
 * 	-# WinAVR-20080411 или более новая версия
 */

/// определение сегмента А индикатора. в _BV() следует указать разряд порта МК, соответствующий этому сегменту
#define _a _BV(5)
/// определение сегмента B индикатора. в _BV() следует указать разряд порта МК, соответствующий этому сегменту
#define _b _BV(6)
/// определение сегмента C индикатора. в _BV() следует указать разряд порта МК, соответствующий этому сегменту
#define _c _BV(0)
/// определение сегмента D индикатора. в _BV() следует указать разряд порта МК, соответствующий этому сегменту
#define _d _BV(3)
/// определение сегмента E индикатора. в _BV() следует указать разряд порта МК, соответствующий этому сегменту
#define _e _BV(4)
/// определение сегмента F индикатора. в _BV() следует указать разряд порта МК, соответствующий этому сегменту
#define _f _BV(7)
/// определение сегмента G индикатора. в _BV() следует указать разряд порта МК, соответствующий этому сегменту
#define _g _BV(1)
/// определение сегмента H индикатора (точка). в _BV() следует указать разряд порта МК, соответствующий этому сегменту
#define _h _BV(2)

#if (common_anode == 1)
/** макрос, осуществляющий необходимую коррекцию для индикаторов с общим анодом или катодом
 * @param x - битовая маска, подлежащая конвертированию
 */
#define _pref(x) ((uint8_t)~(x))
#else
/** макрос, осуществляющий необходимую коррекцию для индикаторов с общим анодом или катодом
 * @param x - битовая маска, подлежащая конвертированию
 */
#define _pref(x) (x)
#endif

/// символ "точка"
#define _comma _pref(_h)
/// символ "пробел"
#define _space _pref(0)
/// символ "минус"
#define _minus _pref((_g))
/// символ "квадратик"
#define _square_lo _pref((_c)|(_d)|(_e)|(_g))
/// символ "градус"
#define _square_hi _pref((_a)|(_b)|(_f)|(_g))

/// символ "1"
#define d_1 _pref((_b)|(_c))
/// символ "2"
#define d_2 _pref((_a)|(_b)|(_g)|(_e)|(_d))
/// символ "3"
#define d_3 _pref((_a)|(_b)|(_c)|(_d)|(_g))
/// символ "4"
#define d_4 _pref((_b)|(_c)|(_f)|(_g))
/// символ "5"
#define d_5 _pref((_a)|(_c)|(_d)|(_f)|(_g))
/// символ "6"
#define d_6 _pref((_a)|(_c)|(_d)|(_e)|(_f)|(_g))
/// символ "7"
#define d_7 _pref((_a)|(_b)|(_c))
/// символ "8"
#define d_8 _pref((_a)|(_b)|(_c)|(_d)|(_e)|(_f)|(_g))
/// символ "9"
#define d_9 _pref((_a)|(_b)|(_c)|(_d)|(_f)|(_g))
/// символ "0"
#define d_0 _pref((_a)|(_b)|(_c)|(_d)|(_e)|(_f))
/// символ "A"
#define d_A _pref((_a)|(_b)|(_c)|(_e)|(_f)|(_g))
/// символ "B"
#define d_B _pref((_c)|(_d)|(_e)|(_f)|(_g))
/// символ "C"
#define d_C _pref((_a)|(_d)|(_e)|(_f))
/// символ "D"
#define d_D _pref((_b)|(_c)|(_d)|(_e)|(_g))
/// символ "E"
#define d_E _pref((_a)|(_d)|(_e)|(_f)|(_g))
/// символ "F"
#define d_F _pref((_a)|(_e)|(_f)|(_g))

// сиволы латинских букв
#define c_a (d_8 ^ _d)
#define c_A (d_A)
#define c_b (d_6 ^ _a)
#define c_B (d_8)
#define c_C (d_C)
#define c_c (_square_lo ^ _c)
#define c_d (d_D)
#define c_D (d_D)
#define c_e (d_E)
#define c_E (d_E)
#define c_f (d_F)
#define c_F (d_F)
#define c_g (d_0 ^ _b)
#define c_G (c_g)
#define c_h (c_b ^ _d)
#define c_H (d_8 ^ _d ^ _a)
#define c_i _pref(_c)
#define c_I (d_1)
#define c_j (d_0 ^ _a ^ _f)
#define c_J (c_j)
#define c_l _pref((_d)|(_e)|(_f))
#define c_L (c_l)
#define c_n (_square_lo ^ _d)
#define c_N (c_n)
#define c_o (_square_lo)
#define c_O (d_0)
#define c_p (d_8 ^ _c ^ _d)
#define c_P (c_p)
#define c_r (_square_lo ^ _c ^ _d)
#define c_R (c_r)
#define c_s (d_5)
#define c_S (c_s)
#define c_t (d_8 ^ _a ^ _b ^ _c)
#define c_T (c_t)
#define c_u (_square_lo ^ _g)
#define c_U (d_0 ^ _a)
#define c_y (d_9 ^ _a)
#define c_Y (c_y)
#define _equal _pref(_g | _a)
собственно говоря, вам надо только "разбросать" сегменты по битам в самом начале этого файла, а все остальное будет автоматически сделано. если вам надо цифру - то вводите макрос d_X, где вместо Х нужная вам цифра, т.е. d_9 - это символ девятки. если нужна буква - вводите c_X, где вместо Х ваша буква (естественно, только латинские буквы, которые в принципе могут быть показаны на 7 сегментах - W, например, показать нельзя). Так же сделаны кое-какие знаки - градус, минус и т.д. в общем, разберетесь, надеюсь :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Сообщения: 135
Зарегистрирован: Чт окт 25, 2007 11:00:10
Откуда: Russland

Сообщение krant »

Нашёл у себя описание на эту микросхемку. Если нужны только цифры (буквы это изврат уж извините) то лучше хрен придумаешь, по простоте описания и использования. В файле всё описано и расписано, завтра выложу протусовский файлик с тем как красиво её использовать (Хотя если вчитаетесь в описание - то всё поймёте без каких-либо проблемм)

Подсказка: Микросхемка - обычный счётчик, который кол-во насчитанных импульсов выводит на семисегмент

p.s. если вешать на одну шину питания с МК то добавить большие кондёры, при пуске бывает провал по питанию и МК сбрасывается, убил на это 3 дня прежде чем понять почему не хотел работать толком МК :kill:
Вложения
Безымянный.png
4026 КМОП
(68.62 КБ) 771 скачивание
Вымогатель припоя
Аватара пользователя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

Сообщение zhu4er »

если уж говорить о драйверах семисегментников, то лучше микры CD4511 кажись нету.
Даже у стен есть уши...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»