Простейшая асмолиба для работы со светодиодной матрицей P10

Понадобилось сделать большие автономные часы (ага, давно часов не делал). Купил данную матицу. Скажу сразу, не подошла, ибо потребление просто конское, 2.5А при 5В. Но простенькая либа для вывода циферок (500 байт, из них 160 на знакогенератор) на 8051 асме была за вечер все же написана.

Вряд ли кому такое понадобится, но мало ли… В проекте счетчик увеличивает 4 значное значение (на самом деле 4 разных числа, но кому надо, BCD сами напишете) на индикаторе каждые 100 мс.
Использовал инфу по распиновке отсюда habr.com/ru/post/372215/
Алгоритм работы хорошо описан нарисован здесь conture.by/post/1100 (картинку закинул в архив с проектом)
Что не понравилось в матрице:
1. Конское потребление. У меня матрица по схемотехнике немного отличается от тех, что по ссылкам. Вместо 16 x 74HC595D стоит 8 микрух (корпус TSOP, залиты лаком, маркировку не разобрать без микроскопа), и они просто адски горячие, палец не удержать.
2. Протокол «немного по-дебильному написан». Почему нельзу было сгрупировать все 16 строк 1 знакоместа в одну 16 байтную последовательность для меня осталось загадкой. Нет, ты тут 4 строки нарисуй, там 4 нарисуй. Да еще и не подряд, а с прыжками через 3. Чуть мозг не сломал, пока умудрился упихнуть все это в компактный алгоритм отображения (можете исходник глянуть).
По хорошему надо было огранизовать видеобуфер, но ее пылающий нрав отбил всякое желание сделать для нее суперлибу на все случаи жизни.
Что понравилось:
1. Хорошая яркость.
2. Можно согреться.
Видео youtu.be/7Z_m8UZkDIc не передаст всю ее «ламповую теплоту».

Up 28.08.19.
Запитал от мобильной зарядки, с силой тока до 2А. Матрица перестала греться. Как так, я хз. До этого питал от лабораторника, напряжением 5В.
Обрадовался. Решил, что надо забацать буфер и бегущую строку. Памяти мало, поэтому буфер четко в размер экрана. Все что вылазит за него либо теряется (режим ONCE), либо тут же вылазит с противоположной стороны (режим REPEAT). Можно вращать влево-вправо.
Пофиксил некоторые замечания Vga. Пофиксить все мозгов не хватило. Исходники перезалил.
Вот видео с бегущей строкой www.youtube.com/watch?v=rjSIsqj3U88

Up 29.08.19.
Пофиксил остальные замечания Vga: завернул повторяющиеся куски в циклы, и переделал выборку из таблицы.
Исходники перезалил.
  • +2
  • 25 августа 2019, 23:29
  • Gnusmas
  • 1
Файлы в топике: P10_LED_Library.zip

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

RSS свернуть / развернуть
8051 как давно я о нем не слышал.
0
Мне он зашел из-за макроассемблера, как и асм PIC12/16 (там он тоже на достойном уровне). А вот в AVR с этим не очень, встроеный в AVR Studio убог. Можно правда прикрутить GAS (Gnu Assembled), но мне было лень.
0
Зачем крутить? Гнутый ассемблер студией подхватывается автоматически…
0
Да? Значит плохо смотрел. Надо будет попробовать. Я просто AVR в основном не для души юзаю, а для проектов других людей, а там надо быстро, на Си-шечке…
0
1) Немного удивляет повсеместное var1, var2, var3, var4 вместо var[4] и повсеместные же развернутые циклы.
2) Еще больше удивляет Switch_Table_routine. Неужели на 8051 нет более простого метода для DPTR = SymbolTable + A?
0
  • avatar
  • Vga
  • 27 августа 2019, 22:27
var1, var2, var3, var4 — вроде пофиксил. Теперь юзаю одну 4 байтную переменную, задаю смещение адреса с помощью +1,+2,+3.
«Неужели на 8051 нет более простого метода для DPTR = SymbolTable + A?» — я не придумал, мозгов не хватило…
0
А циклов по прежнему нет, так что семантически ничего и не изменилось. И я по прежнему не понимаю, зачем аццкая процедура со свитчем, чья функция только в том, чтобы вернуть указатель на данные символа по его коду. Банально сделать массив символов и реализовать на асме DPTR < — #SymbolsTable + 16 * A.
Чем маяться ассемблером, лучше бы учились нормально программировать на нормальном языке. Тогда и алгоритм без проблем составится, и перенести его при необходимости на ассемблер — дело техники.
0
Да, «DPTR < — #SymbolsTable + 16 * A» однозначно проще и лучше.
Мой способ лучше только в 1 случаем. Если захочется вывести на дисплей пару символов из конца ASCII таблицы, я просто забью промежутки до них 2 байтными заглушками, а в случа с монолитной таблицей придется хреначить по 16 байт-пустышек для всех неиспользуемых символов.
0
В этом случае просто заводится дополнительная таблица перекодировки код-индекс. Явно компактнее, чем полкило заглушек. Либо, если можно ужать до какого-то компактно реализуемого закона перекодировки, то юзается он.
0
Все поправил. Благодарю за подсказки. В планах добавить к функции скроллинга возможность плавного вывода символа из «теневого буфера» размеров в 1 символ,. Это позволит используя лишь буфер размером 16 байт выводить строки неограниченной длинны — как только все из теневого буфера выдавилось в отображаемый буфер, заполняем теневой буфер байтами нового символа из флеша. Как вам такой алгоритм?
0
Игровые приставки такой подход юзают еще с 80-х.
0
0
Вместо 16 x 74HC595D стоит 8 микрух (корпус TSOP, залиты лаком, маркировку не разобрать без микроскопа), и они просто адски горячие
Это скорее всего линейные 16-канальные драйверы светодиодов. Рядом с ними есть резюк, которым можно придушить ток диодов, одновременно снизив яркость, потребление и нагрев.
0
  • avatar
  • Vga
  • 27 августа 2019, 23:37
Запитал от мобильной зарядки (5В, 2А), и матрица перестала грется. Даже не пришлось с резисторами возится. Почему так — я не понял.
0
Напряжения под нагрузкой на выходе зарядки и ЛБП проверь…
0
Напряжение под нагрузкой проседает до 5,0В (без нагрузки 5,1В). Матрица все таки греется, просто то, что я запитал от другого источника совпало с тем, что я выводил на экран по 1-2 символа, и матрица соответственно не так много потребляла, и драйвера сетодиодов не так сильно грелись. Когда выводишь в бегущую строку много симовлов (в каждый момент времени видно по 4 символа) с большим количеством включенных светодиодов, то пальцем чувствуется, как драйвера раскаляются, выводишь по 1-2 символа, и драйвера еле теплые. Китай короче:)
0
Драйверы линейные, так что нагрев для них норма…
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.