В предыдущей заметке была рассмотрена схема организации обмена данными с контроллером через регистр сдвига. Теперь посмотрим, как можно использовать эту схему для управления дисплеем на основе контроллера T6963C. На рис 1. приведена схема из предыдущего материала.
Обозначения контактов разъема XS2 соответствуют дисплею 24064-04. Однако кроме указанных на схеме сигналов дисплей требует организовать как минимум 2 дополнительных параметра: сигнал сброса и отрицательное питание —5...—15 вольт для ЖК матрицы.
Для выработки отрицательного напряжения проще всего использовать микросхему MAX637. Надо, правда, отметить, что сейчас цена этой микросхемы по непонятным причинам доходит до 1500 руб., поэтому, если нет возможности снять ее с какой-нибудь старой ненужной платы, то лучше решить вопрос другим способом (например, намотать на трансформатор питания дополнительную обмотку и использовать регулируемый стабилизатор).
Однако используем имеющуюся под руками MAX637. Поскольку для изменения контрастности дисплея желательно иметь возможность регулировки напряжения, то используем из справочника по этой микросхеме именно схему с регулировкой, которая приведена на рис. 2.
Для расчета выходного напряжения в справочнике предлагается следующая формула:
Vout = —1,31× | R2 |
R1 |
Резистор R1 должен, по данным справочника, иметь сопротивление в пределах 10 кОм ... 10 МОм. Выбрав его сопротивление равным, скажем, 13 кОм получим граничные значения сопротивления R2 = 149 кОм для напряжения —15 вольт и R2 = 50 кОм для —5 вольт. Для регулировки предусмотрим дополнительный разъем, чтобы менять напряжение можно было любым способом (переменный резистор, переключатель или электронный ключ). Окончательная схема источника отрицательного напряжения приведена на рис. 3.
Сопротивление резистора R3 = 68 кОм выбрано из расчета, что при замыкании контактов разъема XS3 выходное напряжение преобразователя будет —5 вольт.
Последнее, что нужно подключить к дисплею — это цепь сброса при подаче напряжения питания. Параметры цепочки в инструкции на контроллер предлагаются следующие: R = 10 кОм и С = 0,1 мкФ. Полная схема управления дисплеем с добавлением источников питания и цепи сброса приведена на рис. 4.
Несколько замечаний по замене элементной базы. Вместо микросхем 74С00 можно применить отечественную ЛА3 любой серии (лучше, конечно, 555 или 1533), а также импорт 7400 с любым буквенным индексом (лучше всего HC). 74С32 можно заменить на отечественную ЛЛ1. 1533ИР24 можно заменить на импортную 74299 с любым индексом. Размещение элементов на плате показано на рис. 5.
На рис. 6 показан вид на стабилизатор DA1, а на рис. 7 — вид на монтаж схемы.
В процессе настройки программы выяснилось, что оставлять свободным вход дисплея для управления размером шрифта не рекомендуется, т.к. случайное касание этого вывода рукой приводит к произвольному (пусть и временному) переключению режима шрифта. Поэтому на схеме рис. 3 этот вход подвешен к +5 вольт через резистор R1.
После того, как схема собрана, можно приступить к программированию дисплея.
Функции, необходимые для обмена контроллера с регистром приведены в описании подключения регистра. Напомню здесь их прототипы и назначение передаваемых переменных:
BYTE ShiftByte(BYTE b); // прием/выдача байта из/в контроллера в сдвиговый регистр
void ReadByte(char addr); // чтение байта из внешнего устр. в регистр.
void WriteByte(char addr); // запись байта во внешнее устр. из регистр.
Функция ShiftByte отправляет в регистр передаваемый байт b, одновременно возвращая ранее находившийся в регистре байт в контроллер. Функции ReadByte и WriteByte производят только обмен байтом данных с регистром внешнего устройства, адрес которого указан параметром addr. Для удобства напишем несколько дополнительных функций для работы с дисплеем, предварительно вооружившись инструкцией по его программированию. Перед каждой записью в дисплей команды или байта данных, необходимо проверять байт статуса, который считывается при обращении к регистру команд дисплея. Биты 0 и 1 должны быть установлены в 1, что говорит о готовности дисплея принять команду или данные.
Обычно на проверке состояния этих бит программу "зацикливают" до появления требуемой комбинации бит. Однако, это (при неисправности оборудования) приводит к зависанию программы, поэтому я решил поставить цикл пока со счетчиком на 100 попыток (предварительные испытания показали достаточность такого интервала, однако его безболезненно можно и увеличить). Таким образом мы избегнем зависания программы при неполадках в контроллере. Текст функций для передачи в дисплей данных (WriteData) и команд (WriteCommand) приведены на рис. 8.
#define DATA_PORT 0
#define CMD_PORT 1
...
void
WriteData(BYTE data)
{
int i;
for(i=0; i<100; i++) { // проверка готовности дисплея
ReadByte(CMD_PORT);
if((ShiftByte(data) & 0x3) == 0x3) break; }
WriteByte(DATA_PORT); // запись байта в регистр данных дисплея
}
// ------------------------------------------------
void
WriteCommand(BYTE command)
{
int i;
for(i=0; i<100; i++) { // проверка готовности дисплея
ReadByte(CMD_PORT);
if((ShiftByte(command) & 0x3) == 0x3) break; }
WriteByte(CMD_PORT); // запись байта в регистр команд дисплея
}