LCD (ЖКИ). Часть 5. Программирование.
В предыдущей статье я рассказал о командах
управления изображением и алгоритмы передачи в модуль команд и данных. Теперь
попробуем посылать данные в модуль через LPT порт средствами языка Turbo C и gcc
(в Linux системах).
Думаю, не лишним будет напомнить, что у порта LPT есть 25 выводов. 1 - стробирование,
8 - шина данных (выводы 2-9), управляющие входы (выводы 10-13), управляющие выходы
(выводы 14-17) и земля (выводы 18-25). Мы будем использовать шину данных и выводы
управления. Шина данных находится по адресу 378H (замечание: здесь и далее адреса для
стандартного первого порта LPT), а выводы управления по адресу 37AH.
Как управлять шиной данных я долго рассказывать не буду (кому нужно, идём
сюда и учимся.
Из выводов управления я использовал 16-й (для E) и 17-й (для RS). Если вы решили использовать 1-й
и 14-й выводы, то вам нужно будет изменять программу (чуть-чуть так :) ) только
изменить данные, посылаемые в порт 37AH.
Первым делом напишем функцию для управления ножкой 17 для выбора регистра.
rs (int sw)
{
if (sw==1) outportb (0x37A,0);
else outportb(0x37A,10);
return;
}
|
Эта функция управляет выводом 17. Если мы обращаемся в функции с переменной 1 ( rs (1); ),
то в порт 37AH идёт число 0 и на выводе появляется "1". То есть мы посылаем данные.
Если обращаемся строкой rs (0);, то мы посылаем команду.
Аналогично и с выводом 16 для стробирования.
e (int sw)
{
if (sw==1) outportb (0x37A,255);
else outportb(0x37A,5);
return;
}
|
Тут нужно быть осторожным. Если мы посылаем данные, то rs должен остаться в положении
"1". То есть E не должно повлиять на RS. Когда мы обращаемся к функции через строку
e (1); то только E будет иметь уравень "1", а RS останется в "0", а когда через строку
e (0); то E и RS будут "1", то есть мы посылаем данные.
***Замечание: все данные, посылаемые в порт подобраны методом научного тыка. Не
повторяйте возможной ошибки автора, прочтите соответсвующую документацию.
Далее нам нужна универсальная функция, чтобы отсылать на LCD команды или данные.
lcd (int sid, int dat)
{
if (sid==0) rs (0);
else rs(1);
outportb(0x378,dat);
if (sid==0) e (1);
else e (0);
delay (150);
outportb(0x37A,10);
outportb(0x378,255);
return;
}
|
Итак, функция отправляет число dat в LCD. sid обозначает, что это за число ("0" -
команда, "1" - данные). Функция delay () обозначает паузу. Для быстрых процессоров
нужно ставить паузу побольше, так как контроллер модуля работает на частоте во много раз
ниже, чем наши компьютеры. Найдите оптимальное значение сами. У меня минимальная пауза
получалась при delay (40) на процессоре Pentium 166 MHz. На P-3 600 MHz уже delay (350).
Теперь приступим к самой программе. То есть к функции main (). Попробуем инициализировать
модуль, поставить режим двух строк, поставить курсор в виде _ и напечатать на экране цифры
1, 2, 3, 4, 5. Так выглядит вся программа (все описанные выше функции объединены
в одну):
#include <dos.h>
#include <conio.h>
main ()
{
lcd (0,0x30);
lcd (0,0x38);
lcd (0,0xD);
lcd (1,0x31);
lcd (1,0x32);
lcd (1,0x33);
lcd (1,0x34);
lcd (1,0x35);
}
lcd (int sid, int dat)
{
if (sid==0) outportb(0x37A,10);
else outportb (0x37A,0);
outportb(0x378,dat);
if (sid==0) outportb (0x37A,255);
else e outportb(0x37A,5);
delay (150);
outportb(0x37A,10);
outportb(0x378,255);
return;
}
|
В итоге на дисплее должно появиться 12345. То есть мы послали 3 команды и 5 чисел.
Если не появилось или при компиляции получились ошибки, то исправьте ошибки.
Можно скачать готовый примерчик (lcd3.exe) и исходник на Turbo C
отсюда. (3 Kb).
Тем, у кого всё получилось, мои поздравления :). Теперь можете эксперементировать
с командами и числами и написать на экранчике всё что угодно. (только матом не пишите ;)))
В следующей (и, надеюсь, заключительной) части я покажу ещё несколько инетересных
и полезных функций и выложу свои программки для ДОС и Linux.
Продолжение.
К списку статей
ilus