Светодиодные часы-бегущая строка с двумя режимами работы

Сегодня я хочу познакомить Вас с очередным творением китайских мастеров – светодиодной матрицей типа 0832 производства Sure Electronics Co., Ltd. (http://www.sureelectronics.net). Обратиться к друзьям с востока меня заставила нужда. Согласно техническому заданию, полученному от заказчика, нужно было изготовить часы-бегущую строку на светодиодах. Как это обычно бывает – сроки поджимают, а из доступных методов изготовления плат только ЛУТ (Лазерно-Утюжная Технология).

Изначально все усилия были брошены на сборку матрицы из единичных светодиодов. Проблем было выше крыши – это и разводка платы, и постоянная нехватка управляющих линий. Самым простым и дешевым решением второй проблемы оказалось использование дешифраторов. Решения первой проблемы так и не было найдено, поэтому мозги кипели, а мышка, дергаясь в конвульсиях, рисовала проект будущего светодиодного экранчика. Спустя некоторое время мне становится понятно, что работа в этом направлении ведет в тупик. Несколько попыток вытравить плату нужных размеров оканчивается неудачей. Чертовски сложно оказалось утюгом прогреть фольгированный стеклотекстолит большой площади, чтобы тонер прилип ко всем нужным местам. Но трудности, как принято считать, делают нас сильней, поэтому после третьей неудачной попытки 20% платы было дорисовано лаком.

Перед тем как бросить заготовку в раствор хлорного железа, что-то дернуло меня оценить стоимость прототипа.… Знаете, был немного шокирован. В проекте использовалось 256 светодиодов красного цвета, что по розничной цене обошлось бы мне в 500-600 рублей, плюс несколько дешифраторов, обвязка и работа. Практически тут же плата очутилась в ацетоне и снова стала куском фольгированного стеклотекстолита – работу можно начинать заново.

Для принятия правильного решения мне понадобился целый день. Пришлось перерыть интернет в поисках оптимальной идеи, но все, что попадалось по тем или иным причинам не подходило для реализации затеи. Последней надеждой стал аукцион Ebay, где и была найдена следующая позиция: 0832 Dot Matrix Red Display Information Board.


0832 Dot Matrix Red Display Information Board (вид спереди)

0832 Dot Matrix Red Display Information Board (вид сзади)

Поскольку к текущему моменту данная плата снята с производства, могу привести ссылку лишь на дисплей с зелеными светодиодами http://www.sureelectronics.net/goods.php?id=903 стоимостью 8.99 USD. Вы можете спросить о том, почему выбранная мной плата больше не выпускается? Ответ прост – китайцы выпустили апгрейд. Теперь она называется P7.62 32X8 Red LED Dot Matrix Unit Board (http://www.sureelectronics.net/goods.php?id=1121) и стоит 16.90 USD. Неизвестно, что исправили в этом варианте авторы (сам не разбирался), но на сайте есть упоминание о полной совместимости протокола с предыдущей версией.

Теперь давайте разберемся, что за зверь у меня в руках. Дисплей состоит из 256 красных светодиодов, управляемых контроллером HT1632, который позволяет посредством ШИМ задавать 16 уровней яркости. Плата выпускается с 3 типами светодиодов: красными, зелеными и желтыми. В комплект поставки входит кабель, позволяющий объединять до четырех дисплеев между собой, либо соединять дисплей с управляющей схемой. Рабочее напряжение питания составляет 5 вольт, при этом в режиме максимальной яркости потребляемый ток не превышает 220 мА.

Дисплей снабжен 16 контактным портом, имеющий следующее назначение:
№ контактаНазвание контактаОписание контакта
1, 2, 3, 4CS2, CS3, CS1, CS4Выбор активной платы при последовательном соединении нескольких дисплеев (дополнительно необходимо выставить с помощью DIP-переключателя, расположенного на плате, номер дисплея в цепочке). Если используется только 1 экран, то рекомендуется перемкнуть эти контакты, замкнув хотя бы один канал DIP-переключателя.
5WRТактовый сигнал записи
6RDТактовый сигнал чтения
7DATAСигнал последовательных данных
8, 11, 13, 15GNDGND – больше тут ничего не скажешь
9OSCСигнал от внешнего источника синхронизации. Если используется внутренний RC-генератор, то контакт может быть соединен с источником как высокого, так и низкого уровня. При каскадном соединении дисплеев используется как управляющий частотой сигнал.
10SYNCСинхронизация при каскадном соединении экранов
12, 14, 16+5VПитание экрана +5В

Адресное пространство памяти дисплея состоит из 64 адресов по 4 бита. Вся информация, отображаемая в памяти, через драйвер выводится на светодиоды. Данные в памяти поддерживают команды чтения, записи и чтение-модификация-запись. Следующий рисунок наглядно демонстрирует карту памяти светодиодного экрана.

Подробнее остановимся на командах, поддерживаемых устройством:

1) Команда записи данных – 101. Поддерживает два режима: адресный режим и режим последовательной записи. Принцип передачи команд одинаков для всех режимов работы.

Перед посылкой команды прижимаем сигнал CS к земле. Выдержав небольшую паузу, начинаем тактировать линию WR, устанавливая по фронту тактового сигнала нужный логический уровень на линии DATA. После посылки команды, пользуясь изложенными выше принципами, отправляем восьмиразрядный адрес, а затем 4 бита информации. Выдерживаем небольшую паузу, после чего устанавливаем высокий логический уровень на CS – передача завершена.

Чтобы войти в режим последовательной записи необходимо после посылки адреса, не «отпуская» CS, слать нужное количество байт.

В качестве примера рассмотрим порядок команд, необходимый для закрашивания столбика Out1 и Out3 в режиме последовательной записи:

Исходный код
101 00000010 11111111 00000000 11111111

2) Команда чтения данных – 110. Как и предыдущая команда имеет поддержку тех же режимов: адресный и последовательный.

Чтобы считать данные из памяти дисплея необходимо после отправки адреса начать тактирование линии RD. Считывание данных производится с линии DATA на каждый такт.

3) Команда чтение-модификация-запись – 101. Пояснять режим работы этой команды не буду, т.к. использовать его в своих проектах не стал. Временные диаграммы этого режима подробно представлены в документации на дисплей (см. DE-DP104_Ver1.0_Page 11).

4) Режим настройки – 100. Данный режим поддерживает 9 битные команды. Всего разработчиками предусмотрено 27 режимов. В представленном ниже списке Х – любой уровень сигнала на линии DATA:
0000 0000 X – выключение всех генераторов;
0000 0001 Х – включение системного генераторов;
0000 0010 Х – выключение светодиодов;
0000 0011 Х – включение светодиодов;
0000 1000 Х – выключение режима мигания;
0000 1001 Х – включение режима мигания;
0001 00ХХ Х – режим ведомого с внешним источником тактового сигнала;
0001 01ХХ Х – режим ведущего с внутренним источником RC тактового сигнала, выход сигнала на OSC;
0001 10XX X – внутренний источник RC тактового сигнала;
0001 11ХХ Х – внешний источник тактового сигнала;
0010 00ХХ Х – N-MOS open drain output and 8 common option;
0010 01ХХ Х – N-MOS open drain output and 16 common option;
0010 10ХХ Х – P-MOS open drain output and 8 common option;
0010 11ХХ Х – P-MOS open drain output and 16 common option;
101Х 0000 Х – 1/16 уровень яркости;

101Х 1111 Х – 16/16 уровень яркости.

Как показалось мне на первый взгляд все просто, и запустить этот дисплей сможет даже первоклашка. Не тут-то было, несколько ночей проведенных над этим дисплеем ни к чему не привели. Не светился ни один из диодов матрицы. Помог решить проблему безымянный герой из службы поддержки Sure Electronics. Свой вопрос я накатал через систему Contact seller на Ebay, намекнув на то, что фирма торгует заведомо бракованными изделиями.

Через час продавец мне ответил, написав правильную последовательность байт для инициализации дисплея. Сейчас я повторю её, вместе с командой 100, переключающую систему в режим настройки (команды разделены пробелами):

Исходный код
100 000000000 001010000 000101000 000000010 000000110 000010000 101011110
Все заработало, и вопрос был снят. После этого случая я проникся к этому магазину, став его постоянным покупателем. Жаль, что подарков к посылкам они практически не кладут.

Дисплей был выбран. Оставалось определиться с остальными комплектующими – самая простая задача. Использовались только те детали, которые лежали в столе. Выбор не оптимальный, но что есть, то есть. Ниже Вы можете ознакомиться с перечнем комплектующих, используемых в проекте, и электрической принципиальной схемой.

Перечень элементов
№ п/пНаименованиеОписаниеОбозначениеКол-воЦена за шт, рубИтого, рубПоставщик
1PIC16F88-I/PPIC 4096 x 14 - PROM/192-RAM 4-ADC 16I/O 3-Timer + 2-Comparators + Watchdog EUSART 1 x 10-Bits-PWM ICSPIC21170,38170,38ЗАО "Промэлектроника"
2M24C04-WBN6PEEPROM serial I2C 512x8 Uпит>2.5В, -40°...+85°СIC118,548,54
3LM2575T-5.0Стаб.напр.импульсный Step-Down 1 A Uвх=8...40V Uвых=5 V 4% -40...+125CIC3164,6964,69
4SH50T-0.9-330Дроссель Talema 330uH 0.9A/ 0.74 Ohms 50kHzL1149,5149,51
520000 кГц 30ppmРезонатор 20 МГц, корпус HC-49/SZ115,545,54
632.768 кГц 12pFЧасовой кварц, корпус DT26Z214,544,54
71N5819Диод Шоттки 40В/1А/VD111,621,62
8L-1334SRCКрасный светодиод, 3 ммHL112,252,25
9GR-16-330330 мкФ, 16 В, 8*12/105°C111,841,84
10GR-50-100100 мкФ, 50 В, 8*14/105°C212,262,26
11NP0 33pF 5% 50V33 пкФ, 50 В, TS170R1H330J8BNB0RC5,C620,641,28
12NP0 15pF 5% 50V15 пкФ, 50 В, TS170R1H150JSBNB0RC3,C420,641,28
13CF-0.25 15K 5%15 кОм, 0.25ВтR1,R2,R5,R640,572,28
14CF-0.25 360 5%360 Ом, 0.25ВтR310,330,33
15MF-0.25 4.7K 5%4,7 кОм, 0.25ВтR410,650,65
16IDC-16M вилкавилка на плату для подключения бегущей строки15,255,25
17SWT-14-4.3NкнопкаSB1,SB224,128,24
180832 LED LED Dot Matrix Red Display Information Board1350350Sure Electronics

Программное обеспечение

Для ускорения процесса разработки применялся mikroPascal for Microchip PIC microcontrollers v8.0.0.1 фирмы mikroElektronika (http://www.mikroe.com). Лицензия для этого программного продукта была приобретена довольно давно, но до сих пор эта версия не потеряла актуальности. Не обновляю микропаскаль исключительно по причине плохой совместимости файлов проекта с mikroPascal PRO for PIC v5.4. Разработка проектов в этой среде приносит радость. Множество библиотек, входящих в комплект, позволяют за несколько минут написать сложную программу и подготовить готовую прошивку для микроконтроллера. Рекомендую!

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

Исходный код
//Процедура инициализации связи с "бегущей строкой"
Procedure InitStr;
begin
Portb.2:=0; //Прижимаем CS к земле
Delay_1us; //Пауза 1 мкс
end;

//Процедура завершения связи с "бегущей строкой"
Procedure DestroyStr;
begin
Delay_1us; //Пауза 1 мкс
Portb.2:=1; //Отпускаем CS
Delay_1us; //Пауза 1 мкс
end;

//Процедура, посылающая команды бегущей строке
procedure SendCommand (cmd: word;len: byte); //cmd - команда (до 16 бит), len - число байт, которое необходимо послать
var
i: integer;
begin
for i:=len-1 downto 0 do
begin
Delay_1us;
PORTB.1:=0; //Опускаем WR
PORTB.0:=cmd.i; //Шлём данные в DATA
Delay_1us; //Пауза 1 мкс
PORTB.1:=1; //Поднимаем WR
end;
end;

Алгоритм работы очень прост. Когда мы хотим что-то передать дисплею, то вызываем процедуру InitStr, затем посылаем байты с помощью SendCommand, и чтобы завершить цикл вызываем DestroyStr. Следующий пример проиллюстрирует процедуру инициализации дисплея. Предполагается, что порты микроконтроллера предварительно настроены в соответствии с принципиальной электрической схемой, опубликованной выше.

Исходный код
InitStr;
SendCommand(%100,3);
SendCommand(%000000000,9);
SendCommand(%001010000,9);
SendCommand(%000101000,9);
SendCommand(%000000010,9);
SendCommand(%000000110,9);
SendCommand(%000010000,9);
SendCommand(%101011110,9); //устанавливаем максимальную яркость строки
DestroyStr;

К сожалению, выбранный мной экран не содержит встроенных шрифтов, поэтому пришлось тратить встроенную в контроллер память EEPROM на размещение информации о символах. Для этого был разработан русскоязычный шрифт, каждая буква которого представлена в цифровом виде. За распределение букв в памяти отвечает специальная процедура GetLetter(ch: byte). В качестве аргумента ей передается символ в кодировке ASCII. В результате работы процедуры будут заполнены две переменные: StAddr – адрес, начиная с которого размещена буква с кодом ASCII, Len – объем памяти в байтах, выделенный для размещения данного символа. Карта памяти или то, на что ушло 250 байт EEPROM отображено на следующем рисунке.

Например, результатом выполнения GetLetter(195) будет StAddr:=15, Len:=5 (адрес в памяти EEPROM буквы «Г»).

Для отображения экрана используется специальный видеобуфер размером 32 байта (stroka: array[0..31] of byte) на котором предварительно формируется последовательность, выводимая на светодиодный экран, не имеющий аппаратного сдвига влево. За сдвиг отвечает процедура со звучным названием Sdvig, принимающая в качестве аргумента число линий, на которое нужно подвинуть текст. Свободные столбцы при этом очищаются.

Исходный код
//Процедура, сдвигающая буфер на определённое количество байтов
procedure Sdvig(cnt: byte);
begin
for i:=0 to cnt do
begin
for x:=1 to 31 do stroka[x-1]:=stroka[x];
stroka[31]:=0;
InitStr;
SendCommand(%101,3);
SendCommand(0,7);
for x:=0 to 31 do
begin
SendCommand(stroka[x],8);
end;
DestroyStr;
Delay_ms(30);
end;
end;

Аналогично выполнена процедура сдвига строки с текстом, только при этом освободившейся байт циклически заполняется новой информацией. Фразы для создания бегущей строки записаны во внешнюю EEPROM типа 24C04.

Настройка прибора

Для настройки прибора необходимо кратковременно нажать на кнопку SB1 «Выбор режима». Если прибор находится в режиме №2, то система перейдёт в режим настройки мгновенно. В режиме №1 система перейдёт в режим настройки только после того, как кончиться текст «бегущей» строки.

Первый параметр, который предполагается настроить – часы.

Кратковременное нажатие на кнопку SB2 «Увеличение» увеличивает счетчик часов на единицу. В случае достижения счетчиком значения 24 – он автоматически обнуляется. Для установки минут, необходимо повторно нажать на кнопку SB1.

Как и в предыдущем случае, кратковременное нажатие на кнопку SB2 увеличит счётчик минут на единицу. В случае достижения счетчиком значения 60 – он автоматически обнуляется. Для выбора яркости, повторно нажимаем на кнопку SB1.

Для увеличения яркости кратковременно нажимаем на кнопку SB2. Наименьшему уровню яркости соответствует 2 левых светящихся ряда светодиодов, наибольшему – 32 ряда светящихся светодиодов (т.е. полное заполнение экрана). Чтобы установить режим работы, повторно нажимаем на кнопку SB1.

Выбор режима осуществляется кратковременным нажатием кнопки SB2. Повторное нажатие на кнопку SB1, выводит прибор в рабочий режим, при этом отсчёт времени начнётся только в этот момент. Посмотреть, как работают часы можно на следующем видео.

В заключении хочется сказать, что весь материал предназначен лишь для ознакомления. Использование наработок в коммерческих целях строго запрещено. Перепечатка материалов возможна только с моего разрешения и с соблюдением ссылок на первоисточник. Желающих поддержать не только словом, но и делом, а также поблагодарить – прошу ко мне на почту (цветы и конфеты не пью).

Для самостоятельной сборки устройства Вам необходимо скачать следующие файлы:
1. Прошивка для EEPROM 24c04
2. Прошивка микроконтроллера PIC16F88 для светодиодной матрицы с драйвером HT1632
3. Прошивка микроконтроллера PIC16F88 для светодиодной матрицы с драйвером HT1632C
4. Программа для прошивки контроллера и EEPROM WinPic (поддерживает JDM программаторы)
5. Документация на светодиодную матрицу

Удачи в Ваших начинаниях!!!