При закрытии подписчики были переданы в рассылку "Ваш интернет-бизнес" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Информационный Канал Subscribe.Ru |
На С определения этих линий для приводящихся ниже примеров выглядят так (для применения в какой-либо конкретной схеме или для другого микроконтроллера их необходимо изменить):
#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 |
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 |
Отписаться
Убрать рекламу |
В избранное | ||