Шрифты для семи-сегментного индикатора

Очередной раз использую семи-сегментный индикатор. Как обычно, я развожу плату так, чтобы было удобно. В частности, управление семи-сегментными индикаторами. В итоге, как правило, сегменты перепутаны, и их распутывание — дело программы управления. С точки зрения быстродействия, или экономии памяти — мы ничего не проигрываем и не выигрываем. Одна беда — подготовка шрифта. В итоге, я сделал простенькую программу для генерации шрифта под определенную распиновку и с учетом типа индикатора (общий анод или общий катод).

Архив с программой прикладываю.
Управление:
Сбрасываем установленный порядок сегментов
Двойным кликом задаем правильный порядок
Устанавливаем тип индикатора.
Жмем — Сгенерировать
Копируем код к себе в проект.

З.Ы. Программу написал, т.к. не нашел аналога. Возможно плохо искал, тогда не судите строго )
Файлы в топике: gen7font.zip

Комментарии (65)

RSS свернуть / развернуть
Ух как она у меня тормозит, да еще и семерку в упрощенный стиль оформления переводит)

А по сабжу, а почему бы такое просто на препроцессор не свалить? Пишется один раз, потом лишь в дефайнах циферки подправил и усё. В примере только цифры, но реализовать другие знаки — без проблем.
P.S. Код не мой, стырил у кого-то из местных. Кто автор не помню уже)

//Закомментировать, если используется индикатор с общим анодом (0 = зажечь сегмент)
#define COMMON_CATHODE

// Сегмент индикатора   Пин
#define segment_A 7
#define segment_B 0
#define segment_C 2
#define segment_D 4
#define segment_E 5
#define segment_F 6
#define segment_G 1
#define segment_DP 3


#ifdef COMMON_CATHODE
extern const char seg7_num[10] = {
/*0*/ (1 << segment_F) | (1 << segment_E) | (1 << segment_D) | (1 << segment_C) | (1 << segment_B) | (1 << segment_A),
/*1*/ (1 << segment_C) | (1 << segment_B),
/*2*/ (1 << segment_D) | (1 << segment_E) | (1 << segment_G) | (1 << segment_B) | (1 << segment_A),
/*3*/ (1 << segment_G) | (1 << segment_D) | (1 << segment_C) | (1 << segment_B) | (1 << segment_A),
/*4*/ (1 << segment_G) | (1 << segment_F) | (1 << segment_C) | (1 << segment_B),
/*5*/ (1 << segment_G) | (1 << segment_F) | (1 << segment_D) | (1 << segment_C) | (1 << segment_A),
/*6*/ (1 << segment_G) | (1 << segment_F) | (1 << segment_E) | (1 << segment_D) | (1 << segment_C) | (1 << segment_A),
/*7*/ (1 << segment_C) | (1 << segment_B) | (1 << segment_A),
/*8*/ (1 << segment_G) | (1 << segment_F) | (1 << segment_E) | (1 << segment_D) | (1 << segment_C) | (1 << segment_B) | (1 << segment_A),
/*9*/ (1 << segment_G) | (1 << segment_F) | (1 << segment_D) | (1 << segment_C) | (1 << segment_B) | (1 << segment_A)

#define DecimalPoint (1<<segment_DP)
#define ClearDisplay 0
#else
extern const char seg7_num[10] = {
/*0*/ ~((1 << segment_F) | (1 << segment_E) | (1 << segment_D) | (1 << segment_C) | (1 << segment_B) | (1 << segment_A)),
/*1*/ ~((1 << segment_C) | (1 << segment_B)),
/*2*/ ~((1 << segment_D) | (1 << segment_E) | (1 << segment_G) | (1 << segment_B) | (1 << segment_A)),
/*3*/ ~((1 << segment_G) | (1 << segment_D) | (1 << segment_C) | (1 << segment_B) | (1 << segment_A)),
/*4*/ ~((1 << segment_G) | (1 << segment_F) | (1 << segment_C) | (1 << segment_B)),
/*5*/ ~((1 << segment_G) | (1 << segment_F) | (1 << segment_D) | (1 << segment_C) | (1 << segment_A)),
/*6*/ ~((1 << segment_G) | (1 << segment_F) | (1 << segment_E) | (1 << segment_D) | (1 << segment_C) | (1 << segment_A)),
/*7*/ ~((1 << segment_C) | (1 << segment_B) | (1 << segment_A)),
/*8*/ ~((1 << segment_G) | (1 << segment_F) | (1 << segment_E) | (1 << segment_D) | (1 << segment_C) | (1 << segment_B) | (1 << segment_A)),
/*9*/ ~((1 << segment_G) | (1 << segment_F) | (1 << segment_D) | (1 << segment_C) | (1 << segment_B) | (1 << segment_A))

#define DecimalPoint ~(1<<segment_DP)
#define ClearDisplay 255
#endif
};
+2
1) Тормоза убрал. Дома на это как-то внимания не обращал :)
2) Стили поправил.
3) Про препроцессор:
Можно. Но мне не нравится огромный кусок кода. Я люблю простоту. А новичек не сразу поймет что значит 100К+ кода, особенно если он только начинает изучать С/С++…
0
Эта портянка легко прячется в хедер и просто подключается в проект, не мозоля глаза. Ну 100К+ разных строк кода это одно, а когда огромный кусок кода состоит из копипасты одного кусочка- это совсем другое. В таком случае достаточно разобраться с одним кусочком, а остальное по аналогии.

P.S. Не оценил глубину проблемы, если надо целую ASCII таблицу замутить, то тут да — определенно нужен генератор. Ну и опять же можно намутить генератор хедера, по типу выше, чтобы не запускать каждый раз программу на перегенерацию с новым расположением сегментов, а изменять настройки правкой восьми дефайнов.

P.P.S Проблема со стилями у меня скорее всего из-за Аваста.
+1
Да не нужно все это. Достаточно один раз оформить код:
;==== Битовые маски для дисплея ==================
; a
; — ; f| |b
; g--
; e| |c
; — .h
; d
;
.EQU Seg_H = 0b10000000
.EQU Seg_B = 0b01000000
.EQU Seg_G = 0b00100000
.EQU Seg_C = 0b00010000
.EQU Seg_D = 0b00001000
.EQU Seg_E = 0b00000100
.EQU Seg_F = 0b00000010
.EQU Seg_A = 0b00000001
;
.EQU CH_0 = Seg_A | Seg_B | Seg_C | Seg_D | Seg_E | Seg_F
.EQU CH_1 = Seg_B | Seg_C
.EQU CH_2 = Seg_A | Seg_B | Seg_D | Seg_E | Seg_G
.EQU CH_3 = Seg_A | Seg_B | Seg_C | Seg_D | Seg_G
.EQU CH_4 = Seg_B | Seg_C | Seg_F | Seg_G
.EQU CH_5 = Seg_A | Seg_C | Seg_D | Seg_F | Seg_G
.EQU CH_6 = Seg_A | Seg_C | Seg_D | Seg_E | Seg_F | Seg_G
.EQU CH_7 = Seg_A | Seg_B | Seg_C
.EQU CH_8 = Seg_A | Seg_B | Seg_C | Seg_D | Seg_E | Seg_F | Seg_G
.EQU CH_9 = Seg_A | Seg_B | Seg_C | Seg_D | Seg_F | Seg_G

.EQU CH_U = Seg_B | Seg_C | Seg_D | Seg_E | Seg_F
.EQU CH_C = Seg_A | Seg_D | Seg_E | Seg_F
.EQU CH_P = Seg_A | Seg_B | Seg_E | Seg_F | Seg_G
.EQU CH_Tr = Seg_G
.EQU CH_E = Seg_A | Seg_D | Seg_E | Seg_F | Seg_G;.
.EQU CH_R = Seg_E | Seg_G ;.
.EQU NUM_U = 0
.EQU NUM_C = 1
.EQU NUM_P = 2
.EQU NUM_Tr = 3
.EQU NUM_E = 4
.EQU NUM_R = 5
;
ROM_DIGITS:
.DB CH_0, CH_1, CH_2, CH_3, CH_4, CH_5, CH_6, CH_7, CH_8, CH_9; 0-9
;
ROM_SYMBOLS:
.DB CH_U, CH_C, CH_P, CH_Tr, CH_E, CH_R; 'U', 'C', 'P', '-', 'E', 'r'
;
;-------------------------------------------------;
0
К сожалению нарушилось форматирование, в оригинале так:
0
Да. Это все прекрасно. Дайте готовый файл для всех символов от 32 до 127…
Я пока его не видел… Каждый раз, все пилят свое, под конкретный проект. Как правило, только ту часть символов, которая нужна… :(
0
К сожалению семисегментный индикатор не может отобразить все символы даже английского алфавита.
«Дайте готовый файл», а зачем, можно, но имея перед глазами пример это дело нескольких минут.
0
Про все — это понятно.
а зачем, можно, но имея перед глазами пример это дело нескольких минут.
Я люблю готовые, законченные решения, работающие «из коробки». Чтобы потом к этому снова не возвращаться и не делать снова и снова
У меня стоит задача «решить проблему», а не «разберись еще раз с файлом шрифтов и снова набей не достающее».
+1
Уточню: я рассуждаю с точки зрения менеджера проектов: мне нужно минимизировать риски и время. Я создаю решения, которые снимают рутинные задачи.
0
С точки зрения менеджера проектов можно посмотреть как кодируют латинский алфавит другие. Регистратор «Трим» производства ООО «Теплоприбор-Юнит», Челябинск:

Для примера…
+2
Шрифт чем-то напоминает межгалактический из вселенной Звездных Войн)
Ну а на самом же деле интерфейс совсем не юзер-френдли получается. 16сегментники бы много лучше смотрелись, да и в наше время они совсем не редки.
+3
+2
-1
вах, опять кому-то жопу порвало
это не может не радовать
-1
суровый челябинский шрифт
+2
Еще каверзный вопрос: сейчас что Вы выберите:
1) набивать шрифты руками, с риском ошибки
2) запустить программу и получить решение через 5 секунд — включая копирование в буфер обмена? :)
0
Я выберу руками, имея перед собой шаблон «Битовые маски для дисплея» мне не трудно закодировать любой символ:
.EQU CH_A = Seg_A | Seg_B | Seg_C | Seg_E | Seg_F | Seg_G

Без рисков и сторонних программ.
0
Не бывает ручной работы без рисков, будь ты хоть трижды внимателен. Машинная работа в этом плане более предсказуема.
+1
Скриншот хоть вставь, а то скучно без картинок…
На чем писал?
0
  • avatar
  • Vga
  • 23 февраля 2015, 16:33
screen

Delphi по ходу
0
Странновато выглядит. Оно генерирует фиксированный набор символов, позволяя задать только порядок сегментов в байте? ИМХО, проще написать сразу файл шрифта, как у 1essor1 — что там, что там для адаптации в свой проект нужно только номера пинов проставить.
0
Delphi: для таких простых интерфейсов — проще нет. ИМХО.
0
Еще будучи студентом я решил эту проблему написав простейшую прогу на Delphi. После этого еще не раз к ней возвращался и она всегда выручала) При запуске (или после) нужно указать текущее конфигурационное слово (как получилось развести на плате) и дальше использовать как обычно. Пользуйтесь

www.dropbox.com/s/7r0t077qa3w5pbw/Lce10.rar?dl=0
+1
  • avatar
  • aeore
  • 23 февраля 2015, 17:25
Скриншот
+1
Наверное многие через это проходили) Я писал в си билдере под 16 сегментники. Хотел выложить, но походу она утеряна навсегда.
0
Дорогой мой, где ты был неделю назад? :)
0
Дело в том, что у многих такие программулины валяются, но так как они пишутся исключительно под себя, никто ими и не делится.
+2
Ы, даже с хелпом. Жаль только, никто не прилагает сорцы.
0
Да, с хелпом. Только когда я это писал была еще 98 винда. Так что и хелп я тогда сделал в формате hlp с которым сейчас не дружит семерка и выше. Вроде можно поставить какое-то дополнение в систему, тогда hlp открываются
0
Можно. У меня поставлено. Только оно и половины функциональности не реализует (вообще, ИМХО, по качеству интеграции с приложением ни один из поздних форматов с .hlp и рядом не лежал).
В хелпе что-то кроме заглавной страницы есть?)
И что там за компилятор упоминается?
0
В хелпе три страницы — «О программе», «Использование» и «Контактная информация». Я сейчас взял winhlp32.exe от XP и открыл в нем — все работает.
А по компилятору — это мой старый студенческий, можно сказать, проект. Оптимизирующий компилятор паскаля для PIC-контрроллеров (я тогда увлекался компиляторами). Там еще дизассемблер входил в предполагаемую «поставку» :)) В общем студенческие работы. Вот тут есть скриншоты того как это выглядело: vk.com/album4218758_130987461
0
Выложил бы на посмотреть вместе с сорцами…
0
я боюсь что за давностью лет все сорцы уже потерялись…
0
Сорцы нужно хранить ответственней!)
Среди скринов еще пара любопытных прооектов, первый и второй скрины. По ним есть что посмотреть?
0
Почти все сырцы для тех программ остались на старом компьютере, к которому у меня нет доступа… Может быть когда-то я доберусь до него и вытащу это добро)
0
100500 раз говорили о том, что надо писАть грамотно, без «магических» чисел. Нет опять, снова здорово…
+1
Я текст проверял. Ошибок вроде нет (
0
Как я понял, дело не в ошибках. Под «магическим числом» подразумевается запись конкретного числа в регистр или переменную, вместо записи например через сдвиги и/или именованные константы. У тебя как я понял получается так: ASCII_FONT[1]=0x86, что весьма смутно говорит о том, какой это символ и какие разряды зажигаются.
+1
у настоящих суровых программеров сегменты разбросаны по разным портам
0
О том и речь.
В итоге, как правило, сегменты перепутаны, и их распутывание — дело программы управления.
Что же насчёт разных портов, то почти всегда есть возможность сделать сложнее, чем было уже сложно сделано.
0
Я всегда через дефайны указываю какой сегмент соосветствует какому выводу. Компилятор оптимизирует код, и в итоге избавляемся от магических чисел, и нету лишних телодвижений в программе.

А тому кто придумал вот это:

гореть в аду. Шрифт абсолютно нечитаемый, мозг можно поломать…
+1
Хотелось бы посмотреть и вашу, более читаемую, версию для 7-сегментных индикаторов.
0
Поставленная задача не решаема. Если нужно выводить читаемые символы — нужно сначала подобрать соответствующий индикатор. Ну а уж если куплено УГ, не подходящее под задачу, то решение задачи будет через Ж.
Вроде бы всё логично.
+2
Читаемая версия давно существует — это цифры 0-9, ну ладно еще и буквы некоторые для хекса. А все остальные попытки впихнуть невпихуемое от лукавого.
+1
именно
0
Если есть шильдик с расшифровкой – задача считается решаемой.
0
Если есть микроскоп и есть гвозди, то задача забивания гвоздей впринципе тоже считается решаемой =)
+2
Мир не идеален. А шо делать.
0
Для семисегментника — весьма неплохо, уволок себе. К тому же, обычно вокруг «кривых» букв достаточно нормальных, чтобы понять по ним, а после небольшой практики и кривые запомнишь. А возможность поставить более нормальный индикатор не всегда есть.
+1
изобретение нового велосипеда из непонятных символов
0
Задачи и условия бывают разные. Не всегда можно поставить IPS-матрицу и вывести на нее текст с субпиксельным сглаживанием.
Этот алфавит, по крайней мере, проще запомнить, чем жменьку кодов ошибок. Он довольно логичный.
0
Ну зачем же в крайности бросаться, простого 16-сегментника будет достаточно)
+1
Не всегда будет в достатке ресурсов (выводов), чтобы его обслужить.
0
Если общаться со сдвиговыми регистрами по spi, как это часто делают при использовании 7-сегментных, то разницы особо не почуешь.
+2
А зачем мне 16-сегментник, если я, например, делаю настенные часы с продвинутыми настройками? 99.(9)% времени оно будет время отображать. Не искать же 10-сантиметровые 16-сегментники, когда уже есть подходящие 7-сегментники. И не ставить же отдельный дисплей только для настроек.
0
Ну вообщем этот спор бессмыслен) Можно бесконечно приводить ситуации, когда одни подходы будут приемлемыми, а другие нет, ровно как и наоборот.
0
Вот. Именно поэтому латинский шрифт для семисегментника имеет право на жазнь, пусть даже и выглядит несколько по-алиенски.
0
Кроме того, можно «чиста по приколу» сделать «инопланетный» интерфейс :)
0
Иногда такие интерфейсы получаются сами собой, когда есть непропай или плохой контакт =)
+3
0
Бинарные часы довольно популярны. Я знаю более хардкорный вид часов «transistors clock».
Вот одни из самых красивых.


Вот чуть менее эстетичные, но тоже внушающие уважение.
+1
Интересно, сколько времени он разводил эту диодную матрицу. Или она чиста декоративная и в схеме часов не участвует?
0
The circuit is extremely complex. It is made of hidden section that is difficult to recognise because the design appears to be uniform.
Т.е. вероятно значительное количество компонентов здесь для симметрии и декора видимо.
0
ЖЕСТЬ!
0
Бинарные часы довольно популярны. Я знаю более хардкорный вид часов «transistors clock».
Вот одни из самых красивых.
Какой ты У-У-УМНЫ-Ы-ЫЙ! — восхищенно произнесла румяная и пышущая дородным, плотным телом соседка.
Чахлый тип с дымящимся в руке паяльником и серым от свинцовых и глицериновых паров лицом глупо улыбался.
+2
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.