Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка пргр МП.docx
Скачиваний:
11
Добавлен:
01.07.2025
Размер:
16 Мб
Скачать
☆

Б.5 Лабораторная работа № 5 «Жидкокристаллический индикатор»

Б.5.1 Задание

Разработать и написать драйвер жидкокристаллического индикатора (ЖКИ) для учебно-лабораторного стенда SDK-1.1. Написать программу для разработанного драйвера, которая выполняет определенную вариантом прикладную задачу.

Б.5.2 Описание работы ЖКИ в контроллере SDK-1.1 подключен не напрямую к микроконтроллеру ADuC812, а через расширитель портов ввода-вывода, выполненный на базе ПЛИС. В ЖКИ есть специальный контроллер, формирующий необходимые напряжения на входах матрицы и осуществляющий динамическую индикацию. Для работы с этим контроллером реализован простейший интерфейс, описанный ниже (рис. 141, табл. 18). Матрица имеет 80 входов по горизонтали и 16 входов по вертикали3.

Рис. 141. Схема подключения контроллера ЖКИ к МК ADuC812

Матрица ЖКИ состоит из 32 знакомест (2 строки по 16 символов) размером 5 точек по горизонтали и 8 точек по вертикали. Для отображения различных символов внутри контроллера ЖКИ есть знакогенератор4.

Таблица 18. Интерфейс ЖКИ

Обозначение

Описание

RS

Переключение между регистрами команд и данных: 1 – данные, 0 – команды

R/W

1– чтение (из контроллера ЖКИ), 0 – запись (в контроллер ЖКИ)

E

Разрешающий сигнал (1 – активный уровень). Если сигнал E = 0, то контроллер ЖКИ игнорирует все остальные сигналы

DB0

Бит данных 0

DB1

Бит данных 1

DB2

Бит данных 2

DB3

Бит данных 3

DB4

Бит данных 4

DB5

Бит данных 5

DB6

Бит данных 6

DB7

Бит данных 7

Основными компонентами контроллера ЖКИ являются память DDRAM

(Data Display RAM), память CGRAM (Character Generator RAM), память

CGROM (Character Generator ROM), счетчик адреса, регистр команд IR (Instruction Register), регистр данных DR (Data Register). Регистр команд предназначен для записи в него таких операций, как очистка дисплея, перемещение курсора, включение/выключение дисплея, а также установка адреса памяти DDRAM и CGRAM для последующего их выполнения. Регистр данных временно хранит данные, предназначенные для записи или чтения из DDRAM или CGRAM (символы). Эти два регистра можно выбрать с помощью регистрового переключателя RS (Register Select).

Работать с ЖКИ достаточно просто. За связь с ЖКИ в расширителе портов ввода-вывода отвечают два регистра:

  1. DATA_IND (адрес 0x080001) отвечает за выдачу информации на шину данных (через этот регистр можно передавать команды контроллеру и данные).

  2. C_IND (адрес 0x080006) отвечает за формирование сигналов E, R/W и RS, позволяющих регулировать обмен на шине между расширителем портов и контроллером ЖКИ.

Рис. 142. Регистры, необходимые для работы с ЖКИ

На рис. 142 регистры расширителя портов изображены слева, регистры контроллера ЖКИ справа. Для доступа к регистрам контроллера ЖКИ вы должны сформировать на шине сигналы с помощью регистров расширителя портов.

Вся работа с индикатором сводится к нескольким простым вещам:

  1. Первым шагом вы записываете команду или данные (коды выводимых символов) в регистр DATA_IND расширителя портов. После этого, содержимое этого регистра появляется на шине данных контроллера ЖКИ (DB0-DB7). Контроллер на эти данные, естественно, не реагирует, так как сигнал E (Еnable) нами еще не выставлен в активный уровень (логическая «1»).

  2. Вторым шагом вы должны разрешить работу с шиной с помощью сигнала E (логическая «1»), выставить сигнал записи (логический «0» на линии W) и указать тип регистра, с которым вы будете работать в контроллере ЖКИ на линии RS. Если вы передаѐте данные, то на сигнал RS нужно подать «1», если команду, то «0».

Необходимо помнить, что в учебном стенде SDK-1.1 начальная инициализация контроллера ЖКИ уже выполнена в загрузчике. В реальной системе вам придется программировать ее самостоятельно.

Время выполнения команд контроллером ЖКИ не равно нулю, и это нужно учитывать в своем драйвере: опрашивать флаг готовности ЖКИ (BF). Таким образом, функции работы с ЖКИ НЕ нужно вызывать в обработчиках прерывания других периферийных устройств (например, таймера).

Данная лабораторная работа посвящена изучению жидкокристаллического индикатора (ЖКИ) стенда SDK-1.1.

В рамках лабораторной работы необходимо разработать программу для контроллера SDK-1.1, которая выполняет конкретную прикладную задачу (см. варианты задания). Реализация задачи требует знания материалов предыдущих лабораторных работ: таймеры микроконтроллера ADuC812, последовательный канал, светодиодные индикаторы, клавиатура и др.

Драйвер ЖКИ должен включать следующие функции:

Функция

Описание

void InitLCD(void)

Инициализация ЖКИ.

void WriteControlLCD( unsigned char ch)

Запись значения в регистр управления ЖКИ С_IND (ПЛИС):

ch – значение, записываемое в C_IND.

bit ReadBFLCD(void)

Чтение флага BF (флаг занятости контроллера ЖКИ) .

unsigned char ClearLCD(void)

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

unsigned char GotoXYLCD (unsigned char x, bit y)

Переход в заданную позицию дисплея с возвратом результата выполнения операции: x, y – координаты позиции.

unsigned char PrintCharLCD

Вывод символа на дисплей с возвратом

(unsigned char symbol)

результата выполнения операции:

symbol – выводимый символ.

Кроме того, может быть реализована функция вывода строки на ЖКИ, функция дополнительной настройки ЖКИ (отображение, мерцание курсора).

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

Драйвер таймера должен включать следующие функции (помимо обработчика прерывания):

Функция

Описание

void InitTimer(void)

Инициализация таймера.

unsigned long GetMsCounter(void)

Получение текущей метки времени в миллисекундах.

unsigned long DTimeMs(unsigned long t0)

Измерение количества миллисекунд, прошедших с временной метки t0 и до текущего времени.

void DelayMs(unsigned long t)

Задержка на t миллисекунд.

Кроме того, могут быть реализованы функции работы с таймером в режиме «счетчик» (например, чтение счетчика).

Работа с последовательным каналом (приемопередатчиком UART) должна быть организована асинхронно по прерыванию. Драйвер последовательного канала включает следующие функции (помимо обработчика прерывания):

Функция

Описание

void InitSerial(void)

Инициализация последовательного канала.

unsigned char

WriteSerial(unsigned char data_buf)

Передача байта данных data_buf с возвратом результата выполнения операции .

unsigned char

ReadSerial(unsigned char* data_buf)

Прием байта данных *data_buf с возвратом результата выполнения операции.

unsigned char

StatusSerial(void)

Чтение признака наличия байта в буфере приема.

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

Б.5.3 Требования к выполнению работы 1. Разрабатываемые драйверы устройств должны быть выполнены в виде отдельных программных модулей (файлов), содержащих функции по работе с заданным одним устройством.

  1. На уровне драйверов (особенно обработчиков прерываний) НЕ рекомендуется смешивать работу с несколькими периферийными устройствами (например, в обработчике прерывания таймера выводить строку на ЖКИ, опрашивать DIP-переключатели и т.д.). Взаимодействие устройств ввода-вывода следует организовать на прикладном уровне с использованием API-функций их драйверов.

  2. Должен быть предусмотрен контроль ввода корректных значений в рамках выполнения прикладной задачи.

  3. В программе должны быть использованы механизмы взаимного исключения (см. [51], IOS2003_lab4.pdf).

  4. Текст программы должен соответствовать правилам оформления программ на языке Си, приведенным в приложении (Приложение Г. Требования к оформлению программ на языке Си, [95]).

Б.5.4 Содержание отчета

  1. Титульный лист.

  2. Номер варианта, задание.

  3. Модель написанной программы (см. Приложение В. Проектирование и разработка программы).

  4. Разработанные протоколы, форматы данных и др.

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

  6. Основные результаты.

Б.5.5 Литература

Литература к лабораторной работе: [50], [51], [57], [75], [80], [82], [88], [9], [21], [25].

Б.5.6 Варианты заданий

1. Секундомер.

Написать программу, реализующую функции электронного секундомера. Точность измерения времени – сотые доли секунды. В качестве устройства, измеряющего время, следует использовать один из внутренних таймеров микроконтроллера ADuC812. Управление секундомером должно осуществляться с клавиатуры стенда SDK-1.1:

кнопка «*» («старт/пауза») – запускает процесс измерения времени либо приостанавливает его, не сбрасывая;

кнопка «#» («сброс») – сбрасывает замеряемое время в ноль.

На ЖКИ должна отображаться четко следующая информация: замеряемое время (слева в верхней строке); минимальное из всех замеренных времен (слева в нижней строке); максимальное из всех замеренных времен (справа в нижней строке). Формат отображения времени: «SS:CC», где SS – секунды, CC – сотые доли секунды. После переполнения секундомер начинает отсчет с нуля, т.е. 99,99с  0с. Замеренный интервал времени по нажатию кнопки «пауза» должен выводиться в последовательный канал в формате, описанном ранее. Каждый интервал с новой строки. Сообщения о сбросе и переполнении секундомера тоже должны выводиться в последовательный канал (формат этих сообщений определяется студентом).

В рамках задания необходимо реализовать: драйвер таймера; драйвер последовательного канала; драйвер клавиатуры; драйвер ЖКИ.

2. Калькулятор.

Написать программу, реализующую функции простого калькулятора. Управление калькулятором должно осуществляться с клавиатуры стенда SDK-1.1:

кнопки «0 – 9» – ввод операндов; кнопка «A» – операция сложения; кнопка «B» – операция вычитания; кнопка «C» – операция умножения; кнопка «D» – операция деления; кнопка «*» – начало процесса вычисления; кнопка «#» – сброс. На ЖКИ должна выводиться следующая информация: вычисляемое выражение (например, «25+75», затем, после нажатия кнопки «*» – «25+75=100»).

Разрядная сетка операндов и результатов определяется студентом, однако должна содержать не меньше 2 десятичных разрядов и обладать возможностью легкого увеличения/уменьшения. После нажатия кнопки сброса, а также в начале работы калькулятора на индикаторе должен отображаться ноль. Каждое вычисленное выражение (по нажатию кнопки «*») должно выводиться в последовательный канал в формате, описанном ранее, и начинаться с новой строки.

В рамках задания необходимо реализовать:

драйвер последовательного канала; драйвер клавиатуры; драйвер ЖКИ.

  1. Текстовый редактор.

Написать программу, реализующую функции простого текстового редактора. Ввод текста должен осуществляться с клавиатуры стенда SDK-1.1 кнопками «0 – 9». Таким образом, текст может состоять только из цифровых символов. Объем вводимого текста не должен превышать 8 строк по 16 символов, при этом ЖКИ отображает только две соседние строки. Номер текущей строки должен отображаться на светодиодном индикаторе (первая строка – первый светодиод, вторая строка – второй светодиод и т.д.). Перемещение по тексту осуществляется с помощью курсора, управляемого клавишами «A» (влево), «B» (вправо), «C» (вверх) и «D» (вниз). Ввод текста производится в позицию, указываемую курсором, при этом все символы находящиеся правее введенного символа сдвигаются, курсор перемещается (как в обычном текстовом редакторе). В качестве клавиши перевода строки выступает кнопка «*», удаление символов должно производиться кнопкой «#».

В рамках задания необходимо реализовать: драйвер светодиодных индикаторов; драйвер клавиатуры; драйвер ЖКИ.

  1. Бегущая строка.

Написать программу, реализующую эффект «бегущей строки». Эффект заключается в постепенном смещении отображаемой на ЖКИ строки по кругу (вправо или влево). Управление «бегущей строкой» должно осуществляться с клавиатуры стенда SDK-1.1:

кнопка «A» – смена направления движения текста;

кнопка «B» – смена строки ЖКИ, по которой двигается («бежит») текст, причем смена должна производиться немедленно;

кнопки «C» и «D» – изменяют скорость движения текста (диапазон значений: 1 – 10 позиций в секунду).

Для формирования скорости движения строки обязательным является использование таймера микроконтроллера ADuC812. Движение текстовой строки реализуется таким образом, чтобы исчезающая из области видимости часть текста появлялась постепенно с противоположной стороны строки ЖКИ. Кроме того, отображение «бегущей строки» должно быть плавным, четким, без образованных движением текста «хвостов».

По нажатию кнопки «*» программа переходит в режим ввода новой текстовой строки. Ввод производится с помощью кнопок «0 – 9». Таким образом, вводимый текст может состоять только из цифровых символов. При вводе должна контролироваться длина текста (не менее 1 и не более 16 символов). Завершение ввода строки производится кнопкой «*». Отмена ввода – кнопка «#». Исполнение программы должно начинаться с прокручивания в верхней строке ЖКИ слева направо текста «SDK-1.1».

В рамках задания необходимо реализовать:

драйвер таймера; драйвер клавиатуры; драйвер ЖКИ.

5. Монитор состояний устройств.

Написать программу, реализующую монитор состояний устройств стенда SDK-1.1. Программа должна отражать состояние следующих трех устройств:

DIP-переключатели (линии 0-7 дискретного параллельного порта ПЛИС): отображается состояние DIP-переключателей в двоичной системе счисления;

таймер-счетчик: отображается количество перепадов на счетном входе T0 или T1, вызываемых замыканием соответствующих DIP-переключателей (см. рис. 129);

таймер: отображается системное время, прошедшее с момента старта программы в миллисекундах.

Программа должна работать в двух режимах: автоматическом и ручном. Смена режима работы должна производиться нажатием кнопки «*» на клавиатуре стенда SDK-1.1. В автоматическом режиме отображение состояний устройств производится циклически с интервалом 3 секунды по умолчанию. Данный интервал должен изменяться с помощью кнопок «C» и «D». На ЖКИ состояние каждого устройства должно выглядеть следующим образом: в верхней строке – название устройства, в нижней строке – текущее состояние устройства.

В ручном режиме смена отображения состояния устройств должна производиться нажатием кнопки «#».

Кроме того, каждые 2 секунды (может быть другой приемлемый интервал времени) в последовательный канал должно выводиться текущее состояние всех устройств в виде одной строки, формат строки – свободный.

В рамках задания необходимо реализовать: драйвер DIP-переключателей; драйвер таймера/счетчика; драйвер последовательного канала; драйвер клавиатуры (может быть реализован без переповторов, т.е. по принципу «кнопка нажата или нет»); драйвер ЖКИ.