Программное управление технологическим оборудованием
.pdf
|
|
|
(RC |
TRISCbits.TRISC6 = 0; |
// Out |
INA |
6) |
|
|
|
(RC |
TRISCbits.TRISC7 = 0; |
// Out |
INB |
7) |
|
|
|
(RC |
TRISCbits.TRISC8 = 0; |
// Out |
INC |
8) |
|
|
|
(RC |
TRISCbits.TRISC9 = 1; |
// In |
D |
9) |
} |
|
|
|
void Kbd_ReadCol(char row) |
|
|
|
{ |
|
|
|
char column;
for (column = 0; column < 3; column++)
{
LATC &= ~(0x07 <<
6); // Выбор входа
LATC |= (column << 6);
__delay32(100L); // Пауза для установки сигнала
// чтение столбца
if (PORTCbits.RC9)
{
_keys[row][column] = 0;
}
else
{
_keys[row][column] = 1;
}
}
}
// Прерывание таймера T1 по совпадению
void __attribute__((interrupt,no_auto_psv)) _T1Interrupt()
{
Ind_Send(OFF); |
// Отключение индикатора |
LATB &= ~(0x0F << |
|
6); |
// Переключение на следующий |
LATB |= (_i << 6); |
// индикатор |
if (_i < 8) |
|
{ |
|
Ind_Send(_ind[_i] |
// Отправка кода цифры |
511
); |
|
} |
|
else if (_i < 12) |
|
{ |
|
Kbd_ReadCol(_i - |
|
8); |
// Сканирование столбца |
} |
|
// переключение активного вывода _i++; индикатора
if (_i == 12)
{
_i = 0;
} |
|
|
|
|
// Сброс флага прерывания |
IFS0bits.T1IF = 0; |
таймера |
|
TMR1 |
= 0; |
// Перезапуск таймера |
}
void main() |
|
{ |
|
Kbd_Init() |
|
; |
|
Ind_Init(); |
// Инициализация индикации |
Init_Timer1(); // Инициализация таймера while (1)
{
char row, column;
for (row = 0; row < 4; row++)
{
for (column = 0; column < 3; column++)
{
if (_keys[row][column] != 0)
{
Ind_Show(row, column);
}
}
}
}
}
512
4 Варианты индивидуальных заданий к лабораторной работе
Разработать программу для учебного стенда, позволяющую выполнить следующие действия:
1.Ввести последовательно два числа с клавиатуры, отображая вводимое число на LED. Клавишу «#» использовать как окончание ввода числа. После ввода рассчитать сумму введённых чисел и вывести результат на
LED.
2.Ввести последовательно два числа с клавиатуры, отображая вводимое число на LED. Клавишу «#» использовать как окончание ввода числа. После ввода рассчитать разность введённых чисел и вывести результат на
LED.
3.Ввести последовательно два числа с клавиатуры, отображая вводимое число на LED. Клавишу «#» использовать как окончание ввода числа. После ввода рассчитать произведение введённых чисел и вывести результат на LED.
4.Ввести последовательно два числа с клавиатуры, отображая вводимое число на LED. Клавишу «#» использовать как окончание ввода числа. После ввода рассчитать остаток от деления введённых чисел и вывести результат на LED.
5.Ввести последовательно два числа с клавиатуры, отображая вводимое число на LED. Клавишу «#» использовать как окончание ввода числа. После ввода рассчитать наибольший общий делитель введённых чисел и вывести результат на LED.
6.Ввести последовательно два числа с клавиатуры, отображая вводимое число на LED. Клавишу «#» использовать как окончание ввода числа. После ввода рассчитать наименьшее общее кратное введённых чисел и вывести результат на LED.
7.Ввести последовательно два числа с клавиатуры, отображая вводимое число на LED. Клавишу «#» использовать как окончание ввода числа. После ввода вывести максимальное из чисел на VD1..VD10 в двоичном коде.
8.Ввести последовательно два числа с клавиатуры, отображая вводимое число на LED. Клавишу «#» использовать как окончание ввода числа. После ввода вывести минимальное из чисел на VD1..VD10 в двоичном коде.
5 Контрольные вопросы
1.Для чего используется клавиатура в микропроцессорных системах?
2.Какое преимущество даёт использование матричной клавиатуры?
3.Расскажите алгоритм опроса клавиш матричной клавиатуры.
4.Какие недостатки присущи матричной клавиатуре?
513
Лабораторная работа 11
Исследование устройства матричной жидкокристаллической индикации
Цель работы:
Изучить алгоритм, принцип работы и схему электрическую принципиальную подключения матричной жидкокристаллической индикации. Разработать и отладить программу вывода информации на ЖКИ.
Порядок выполнения работы:
Изучить теоретические вопросы, связанные с работой матричного жидкокристаллического индикатора.
Изучить принципиальную электрическую схему к лабораторной работе.
Разработать программу в соответствии с индивидуальным заданием.
Отладить программу в среде MPLAB IDE.
Загрузить программу в учебный стенд.
Исследовать работу устройства жидкокристаллической индикации.
Оформить отчёт по лабораторной работе.
Ответить на контрольные вопросы.
1. Краткие теоретические сведения
1.1Устройство и принцип работы жидкокристаллического индикатора
Внастоящее время в микропроцессорных системах для отображения широко используют жидкокристаллические индикаторы (ЖКИ). Условно все ЖКИ можно разделить на две категории: символьные, или знакосинтезирующие, и графические. Графические индикаторы представляют собой матрицу из m строк и n столбцов, на пересечении которых находятся пиксели. Пиксель представляет собой неделимый объект прямоугольной или круглой формы, обладающий определённым цветом; пиксель – наименьшая единица растрового изображения. Если на определенный столбец
истроку подать электрический сигнал, то пиксель на их пересечении изменит свой цвет. Подавая группу сигналов на столбцы и строки можно формировать по точкам произвольное графическое изображение. Так работает графический ЖКИ. В символьном же ЖКИ матрица пикселей разбита на подматрицы, каждая подматрица предназначена для формирования одного символа: цифры, буквы или знака препинания. Как правило, для формирования одного символа используют матрицу из восьми строк
ипяти столбцов. Символьные индикаторы бывают одно-, двух- и четырехстрочными.
Всостав контроллера ЖКИ входят три вида памяти: CGROM, CGRAM, DDRAM. Когда микроконтроллер передает в контроллер ЖКИ коды символов, то они записываются в DDRAM (Display data RAM – ОЗУ кодов отображаемых символов), такую память называют видеопамятью или видеобуфером. Видеобуфер в символьных
514
индикаторах обычно содержит 80 ячеек памяти – больше, чем число знакомест дисплея. У двухстрочных индикаторов ячейки с адресами от 0x00 и до 0x27 отображаются на верхней строке дисплея, а ячейки с адресами 0x40 … 0x67 – на нижней строке.
Матрицы начертания символов хранятся в памяти знакогенератора. Память знакогенератора включает в себя CGROM (Character generator ROM – ПЗУ знакогенератора), в которую на заводе-изготовителе загружены начертания символов таблицы ASCII. Содержимое CGROM изменить нельзя. Для того, чтобы пользователь смог самостоятельно задать начертание нужных ему символов, в знакогенераторе имеется специальное ОЗУ – CGRAM (Character generator RAM). Под ячейки CGRAM
отведены первые (младшие) 16 адресов таблицы кодов.
Для управления индикатором предназначены 11 линий — восемь для передачи данных (D0 - D7) и три линии управления. Линия RS служит для сообщения контроллеру индикатора о том, что именно передается по шине: команда или данные (RS = 1 — данные, RS = 0 — команда). По линии Е передается строб-сигнал, сопровождающий запись или чтение данных: по переходу сигнала на линии E из 1 в 0 осуществляется запись данных во входной буфер микроконтроллера индикатора. Запись информации в ЖКИ происходит по спаду этого сигнала. Потенциал на управляющем выводе R/W (Read/Write) задает направление передачи информации, при R/W = 0 осуществляется запись в память индикатора, при R/W = 1 – чтение из нее. Еще три линии предназначены для подачи питающего напряжения (VDD, GND) и напряжения смещения, которое управляет контрастностью дисплея.
Буфер ввода/вывода индикатора может работать в восьми- и четырёхбитном режиме. В четырёхбитном режиме данные передаются тетрадами.
После приема информации контроллеру ЖКИ требуется некоторое время на выполнение команд, в это время управляющий контроллер не должен давать следующую команду или пересылать данные.
Команды и алгоритмы работы жидкокристаллических индикаторов различных производителей могут иметь существенные различия. Организация работы с индикатором будет рассмотрена на примере используемого в стенде ЖКИ DV16236. Размер индикатора – 2 строки по 16 символов. Используемый драйвер –
HD44780.
1.2Команды контроллера ЖКИ
Втаблице 1.1 приведены основные команды контроллера ЖКИ и время, необходимое для выполнения этих команд. Значения битов используемых при установке режимов работы индикатора приведены в таблице 1.2.
Для того чтобы можно было определить, когда ЖКИ закончит свои внутренние операции, контроллер ЖКИ содержит специальный флаг занятости – BUSY-флаг (BF). Если контроллер занят выполнением внутренних операций, то BF установлен (BF = 1), если же контроллер готов принять следующую команду, то BF сброшен (BF = 0). Более простой способ организации обмена заключается в том, что управляющий микроконтроллер, зная, сколько времени требуется ЖКИ на
515
обработку той или иной команды, после каждой передачи информации ждет соответствующее время.
|
|
|
|
|
|
|
|
|
|
|
Таблица 1.1 |
|
|
|
|
|
Коды команд контроллера ЖКИ |
|
|||||||
|
|
|
|
Код инструкции |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
Время |
Инструк- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Описание |
выпол- |
ция |
|
|
|
|
|
|
|
|
|
|
|
|
|
RS |
R/W |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
|
нения |
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Очистка дисплея и |
|
Очистить |
|
|
|
|
|
|
|
|
|
|
|
|
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
перевод курсора в |
1,52 мс |
дисплей |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
начальную позицию |
|
Возврат в |
|
|
|
|
|
|
|
|
|
|
Перевод курсора в |
|
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
- |
|
1,52 мс |
начало |
|
|
|
|
|
|
|
|
|
|
начальную позицию |
|
|
|
|
|
|
|
|
|
|
|
|
Установка |
|
|
|
|
|
|
|
|
|
|
|
|
направления |
|
|
|
|
|
|
|
|
|
|
|
|
перемещения |
|
Установка |
|
|
|
|
|
|
|
|
|
|
курсора |
|
режима |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
SH |
и разрешение |
37 мс |
ввода |
|
|
|
|
|
|
|
|
|
|
смещения |
|
|
|
|
|
|
|
|
|
|
|
|
отображаемой |
|
|
|
|
|
|
|
|
|
|
|
|
области |
|
|
|
|
|
|
|
|
|
|
|
|
Установка битов |
|
Вкл/выкл |
|
|
|
|
|
|
|
|
|
|
вкл/выкл дисплея |
|
|
|
|
|
|
|
|
|
|
|
|
(D), |
|
индика- |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
|
37 мс |
|
|
|
|
|
|
|
|
|
|
|
курсора (C) и |
|
тора |
|
|
|
|
|
|
|
|
|
|
мерцания курсора |
|
|
|
|
|
|
|
|
|
|
|
|
(B) |
|
Сдвиг |
|
|
|
|
|
|
|
|
|
|
Установка битов |
|
|
|
|
|
|
|
|
|
|
|
|
перемещения |
|
курсора и |
|
|
|
|
|
|
|
|
|
|
курсора |
|
|
0 |
0 |
0 |
0 |
0 |
1 |
S/C |
R/L |
- |
- |
и сдвига дисплея |
37 мс |
индика- |
|
|
|
|
|
|
|
|
|
|
без |
|
тора |
|
|
|
|
|
|
|
|
|
|
изменения DDRAM |
|
|
|
|
|
|
|
|
|
|
|
|
Установка |
|
|
|
|
|
|
|
|
|
|
|
|
интерфейса |
|
|
|
|
|
|
|
|
|
|
|
|
|
516 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Окончание таблицы 1.1 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Установка |
|
|
|
|
|
|
|
|
|
|
|
|
|
(DL: 8/4-битный), |
|
|
||
|
|
|
0 |
0 |
|
0 |
0 |
1 |
DL |
N |
F |
- |
- |
|
37 мс |
|||
режимов |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
количества строк (N) и |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
шрифта (F) |
|
|
Установка |
|
|
|
|
|
|
|
|
|
|
|
|
|
Установка интерфейса |
|
|
||
позиции |
|
0 |
|
0 |
1 |
|
|
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
позиции курсора |
37 мс |
||
курсора |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(адреса DDRAM) |
|
|
|
|
Запись |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Запись данных в |
|
|
данных в |
|
1 |
|
0 |
D7 |
|
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
37 мс |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DDRAM |
|
|
|
DDRAM |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Таблица 1.2 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Значение битов конфигурации |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
Значение бита |
|
|
|
|
|
|
|
|
Описание |
|
|
||||||
|
|
|
|
|
|
|
|
Смещение курсора вправо при записи данных в |
|
|
||||||||
|
|
I/D = 0 |
|
|
|
DDRAM |
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
Смещение курсора влево при записи данных в |
|
|
||||||||
|
|
I/D = 1 |
|
|
|
DDRAM |
|
|
|
|
|
|
|
|
||||
|
|
SH = 0 |
|
|
|
Смещение отображаемой области отключено |
|
|
||||||||||
|
|
SH = 1 |
|
|
|
Смещение отображаемой области включено |
|
|
||||||||||
|
|
D = |
|
|
|
Отключить |
|
|
|
|
|
|
|
|||||
|
|
0 |
|
|
|
|
дисплей |
|
|
|
|
|
|
|
|
|||
|
D =1 |
|
|
|
Включить исплей |
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
Отключить |
|
|
|
|
|
|
|
|||
|
С = 0 |
|
|
|
курсор |
|
|
|
|
|
|
|
|
|||||
|
С = 1 |
|
|
|
Включить курсор |
|
|
|
|
|
|
|||||||
|
|
B = |
|
|
|
Отключить мерцание |
|
|
||||||||||
|
|
0 |
|
|
|
|
курсора |
|
|
|
|
|
|
|
|
|||
|
|
B = |
|
|
|
Включить мерцание |
|
|
||||||||||
|
|
1 |
|
|
|
|
курсора |
|
|
|
|
|
|
|
|
|||
|
|
N = |
|
|
|
1-строчный |
|
|
|
|
|
|
|
|||||
|
|
0 |
|
|
|
|
дисплей |
|
|
|
|
|
|
|
|
|||
|
|
N = |
|
|
|
2-строчный |
|
|
|
|
|
|
|
|||||
|
|
1 |
|
|
|
|
дисплей |
|
|
|
|
|
|
|
|
|||
|
|
F = |
|
|
|
Размер символа |
|
|
|
|
|
|
||||||
|
|
0 |
|
|
|
|
5*8 |
|
|
|
|
|
|
|
|
|
||
|
|
F = |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
1 |
|
|
|
|
Размер символа 5*10 |
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
517 |
|
1.3 Инициализация ЖКИ
Перед началом работы требуется произвести инициализацию ЖКИ. Алгоритм инициализации индикатора для четырёхбитного режима представлен на рисунке 1.2.
Рис. 1.2. Блок-схема алгоритма инициализации индикатора
518
2 Электрическая принципиальная схема к лабораторной работе
На рис.2.1 приведена электрическая схема подключения матричного жидкокристаллического индикатора к микроконтроллеру.
Рис. 2.1. Электрическая схема подключения матричного жидкокристаллического индикатора
В стенде используется матричный жидкокристаллический индикатор DV-16236 фирмы DataVision. Для согласования уровней напряжений микроконтроллера и жидкокристаллического индикатора, последний подключён к микроконтроллеру через
микросхему буфера. Активация буфера происходит при низком уровне сигнала на входах. .
3 Пример выполнения работы
Задача: Разработать программу для учебного стенда, отображающую на LCD строку с моделью используемого в стенде микроконтроллера.
Анализ задачи:
Программу для работы с ЖКИ следует организовать в виде функций, выполняющих определенные действия, причем более сложные функции могут включать в себя простейшие. В виде подпрограмм целесообразно реализовать такие функции, как процедура инициализации драйвера ЖКИ, операция отправки команды контроллеру и функция, записывающая данные в DDRAM.
Руководствуясь диаграммой передачи информации из документации на драйвер индикатора, определим последовательность действий при передаче информации в ЖКИ следующим образом: устанавливаем требуемое значение RS, на линию R/W подаем логический ноль, затем на линию E выводим
519
логическую единицу, после чего подаем на шину D значение передаваемого байта. Контроллер ЖКИ считает этот байт и состояние управляющих линий (RS, R/W) только после подачи на линию E логического ноля.
Временные задержки, требуемые для выполнения команд драйвером ЖКИ, реализуются методом программных циклов. Для задания времени паузы в миллисекундах определён макрос, пересчитывающий количество миллисекунд в число машинных циклов и вызывающий стандартную функцию реализации паузы.
Листинг программы:
#include <P33FJ32MC204.h> #define FOSC
7370000 #define FCY (FOSC / 2)
#define Delay_ms(d) (__delay32 (((d)) * ((FCY) / 1000uL))) _FOSCSEL(FNOSC_FRC) // настройка работы микроконтроллера
|
// от внутреннего тактового |
|
генератора |
#define LCD_EN |
LATAbits.LATA10 |
#define LCD_RW |
LATCbits.LATC2 |
#define LCD_RS |
LATAbits.LATA7 |
#define LCD_DB7 |
LATBbits.LATB12 |
#define LCD_DB6 |
LATBbits.LATB14 |
#define LCD_DB5 |
LATBbits.LATB11 |
#define LCD_DB4 |
LATBbits.LATB10 |
// Подпрограмма отправки тетрады данных в драйвер ЖКИ void LCD_set_half_byte(char x)
{
if (x & (0x01 << 3)) LCD_DB7 = 1;
else
LCD_DB7 = 0;
if (x & (0x01 << 2)) LCD_DB6 = 1;
else
LCD_DB6 = 0;
520
