Лабораторна робота № 5
з курсу „Проектування контролерів периферійних пристроїв”
Тема: Вивід інформації на рідкокристалічний індикатор на базі контролера HD44780.
Мета: Ознайомлення з режимами роботи рідкокристалічного індикатора та контролера HD44780.
Короткі теоретичні відомості
Типовими рідко кристалічними індикаторами, які використовуються для виводу текстової інформації є рідкокристалічні дисплеї (Liquid Crystal Display) або LCD, які виводять кожен символ на рідкокристалічну прямокутну матрицю розміром 8*5 точок і дозволяють виводити стрічки по 8, 16, 20 або 40 символів. Кількість стрічок може бути 1, 2 або 4. Для управління роботою дисплею використовується контролер Hitachi 44780, або сумісні з ним. Конструктивно такий дисплей представляє собою закінчений функціональний модуль, який розміщується на передній панелі пристрою, а підключення до мікропроцесорної системи здійснюється по паралельному інтерфейсу. Вивід інформації здійснюється шляхом запису даних в пам'ять дисплею. Настройка параметрів роботи та програмування – шляхом запису команд. Зовнішній вигляд та габаритні розміри типового рідкокристалічного дисплею представлено на рисунку 1. Призначення виводів паралельного інтерфейсу описано в таблиці 1. Часові діаграми сигналів цього інтерфейсу представлені на рисунку 2. Доступні операції з рідкокристалічним дисплеєм представлені в таблиці 2. Зважаючи на низьку швидкодію контролера дисплею час опрацювання та виконання команд є досить значним і його вказано у відповідній колонці таблиці 2. Час між командами не повинні бути меншими за ці значення. Паралельний інтерфейс може передавати слова по 8 та по 4 біти. Для підключення дисплею в режимі 8-бітного слова необхідно задіяти 11 ліній керування. В режимі 4-бітного слова – достатньо 7-ми. Вибір довжини слова здійснюється при ініціалізації.

Рис. 1 – Вигляд рідкокристалічного дисплею типу WM-C1601M
Таблиця 1 – Призначення виводів рідкокристалічного індикатора типу WM-C1601M
Номер виводу
Познач.
Призначення


Vss
Спільний провідник


Vcc
Напруга живлення (+5V)


Vee
Регулювання контрастності


RS
Вибір режиму регістрів
1 – дані
0 – команда


R/W
Вибір режиму роботи
1 – читання
0 – запис


E
Вхід дозволу - 1 - РКІ активний


DB0
0-й біт (молодший)


DB1
1-й біт


DB2
2-й біт


DB3
3-й біт


DB4
4-й біт


DB5
5-й біт


DB6
6-й біт


DB7
7-й біт (старший)


LED A
Анод світлодіода підсвідки


LED K
Катод світлодіода підсвідки



Рис. 2 – Часові діаграми інтерфейсу рідкокристалічного індикатора
Таблиця 2 – Операції рідкокристалічного дисплею
Назва
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
Час викон., мс
Опис

Очистка
0
0
0
0
0
0
0
0
0
1
1,64
Очищує весь індикатор і повертає курсор на початкову позицію

Повернення
0
0
0
0
0
0
0
0
1
X
1,64
Повертає курсор на початкову позицію, а також повертає весь текст, якщо він був зміщений , на початок

Установка
0
0
0
0
0
0
0
1
H
C
0,04
Встановлює направлення руху курсора ( Н=1 – вперед, 0 - назад ), а також зміщення всього тексту( С=1- зміщення включене, 0 - відключене )

Управління
0
0
0
0
0
0
1
D
C
B
0,04
D=1 - індикатор включений , 0- виключений; С=1-курсор включений, 0 –виключений
В=1 - мигання позиції курсора включене, 0 – виключене

Зміщення
0
0
0
0
0
1
S
R
X
X
0,04
S=1 - зміщення тексту , 0- зміщення курсора ; R=1 - зміщення вправо, 0- вліво

Формат
0
0
0
0
1
L
N
F
X
X
0,04
L -встановлює довжину слова даних (1 - 8 біт , 0 - 4 біт ); N - кількість стрічок індикатора(1 - дві стрічки, 0 - одна ); F- шрифт (1- 5x11 точок, 0 - 5x8 точок)

Вибір адреси ОЗП знакогенератора
0
0
0
1
D5
D4
D3
D2
D1
D0
0,04
Встановлює адресу ОЗП знакогенератора.
Читання/запис даних проводиться по цій адресі

Вибір адреси даних індикатора
0
0
1
D6
D5
D4
D3
D2
D1
D0
0,04
Встановдюється адреса даних індикатора.
Зчитування/запис даних проводиться по даній адресі.

Прапорець зайнятості
0
1
BF
D6
D5
D4
D3
D2
D1
D0

BF – прапорець зайнятості , D6-D0 містить адресу

Запис даних
1
0
D7
D6
D5
D4
D3
D2
D1
D0
0,12
Запис даних

Зчитування даних
1
1
D7
D6
D5
D4
D3
D2
D1
D0

Зчитування даних


Перед початком використання рідкокристалічний індикатор необхідно ініціювати, тобто задати основні параметри, необхідні для подальшої роботи – тип інтерфейсу, початкове положення курсору, режим роботи курсору, тощо. Приклад ініціалізації рідкокристалічного дисплею представлено в таблиці 3.
Таблиця 3 – Приклад ініціалізації рідкокристалічного дисплею
№ п/п
Дія яку необхідно виконати
Пояснення


Записати команду 30Н
Скидання дисплею та встановлення в режим 8-ми бітного слова


Затримка 40 мкс



Записати команду 30Н



Затримка 40 мкс



Записати команду 30Н



Затримка 40 мкс



Записати команду 38Н
8-ми бітні слова, 2-стрічки, шрифт 5*8


Затримка 40 мкс



Записати команду 0FН
Вкл. дисплею, вкл. курсору, вкл. мигання курсору.


Затримка 40 мкс



Записати команду 01Н
Очистка індикатора


Затримка



Записати команду 06Н
Курсор рухається вперед, зміщення тексту викл.


Затримка



Кожній видимій позиції індикатора відповідає деяка адреса, дані з якої відображаються в вигляді символу згідно кодової таблиці. Значення адресів залежать від конфігурації індикатора.
Для індикаторів на 16 символів розміщених в одну стрічку адреси символів 0…7, 0х40…0х47.
Для індикаторів на 16 символів розміщених в дві стрічки адреси символів верхньої стрічки 0…0хF, нижньої - 0х40…0х4F.
Для індикаторів на 20 символів розміщених в одну стрічку адреси символів 0…0х13.
Для індикаторів на 20 символів розміщених в дві стрічки адреси символів верхньої стрічки 0…0х13, нижньої - 0х40…0х53.
Для індикаторів на 20 символів розміщених в чотири стрічки адреси символів верхньої стрічки 0…0х13, наступних - 0х40…0х53, 0х14…0х27, а нижньої - 0х54…0х67.
Для індикаторів на 40 символів розміщених в дві стрічки адреси символів верхньої стрічки 0…0х27, нижньої - 0х40…0х67.

Кодова таблиця
LSN x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
MSN +---------------------------------------------------------------
0x | cg0 cg1 cg2 cg3 cg4 cg5 cg6 cg7 cg0 cg1 cg2 cg3 cg4 cg5 cg6 cg7
1x |
2x | ! " # $ % & ' ( ) * + , - . /
3x | 0 1 2 3 4 5 6 7 8 9 : ; ?
4x | @ A B C D E F G H I J K L M N O
5x | P Q R S T U V W X Y Z [ (*) ] ^ _
6x | ` a b c d e f g h i j k l m n o
7x | p q r s t u v w x y z { | } --
9x |
Ax | (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*)
Bx | - (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*)
Cx | (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*)
Dx | (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*)
Ex | (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*)
Fx | (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*) (*)
Примітка: cg0-cg7 символи які задаються користувачем, (*) – нестандартизовані символи які можуть визначатися алфавітом країни призначення індикатора, наприклад: кирилиця, ієрогліфи, тощо.
Для зменшення кількості ліній підключення індикатора може використовуватися режим передачі даних по 4-ри біти. Тоді для зв’язку задіяна лише старша тетрада шини даних індикатора, а один байт передається/зчитується за два такти запису/читання, при чому в першому такті записується старша тетрада, а в другому молодша. Часова діаграма інтерфейсу рідкокристалічного індикатора в режимі 4-бітного інтерфейсу представлена на рис. 3. Ініціалізація індикатора для цього режиму відрізняється від приведеної в таблиці 3 лише тим, що перші 3 команди – 20Н, а четверта 28Н.

Рис. 3 – Часові діаграми інтерфейсу рідкокристалічного індикатора режимі 4-бітного інтерфейсу
Завдання:
Вивести на рідкокристалічний індикатор дані отримані по послідовному інтерфейсу. Параметри послідовного інтерфейсу, тип рідкокристалічного індикатора, та тип інтерфейсу задаються згідно номера варіанту.
№ варіанту
1
2
3
4
5
6
7
8
9
0

Частота роботи послідовного порту
1200
2400
4800
9600
1200
2400
4800
9600
9600
4800

Порти підключені до індикатора
0
1
2
0
1
2
0
1
2
0

Тип інтерфейсу індикатора
4-біт.
4-біт.
4-біт.
4-біт.
4-біт.
8-біт.
8-біт.
8-біт.
8-біт.
8-біт.

Тип індикатора
LM016L
LM020L
LM032L
LM041L
LM044L
LM016L
LM020L
LM032L
LM041L
LM044L


Порядок виконання роботи
Скласти схему відповідно до номера варіанту.
Написати та відлагодити програму роботи мікроконтролера.
Запрограмувати мікроконтролер.
Перевірити функціонування схеми.
Оформити звіт по лабораторній роботі.
Контрольні запитання
Приклад схеми підключення рідкокристалічного індикатора в режимі 8-ми бітного інтерфейсу

Приклад програми на С51
#include <REGX51.H>
#include <stdio.h>
/*---------------------------------*/
#define LCD_DAT P1
#define LCD_RS P3_5
#define LCD_RW P3_6
#define LCD_E P3_7
/*---------------------------------*/
void init_LCD(void);
void out_com_lcd(char out);
char putchar(unsigned char out);
void inc_kursor_pos_lcd(unsigned char n);
unsigned char print_ram_adres_lcd;
/*---------------------------------*/
void delay(unsigned int n);
/*---------------------------------*/
void main(void)
{
delay(100);
init_LCD();
printf("PKPP for SCS-1x Lab N5 Example");
while(1)
{
}
}
/*---------------------------------*/
void delay(unsigned int n)
{
unsigned int i,j;
for(j=0;j<n;j++)
for(i=0;i<0x200;i++);
}
/*---------------------------------*/
void init_LCD(void)
{
unsigned char init_comand[]={0x30,0x30,0x30,0x38,0x0F,0x1,0x6};
unsigned char i;
LCD_RS=0;
LCD_RW=0;
LCD_E=0;
delay(100);
for(i=0;i<7;i++)
out_com_lcd(init_comand[i]);
print_ram_adres_lcd=0;
}
/*---------------------------------*/
void out_com_lcd(char out)
{
unsigned char a;
LCD_RS=0;
LCD_RW=0;
LCD_DAT=out; //8-bit interface
for(a=0;a<200;a++);
LCD_E=1;
for(a=0;a<200;a++);
LCD_E=0;
for(a=0;a<200;a++);
delay(5);
}
/*---------------------------------*/
char putchar(unsigned char out)
{
unsigned char a;
out_com_lcd(0x80+print_ram_adres_lcd);
LCD_RS=1;
LCD_RW=0;
LCD_E=0;
LCD_DAT=out; //8-bit interface
for(a=0;a<200;a++);
LCD_E=1;
for(a=0;a<200;a++);
LCD_E=0;
for(a=0;a<200;a++);
inc_kursor_pos_lcd(1);
return out;
}
/*---------------------------------*/
void inc_kursor_pos_lcd(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
{
print_ram_adres_lcd++;
if(print_ram_adres_lcd==0x10)print_ram_adres_lcd=0x40;
if(print_ram_adres_lcd==0x50)print_ram_adres_lcd=0x0;
}
}
/*---------------------------------*/
Результат роботи програми

Приклад схеми підключення рідкокристалічного індикатора в режимі 4-ри бітного інтерфейсу

Приклад програми на С51
#include <REGX51.H>
#include <stdio.h>
/*---------------------------------*/
#define LCD_DAT P1
#define LCD_RS P1_3
#define LCD_RW P1_2
#define LCD_E P1_1
/*---------------------------------*/
void init_LCD(void);
void out_com_lcd(char out);
char putchar(unsigned char out);
void inc_kursor_pos_lcd(unsigned char n);
unsigned char print_ram_adres_lcd;
/*---------------------------------*/
void delay(unsigned int n);
/*---------------------------------*/
void main(void)
{
unsigned char i=0;
delay(100);
init_LCD();
delay(100);
printf("PKPP for SCS-1x Lab N5 Example ");
print_ram_adres_lcd=0;
while(1)
{
printf(" PKPP for SCS-1x Lab N5 Example");
print_ram_adres_lcd=0;
delay(100);
}
}
/*---------------------------------*/
void delay(unsigned int n)
{
unsigned int i,j;
for(j=0;j<n;j++)
for(i=0;i<0x200;i++);
}
/*---------------------------------*/
void init_LCD(void)
{
unsigned char init_comand[]={0x20,0x20,0x20,0x28,0x0F,0x1,0x6};
unsigned char i;
LCD_RS=0;
LCD_RW=0;
LCD_E=0;
delay(100);
for(i=0;i<7;i++)
out_com_lcd(init_comand[i]);
print_ram_adres_lcd=0;
}
/*---------------------------------*/
void out_com_lcd(char out)
{
unsigned char a;
LCD_RS=0;
LCD_RW=0;
LCD_DAT &= 0x0F; //4-bit interface
LCD_DAT |= out & 0xF0;
for(a=0;a<200;a++);
LCD_E=1;
for(a=0;a<200;a++);
LCD_E=0;
for(a=0;a<200;a++);
LCD_DAT &= 0x0F;
LCD_DAT |= (out <<4) & 0xF0;
for(a=0;a<200;a++);
LCD_E=1;
for(a=0;a<200;a++);
LCD_E=0;
for(a=0;a<200;a++);
delay(5);
}
/*---------------------------------*/
char putchar(unsigned char out)
{
unsigned char a;
out_com_lcd(0x80+print_ram_adres_lcd);
LCD_RS=1;
LCD_RW=0;
LCD_E=0;
LCD_DAT &= 0x0F; //4-bit interface
LCD_DAT |= out & 0xF0;
for(a=0;a<200;a++);
LCD_E=1;
for(a=0;a<200;a++);
LCD_E=0;
for(a=0;a<200;a++);
LCD_DAT &= 0x0F;
LCD_DAT |= (out <<4) & 0xF0;
for(a=0;a<200;a++);
LCD_E=1;
for(a=0;a<200;a++);
LCD_E=0;
inc_kursor_pos_lcd(1);
return out;
}
/*---------------------------------*/
void inc_kursor_pos_lcd(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
{
print_ram_adres_lcd++;
if(print_ram_adres_lcd==0x10)print_ram_adres_lcd=0x40;
if(print_ram_adres_lcd==0x50)print_ram_adres_lcd=0x0;
}
}
/*---------------------------------*/
Результат роботи програми