Отправляет email-рассылки с помощью сервиса Sendsay

Статьи по электронике

  Все выпуски  

Статьи по электронике


Информационный Канал Subscribe.Ru


Статьи по электронике


Автор рассылки: Вячеслав Кулаков
Сайт рассылки

Управление контроллером графического ЖКИ индикатора T6963C на примере индикатора PG24064-E/F.


      В данной статье рассмотрены основные команды контроллера T6963C и показаны примеры их применения, написанные на языке C. Примеры были опробованы на микроконтроллере (далее МК) Fujitsu MB90598G, однако вследствие универсальности C они должны подойти для любого микроконтроллера. Статья не является переводом оригинальной документации на T6963C, здесь рассмотрены лишь основные моменты его программирования. Документацию на T6963C можно скачать здесь.
      Графический ЖКИ индикатор состоит из трех основных логических узлов: LCD панели, LCD контроллера и ОЗУ. Для контроллера T6963C максимальный размер LCD панели может составлять 240х128 точек, максимальный объем ОЗУ 64 кБ. У индикатора PG24064-E/F размер панели равен 240х64 точек, емкость ОЗУ 8 кБ. В ОЗУ хранится информация, которая считывается контроллером и выводится на LCD панель в соответствии с заданным режимом индикации. Поэтому задача программиста сводится к правильному заполнению ОЗУ и заданию режимов работы контроллера.
      Управление контроллером осуществляется по следующим линиям:
  1. Двунаправленная шина данных D0... D7;
  2. Линии разрешения чтения, разрешения записи, выбора кристалла и выбора типа пересылаемых данных (команда или данные);
  3. Линия выбора размера шрифта (6х8 или 8х8 точек);
  4. RESET.

      На С определения этих линий для приводящихся ниже примеров выглядят так (для применения в какой-либо конкретной схеме или для другого микроконтроллера их необходимо изменить):

#define WR PDR6_P67//линия разрешения записи
#define RD PDR6_P66//линия разрешения чтения
#define CE PDR6_P65//Выбор кристалла
#define CD PDR6_P64//выбора типа пересылаемых данных
#define RESET PDR5_P57//сброс
#define FS PDR5_P56//выбора размера шрифта
#define LCD_PORT PDR2//Шина данных
#define LCD_PORT_DIR DDR2//Байт направления шины данных

      Существуют четыре типа обмена данными между МК и T6963C: запись данных, чтение данных, запись команды и чтение байта состояния контроллера. Перед любой записью или чтением необходимо считать байт состояния и произвести проверку его битов для того, что бы убедиться в готовности контроллера к дальнейшей работе. Даже в том случае, если в последнее время к контроллеру обращения не производилось, байт состояния обязательно должен быть считан, т.е. простого введения задержки между двумя командами недостаточно. Для получения байта состояния небоходимо на линиях CD и WR выставить единицы, а на CE и RD нуль. Примерно через 200нс на шине данных будет байт состояния. На С эта функция выглядит так:

unsigned char GetStatusLCD(void)
{
unsigned char i;

LCD_PORT_DIR=0;//Переключение направления шины на вход

CD=1;
WR=1;
CE=0;
RD=0;

for (i=0;i<2;i++);//Задержка

i=LCD_PORT;//Чтение байта состояния

WR=1;
RD=1;
CE=1;
CD=1;

LCD_PORT_DIR=0xff;//Переключение направления шины на выход

return i;//Возврат байта состояния
}

      Ниже приводится байт состояния побитно:

D7 D6 D5 D4 D3 D2 D1 D0
STA7 STA6 STA5 X STA3 STA2 STA1 STA0

  1. STA0 - 0=команда в процессе обработки, 1=контроллер готов получить новую команду или данные;
  2. STA1 - 0=производится внутреннее чтение запись (контроллер занят), 1=контроллер готов получить новую команду или данные;
  3. STA2 - 0=производится чтение в режиме "Auto Read", 1=контроллер свободен для режима "Auto Read";
  4. STA3 - 0=производится запись в режиме "Auto Write", 1=контроллер свободен для режима "Auto Write";
  5. X - не используется
  6. STA5 - 0=контроллер не работает, 1=контроллер работает нормально.
  7. STA6 - 0=указатель адреса находится в области памяти, выделенной для графики, 1=указатель находится за пределами этой области
  8. STA7 - 0=LCD панель выкл.,1=LCD панель вкл.
      Таким образом, перед записью/чтением необходимо проверить биты STA0 и STA1 на равенство единице. Так же иногда используются биты STA2 и STA3, которые проверяются перед выполнением автоматического чтения/записи (об этом режиме ниже). Использовать остальные биты автору данной статьи не приходилось. Пример проверки битов STA0 и STA1:

while ((GetStatusLCD()&0x03)!=0x03);//Ждем равенства STA0 и STA1 единице

      Как уже упоминалось выше, обмен данными с T6963C производится либо с помощью команд, которые передаются из МК в T6963C и исполняются непосредственно самим контроллером либо данными, которые записываются в ОЗУ или читаются из него и представляют информацию, выводимую на панель LCD. Для передачи в контроллер команды необходимо на шину выставить саму команду, на линию СD единицу, на WR нуль, а на CE подать нулевой импульс длительностью более 100нс. Запись данных производится аналогично, только на линию CD должен быть подан нуль. Для чтения данных на CD, RD, CE выставляется нуль,после 200нс читается байт с шины данных, затем а CE выставляется единица. Ниже приводится функция записи команды или данных. Если переменная cmd=0, то записываются данные, в противном случае - команда. В переменной bt находится записываемый байт:

void Send8LCD(unsigned char cmd, unsigned char bt)
{
char i;

if (cmd)
CD=1;
else
CD=0;

for (i=0;i<2;i++);//задержка

CE=0;
WR=0;
LCD_PORT=bt;

for (i=0;i<2;i++);//задержка

CE=1;
WR=1;
CD=1;
}

      Функция чтения данных будет выглядеть аналогично и вследствие своей простоты здесь не приводится. Желающие легко смогут написать ее самостоятельно.
      Команды, передаваемые в контроллер могут состоять как собственно только из самой команды, так и содержать до двух байт данных. Полное описание команд смотрите в документации производителя. Если команда содержит данные, то они передаются перед ней, младшим байтом вперед.
      Пример передачи одиночной команды:

while ((GetStatusLCD()&0x03)!=0x03); //Проверка битов состояния STA0 и STA1
Send8LCD(1,0x97); //Передача команды включения дисплея

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

while ((GetStatusLCD()&0x03)!=0x03); //Проверка битов состояния STA0 и STA1
Send8LCD(0,0x01); //Передача младшего байта
while ((GetStatusLCD()&0x03)!=0x03); //Проверка битов состояния STA0 и STA1
Send8LCD(0,0x02); //Передача старшего байта
while ((GetStatusLCD()&0x03)!=0x03); //Проверка битов состояния STA0 и STA1
Send8LCD(1,0x24); //Команда

      Далее можно перейти непосредственно к программированию контроллера. Перед его инициализацией желательно произвести сброс, выставив на линию RESET нуль:

RESET=0;
for (i=0;i<50;i++);//Задержка
RESET=1;

      Затем необходимо выбрать один из режимов индикации графики и текста. Текст с графикой могут быть объеденены для воспроизведения на LCD панели в одном из трех логических вариантов: "OR", "EXOR" и "AND". К тому же текст может отображаться с использованием встроенного знакогенератора (128 знаков плюс 128 знаков, загружаемых пользователем), либо при помощи только пользовательских шрифтов. Так же имеется режим текстовых аттрибутов, при котором графика отключена, а каждому знаку текста можно задать специальный режим отображения. Зададим режим "OR" со встроенным знакогенератором:

while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0x80);

      Теперь необходимо разбить ОЗУ на две части для хранения текстовой и графической информации. Это разбиение осуществляется указанием начального адреса каждой из частей (в документации к контроллеру эти значения называются "Text home" и "Graphic home"). Помимо указания начального адреса для каждой части необходимо задать число байт, соответствующих одной строке показываемой информации (эти значения называются "Text area" и "Graphic area"). Например на дисплее длиной 240 точек в одной строке при ширине знака 6 точек поместится 40 знаков. Каждый знак соответствует одному байту и, следовательно необходимо задать 40 байт для текста. Для графики это число так же равно 40, т.к. вследствие того, что ширина текста равна 6 точкам, одним байтом можно вывести на индикацию так же шесть точек (старшие два бита не участвуют). Вывод графической информации производится горизонтально и поэтому на вывод одной линии потребуется так же 40 байт. Если Это значение указать больше, то информация после сорокового байта будет выводиться за пределы экрана. Если меньше, то наоборот на экран выведется большее число символов, чем было задано. Определим начальный адрес графической области как 0х0000, текстовой как 0х1700 и отправим все эти значения в контроллер:

while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,00);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,00);
while ((GetStatusLCD()&0x03)!=0x03);//GRPHIC HOME
Send8LCD(1,0x42);

while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x28);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);
while ((GetStatusLCD()&0x03)!=0x03);//GRPHIC AREA
Send8LCD(1,0x43);

while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x17);
while ((GetStatusLCD()&0x03)!=0x03);//TEXT HOME
Send8LCD(1,0x40);

while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x28);
while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(0,0x00);
while ((GetStatusLCD()&0x03)!=0x03);//TEXT AREA
Send8LCD(1,0x41);

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

while ((GetStatusLCD()&0x03)!=0x03);
Send8LCD(1,0x9c);

По исполнению этой команды дисплей начнет отображать содержимое ОЗУ, в котором на данный момент находятся случайные значения, т.к. произведенный перед инициализацией сброс на ОЗУ не действует. Для того, что бы что-нибудь показать, необходимо заполнить ОЗУ. О том как это сделать и о других возможностях контроллера T6963C будет рассказано по появлении свободного времени у автора.


Начало

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное