Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КП МПС Варианты.doc
Скачиваний:
78
Добавлен:
12.04.2015
Размер:
1.44 Mб
Скачать
      1. Сопряжение с жки-модулем

Наиболее распространенными являются ЖКИ-модули на базе контроллера HD44780. Модуль может принимать команды, управляющие режимами его работы, а также принимать коды выводимых на экран символов в стандартной кодировке ASCII. В свою очередь, ЖКИ может выдавать информацию о своем состоянии и данные из своих внутренних блоков памяти по запросу от управляющего устройства.

Рис. 5.13. Запись данных в ЖКИ

Назначение выводов ЖКИ-модуля:

VDD– питание +5B;VSS– земля (0B);

V0– напряжение смещения, управляющее контрастностью;

RS – вход, высокий уровень - данные; низкий –команды;

R/W – вход, высокий - чтение, низкий –запись;

E – вход, строб, сопровождающий сигналы на шине "команды/данные";

DB0DB7 - шина "команды/данные".

На рис.5.13 изображены временные диаграммы сигналов RS, R/W, E при записи команд/данных в контроллер ЖКИ.

При помощи сигнала на линии RS микропроцессор сообщает контроллеру индикатора о том, что именно передается по шине: команда или данные. Сигнал на линии Е является стробом, сопровождающим сигналы на шине "команды/данные". Запись информации в ЖКИ происходит по спаду этого сигнала. Потенциал на управляющем выводе R/W задает направление передачи данных: запись в RAM индикатора (R/W=0) или считывание оттуда (R/W=1).

Контроллеру ЖКИ после приема байта команды или байта данных требуется некоторое время для обработки полученной информации, в течение которого управляющее устройство не должно выполнять новых передач. Для того чтобы определить, когда контроллер ЖКИ закончит свои внутренние операции, управляющее устройство может опрашивать флаг индикатора – BUSY (команда "чтение busy-флага"), который сбросится только тогда, когда контроллер ЖКИ освободится. Второй, более простой способ заключается в том, что управляющее устройство, зная, сколько времени требуется ЖКИ на обработку той или иной команды, просто выполняет временную задержку после каждой передачи информации. Если во время цикла записи управляющее устройство передает в контроллер индикатора код команды, то этот код записывается в регистр команд контроллера ЖКИ, и команда сразу же начинает выполняться. Если управляющее устройство передает в контроллер ЖКИ данные, которые представляют собой ASCII-коды отображаемых символов, то они записываются в буфер данных (DDRAM), который обычно содержит 80 ячеек. Для однострочного индикатора адреса ячеек от 0 до 3Fh, для двухстрочного – от 0 до 27h(40 ячеек первой строки) и от 40hдо 67h(40 ячеек второй строки) (рис.5.14). При записи или считывании буфера данных обращение осуществляется к ячейке, на которую в данный момент указывает курсор.

Система команд ЖКИ-модуля:

К1 - очистить дисплей и установить курсор в нулевую позицию (адрес 0);

К2 - установить курсор в нулевую позицию (адрес 0). Установить окно дисплея относительно буфера DDRAM в начальную позицию. Содержимое DDRAM при этом не меняется;

К3 - установить направление сдвига курсора вправо (I/D=1) или влево (I/D=0) при записи/чтении очередного кода в DDRAM. Разрешить (S=1) сдвиг окна дисплея (сдвиг вместе со сдвигом курсора;

К4 – включить (D=1) или выключить (D=0) дисплей. Зажечь (C=1) или погасить (C=0) курсор. Изображение курсора сделать мигающим (B=1);

К5 - переместить курсор (S/C=0) или сдвинуть окно дисплея (S/C=1) вправо (R/L=1) или влево(R/L=0);

К6 - Установить разрядность шины данных 4 бита (DL=0) или 8 бит (DL=1), количество строк дисплея - одна (N=0) или две (N=1), шрифт - 5х7 точек (F=0) или 5х10 точек (F=1);

К7 - установка адреса CGRAM. После этой команды данные будут записываться/считываться в/из CGRAM;

К8 - установка адреса DDRAM. После этой команды данные будут записываться/считываться в/из DDRAM;

К9 - чтение состояния busy-флага (BF) и счетчика адреса;

К10 - запись данных в DDRAM или CGRAM;

К11 - чтение данных из DDRAM или CGRAM.

Рис. 5.14. Отображение на дисплее символов, ASCII-коды которых записаны в DDRAM:

а - однострочный ЖКИ (80 ячеек в кольцевом буфере, адреса ячеек с 0 по 3Fh),

б - двухстрочный ЖКИ (два кольцевых буфера по 40 ячеек, адреса соотвественно с 0 по 27h и с 40h по 67h)

В табл.5.1 приведено состояние сигналов, подаваемых на индикатор для задания соответствующей команды.

Таблица 5.1

Код

Описание команды

RS

R/W

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

0

0

0

0

0

0

0

0

0

1

К1

0

0

0

0

0

0

0

0

1

*

К2

0

0

0

0

0

0

0

1

I/D

S

К3

0

0

0

0

0

0

1

D

C

B

К4

0

0

0

0

0

1

S/C

R/L

*

*

К5

0

0

0

0

1

DL

N

F

*

*

К6

0

0

0

1

ACG

К7

0

0

1

ADD

К8

0

1

BF

AC

К9

1

0

Данные

.К10

1

1

Данные

К11

Примечание.

DDRAM- Display data RAM - ОЗУ ASCII-кодов, отображаемых символов;

CGRAM-Сharacter generator RAM - ОЗУ знакогенератора;

* - безразлично.

Буфер данных имеет больше ячеек, чем число знакомест дисплея. Смещая окно индикатора относительно буфера данных (см. систему команд), можно отображать на дисплее различные области буфера. У двухстрочных индикаторов первые 40 ячеек буфера данных обычно отображаются на верхней строке дисплея, а вторые 40 ячеек - на нижней строке. Сдвиг окна дисплея относительно буфера данных для верхней и нижней строк происходит синхронно. Курсор будет виден на индикаторе только в том случае, если он попал в зону видимости дисплея (и если предварительно была подана команда на отображение курсора). Кроме DDRAM, контроллер ЖКИ содержит еще один блок памяти - знакогенератор. Его "прошивка", то есть соответствие ASCII-кодов начертанию символов, обычно имеется в описании индикатора. Знакогенератор состоит из двух частей. Основная его часть представляет собой ПЗУ (CGROM) и ее, следовательно, нельзя изменить. Вторая часть, в которой задаются начертания символов для первых 16-ти кодов таблицы знакогенератора, представляет собой перепрограммируемое ОЗУ (CGRAM). Имеется возможность задать начертание 8 символов.

Рассмотрим сопряжение ЖКИ-модуля, построенного на базе контроллера HD44780, с микроконтроллером MCS-51.

ЖКИ-модуль может быть подключен как блок внешней памяти данных, при этом обращение к нему будет осуществляться командами чтения-записи данных во внешнюю память, а сигналы управления модулем должны формироваться из сигналов WR/ (черта означает инверсию) и RD/ микроконтроллера.

Другой вариант подключения модуля – управление им через порты ввода/вывода микроконтроллера. В этом случае схемотехника подключения упрощается, зато программа управления модулем становиться более сложной (надо формировать все сигналы программно).

На рис.5.15 приведен вариант подключения модуля в качестве внешней памяти данных через 16-контактный разъем ХР1. Напряжение смещения, управляющее контрастностью дисплея, регулируется резистором R1 через вывод 4 разъема. Стробирующий сигнал Е формируется из сигналов RW/ и RD/ микроконтроллера. Так как сигнал Е является инверсным по отношению к сигналам RW/ и RD/, то для его формирования использован инвертор.

Сигнал Е вырабатывается всякий раз при обращении к внешней памяти данных, при этом управляющий сигнал RS (команда/данные) соответствует разряду адреса А8 внешней памяти (снимается с порта Р20 MCS-51), а сигнал R/W (на схеме обозначен R_W) – разряду адреса А9 (снимается с порта Р21).

Таким образом, запись команды в ЖКИ-модуль будет осуществляться каждый раз при записи микроконтроллером данных во внешнюю память по адресу 0000h, запись данных в ЖКИ – при записи по адресу 0100h, чтение регистра состояния ЖКИ – при чтении данных по адресу 0200h, чтение регистра данных модуля – при чтении данных микроконтроллером по адресу 0300h. Шина "команды/данные"DB0DB7 формируется шиной данных микроконтроллера D0…D7 (порт Р0).

Рассмотрим только процедуры работы с индикатором без привязки к структуре задач/состояний.

Список процедур обслуживания индикатора может быть следующим:

инициализация индикатора;

посылка команды управления индикатору;

Рис.5.15. Включение ЖКИ как блока внешней памяти

вывод символа на индикатор;

вывод строки символов на индикатор.

Процедура инициализации определяет последовательность включения индикатора в соответствии с ТУ на него, а также режим работы индикатора: количество строк, вид маркера и т.д.

Процедура посылки команды управления индикатору позволяет изменять режим его работы, коды команд приведены в таб.5.1.

Процедуры вывода символа и строки символов на индикатор отображают на нем соответствующую информацию. Символы пересылаются индикатору в соответствии с требуемой кодировкой.

Ниже приведены следующие процедуры обслуживания индикатора:

DISPInit() – инициализация в соответствии с ТУ на индикатор и задание его характеристик.

WriteData(Dat) – вывод символа на дисплей, Dat – символ в альтернативной кодировке ASCII.

WriteComm(Cmd) – посылка команды индикатору, Cmd – код команды в соответствии с таб.5.1.

В данном модуле не приведены процедура задержки Write(int N) и процедура вывода строки символов. Процедура задержки может быть реализована, например, при помощи цикла. Параметр цикла N будет определять величину задержки. Минимальная задержка в приведенном примере равна 100мкс. Вывод строки можно осуществить путем циклического вызова процедуры WriteData(Dat).

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

/*** Модуль обслуживания индикатора 2х16 (две строки по 16 символов) DATA IMAGE в области внешней памяти ***/

#include <io51.h>

#define DispBASE 0x010000 /* 1 - указание компилятору на расположение

индикатора во внешней памяти данных,

DispBASE его базовый адрес =0000 */

#define ReadStateAddr (*(char *) (DispBASE+0x800)) /*адрес регистра состояния=0200h*/

#define WriteCommAddr (*(char *) (DispBASE+0x000)) /* адрес регистра команд =0000h*/

#define ReadDataAddr (*(char *) (DispBASE+0xC00)) /* адрес регистра данных по

чтению =0300h*/

#define WriteDataAddr (*(char *) (DispBASE+0x400)) /* адрес регистра данных по

записи =0100h*/

char DispPos; /* переменная - текущая позиция маркера*/

/* Ожидание готовности дисплея */

void WaitReady(void)

{

while (ReadStateAddr & 0x80); /* Ожидать сброса бита занятости */

}

/* Запись команды в дисплей */

void WriteComm(char Cmd)

{

WaitReady();

WriteCommAddr = Cmd; /* Запись команды */

}

/* Запись данных */

void WriteData(char Dat) /* Dat - выводимый символ в коде ASCII */

{

if (Dat>0x7F) /* Вторая половина ASCII таблицы ? */

Dat = Table[Dat & 0x7F]; /* Перекодировать через таблицу */

WaitReady(); /* Ожидать готовности */

WriteDataAddr = Dat; /* Вывести символ на экран */

DispPos++; DispPos &= 0x1F; /* Коррекция положения курсора –

диапазон его значений 0…31, т.е. переход из 31 позиции в 0

0…15 – первая строка, 16…31 – вторая строка */

WriteComm(((DispPos & 0x10)<<2)|0x80); /* Команда перевода курсора в другую

строку, если его позиция 16 */

}

/* инициализация дисплея */

void DISPInit(void)

{

Write(160); /* Ожидание более 16мс – в соответствии с ТУ на индик.*/

WriteCommAddr = 0x30; /* Сброс в соответст. с ТУ на индикатор */

Write(40); /* Ожидание более 4мс – в соответст. с ТУ на индикатор*/

WriteCommAddr = 0x30; /* Сброс в соответствии с ТУ на индикатор */

Write(1); /* Ожидание более 100мкс – в соответст. с ТУ на индик.*/

WriteCommAddr = 0x30; /* Сброс в соответствии с ТУ на индикатор */

WriteComm(0x38); /*Инициализация на 2 строки и 8 бит данных*/

WriteComm(0x08); /* Спрятать курсор */

WriteComm(0x01); /* Очистить дисплей */

WriteComm(0x06); /*Инкремент положения курсора, без сдвига*/

WriteComm(0x0C); /* Включить дисплей */

WriteComm(0x01); /* Очистить дисплей */

}

/*Таблица перекодировки выводимых символов из второй половины таблицы (код>0x7F) ASCII в кодировку дисплея, позволяет выводить русские символы*/

code const char Table[128] =

(0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4, /* код 80h, для букв А, Б, В, …,Ж*/

0xA5,0xA6,0x4B,0xA7,0x4D,0x48,0x4F,0xA8,

0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB, /* 90 */

0xAC,0xE2,0xAD,0xAE,0x62,0xAF,0xB0,0xB1,

0x61,0xB2,0xB3,0xB4,0xE3,0x65,0xB6,0xB7, /* A0 */

0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0x6F,0x6E,

0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, /* B0 */

0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,

0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, /* C0 */

0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,

0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, /* D0 */

0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,

0x70,0x63,0xBF,0x79,0xE4,0x78,0xE5,0xC0, /* E0 */

0xC1,0xE6,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,

0xA2,0xB5,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, /* F0 */

0xEA,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF);