Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабораторні 1.doc
Скачиваний:
1
Добавлен:
09.12.2018
Размер:
1.08 Mб
Скачать
  1. Ход роботи.

Розробимо програму, яка запалює світлодіод по натисненню кнопки. Щоб поліпшити легкість для читання програми, бітам в регістрах вводу/виводу надамо символічні імена за допомогою #define:

/* Привласнення символічних імен бітам регістрів вводу/виводу */

/* Ця програма запалює світлодіод по натисненню кнопки. Чип: AT90S2313.

Світлодіод підключений катодом до виводу 0 Порту В, а анодом через резистор 470 Ом — до плюса джерела живлення. Кнопка одним виводом підключена до виводу 1 Порту В, а іншим — до мінуса джерела живлення (до "загального"). Частота кварцу 1 Мгц, хоча в даному випадку вона може бути будь-якою */

#include <90s2313.h> // підключаємо файл, де визначені адреси регістрів

/* Привласнення символічних імен */

#define output_led PORTB.O // Вихід на світлодіод

#define input_button PINB.l // Вхід кнопки

/* Основна функція програми */

void main(void)

{

/* Задамо напрям вивідів Порту В */

DDRB.0=l; // задамо біт 0 Порту В як вихід

DDRB.l=0; // задамо біт 1 Порту В як вхід

/* Встановимо виводи Порту В */

output_led =1; // використовуємо символічне ім'я біта PORTB.0,

// запишемо в нього 1, щоб встановити вивід 0

// Порту В як вихід, на якому встановлений рівень

// логічної 1, щоб світлодіод не горів

PORTB.1=1; // встановимо біт 1 Порту В як "вхід з підтяжкою",

// щоб при віджатій кнопці на цьому виводу була 1, а

// при натисненні кнопки рівень мінявся на 0

/* Нескінченний цикл */

while (1) // Оператор циклу

{

/* Тіло циклу while */

if (input_button==0) //В умові використовуємо символічне

// ім'я виводу PINB.1. Якщо кнопка натиснута,

// тобто на виводу PINB.1 логічний 0, то output_led=0;

// запалюємо світлодіод

else // Інакше, якщо кнопка віджата,

output_led=l; // гасимо світлодіод

} // Дужка закриває цикл while()

} // Дужка закриває функцію main()

Результат виконання цієї програми представлений на рис.1.2.

Ланцюг перезапуску, живлення і кварцовий резонатор мікроконтролера не показані.

Рисунок. 1.2. - Результат роботи програми — натиснення кнопки викликає запалення світлодіоду.

Лабораторна робота № 2

Тема: Робота з LCD-функціями мікроконтролерів Atmel

Мета: вивчити основні методи роботи з LCD-функціями однокристальних мікроЕОМ

1. Загальні теоретичні відомості.

LCD-функції призначені для полегшення користувачу сполучення між програмами Си і алфавітно-цифровими LCD-модулями з вбудованим чипом HD44780 від Hitachi або еквівалентним.

Контролер HD44780 потенційно може управляти двома рядками по 40 символів у кожному (для модулів чотирма рядками по 40 символів використовуються два однотипні контролери).

Назва і опис виводів LCD, що розглядаються, наведені в Табл. 2.1.

За допомогою цих вивідів LCD обмінюється інформацією з управляючим мікроконтролером (у нашому випадку — з AVR). Мікроконтролер AVR посилає в LCD команди, що управляють режимами його роботи, і коди символів, що виводяться. У свою чергу LCD може посилати мікроконтролеру AVR по його запиту інформацію про свій стан і дані з своїх внутрішніх блоків пам'яті.

Таблиця 2.1. - Опис виводів LCD на базі HD44780

Назва виводу

Опис

VSS

Живлення OV(-)

VDD

Питание+5 V(+)

V0

Напруга зсуву, яка управляє контрастністю

RS

Вхід. Високий рівень — дані; низький — команди

R/W

Вхід. Високий рівень — читання; низький — запис

Е

Вхід. Строб, супроводжуючий сигнали на шині «Команди/Дані». LCD-модулі з розміром матриці 4x40 символів мають два виводи — Е1 і Е2, кожен для своєї половини дисплея (для свого контроллера)

DB0...DB7

Шина «Команди/дані»

Три виводи LCD призначені для подачі напруги живлення (VSS, VDD) і напруги зсуву (V0), яка управляє контрастністю дисплея. На рис. 2.1 показана рекомендована схема живлення цих виводів.

Рисунок 2.1. - Рекомендована схема живлення LCD.

Виводи DB0...DB7 використовуються для організації мультиплексованої шини «Команди/дані». На виводи RS, R/W, E (або El, E2 для LCD 4x40) мікроконтролер AVR виставляє управляючі сигнали.

За допомогою сигналу на лінії RS мікроконтролер повідомляє контроллер LCD про те, що саме передається по шині: команду або дані. Якщо RS = 0, адресується регістр команд, якщо RS = 1- регістр даних.

Дані через регістр даних, залежно від поточного режиму, можуть поміщатися (або прочитуватися) у відеопам'ять (DDRAM) або в ОЗП знакогенератора (CGRAM) за поточною адресою.

Інформація, що потрапляє в регістр команд, інтерпретується пристроєм виконання команд як управляюча послідовність. Прочитання регістра команд повертає в семи молодших бітах поточне значення лічильника адреси (АС), а в старшому розряді — прапор зайнятості (BE).

Сигнал на лінії Е (або El, E2) є стробом, супроводжуючим сигнали на шині «Команди/дані». Запис інформації в LCD відбувається за спадом цього сигналу.

Потенціал на управляючому виводі R/W задає напрям передачі даних: запис в RAM LCD (R/W = 0) або читання звідти (R/W = 1).

Для випадку, коли мікроконтролер має обмежену кількість ліній вводу/виводу, передбачений другий варіант підключення LCD з використанням 4 -бітової шини «Команди/дані». При цьому кожен байт даних передається по лініях DB4...DB7 послідовно двома тетрадами, починаючи із старшої.

Контроллер LCD після прийому байта команди або байта даних вимагає деякого часу для обробки одержаної інформації, протягом якого мікроконтролер AVR не повинен виконувати нові передачі.

Для того, щоб визначити, коли контролер LCD закінчить свої внутрішні операції, мікроконтролер AVR може опитувати BUSY-прапор (прапор зайнятості — BE), який скинеться тільки тоді, коли контролер LCD звільниться. Другий, простіший спосіб полягає у тому, що управляючий мікроконтролер, знаючи, скільки часу потрібен LCD на обробку тієї або іншої команди, просто виконує тимчасову затримку після кожної передачі інформації.

Відеопам'ять (DDRAM), що має загальний об'єм 80 Б, призначена для зберігання кодів символів, що відображаються на LCD. Відеопам'ять організована в два рядки по 40 символів у кожній. Ця прив'язка є жорсткою і не підлягає зміні, іншими словами, незалежно від того, скільки реальних рядків матиме кожен конкретний LCD-модуль, скажімо, 80x1 або 20x4, адресація відеопам'яті завжди робиться як до двох рядків по 40 символів.

При записі або читанні буфера даних обіг здійснюється до центру, на яку в даний момент указує курсор. У дворядкових LCD перші 40 знакомісць буфера даних зазвичай відображаються на верхньому рядку дисплея, а другі 40 знакомісць — на нижній.

Окрім DDRAM, контроллер LCD містить ще один блок пам'яті — знакогенератор. Його «прошивка», тобто відповідність кодів зображенню символів, звичайно є в описі LCD. Приклад такої «прошивки» представлений в Табл. 2.2.

З допустимих для розміщення у DDRAM кодів символи з кодами 0x00...0x07 (і їх дублікати з кодами 0x08...0x0F) мають спеціальне призначення — це символи, що перевизначаються, графічне зображення яких може призначити сам користувач, помістивши відповідну інформацію у області CGRAM. Для програмування доступні 8 символів, що перевизначаються, в режимі з матрицею 5x7 крапок. Для кожного з восьми символів, що перевизначаються в CGRAM відводиться по 8 елементів пам'яті, кожна з яких відповідає одному рядку точок в зображенні символу. Для символу 0 (код символу 0x00) адреси елементів пам'яті — 0x00...0x07, для символу 1 (код символу 0x01) адреси елементів пам'яті — 0x08...0x0F і т.д. Таким чином, частина знакогенератора, що перепрограмовується містить 64 байти пам'яті (8x8).

Для кодування матриці використовуються горизонтально «укладені» байти, п'ять молодших бітів яких несуть інформацію про малюнок (причому 1 означає, що сегмент буде включений), 4-й біт кожного з 8 байтів матриці визначає ліву колонку символу, а 0-й — праву. Старші три біти не використовуються і можуть мати будь-які значення.

Приклад кодування CGRAM для одного символу приведений на рис. 2.1 (символ 2, код символу 0x02).

Рисунок 2.2. - Приклад кодування символу.

У контролера HD44780 існує набір внутрішніх прапорів (Табл. 2.2), що визначають режими роботи різних елементів контролера.

Таблиця 2.2. Приклад прошивки знакогенератора LCD-модуля на базі HD44780

Таблиця 2.3.- Прапори, що управляють роботою контролера HD44780

Прапор

Опис

I/D

Визначає режим зсуву лічильника адреси АС, 0 — зменшення, 1 — збільшення

S

Визначає режим здвигу вмісту екрану. 0 — здвиг екрану не відбувається, 1 — після запису в буфер даних (DDRAM) чергового коду, екран зсовується в напрямку, визначуваному прапором I/D: 0 — вправо, 1 — вліво. При здвигу не відбувається зміна вмісту DDRAM. Змінюються тільки внутрішні покажчики розташування видимого з початку рядка в DDRAM

S/C

Прапор-команда, що виробляє разом з прапором R/L операцію здвігу вмісту екрану (так само, як і у попередньому випадку, без змін у DDRAM) або курсору. Визначає об'єкт здвигу: 0 — здвигається курсор, 1 — здвигається екран

R/L

Прапор-команда, що виконує разом з прапором S/C операцію здвигу екрану або курсору. Уточнює напрям здвигу: 0 — вліво, 1 — вправо

D/L

Визначає ширину шини даних: 0...4 біти, 1 ...8 бітів

N

Визначає режим розгортки зображення на LCD: 0 — один рядок, 1 — два рядки

F

Визначає розмір матриці символів: 0...5 х 8 точок, 1...5 х 10 точок

D

Визначає наявність зображення: 0 — вимкнено, 1 — включено

З

Визначає курсор підкреслення: 0 — вимкнений, 1 — включений

У

Визначає курсор у вигляді мерехтливого знакомісця: 0 — вимкнений, 1 — включений

У Табл. 2.4 приведені значення управляючих прапорів безпосередньо після подачі на LCD напруги живлення. Перевизначення значень прапорів відбувається спеціальними командами, які записуються в регістр команд, при цьому комбінації старших бітів визначають групу прапорів або команду, а молодші містять власне прапори.

Таблиця 2.4. - Значення управляючих прапорів після подачі напруги живлення

Значення прапора

Опис

I/D=l

Режим збільшення лічильника на 1

S = 0

Без здвигу зображення

D/L=l

8-бітова шина даних

N = 0

Режим розгортки одного рядка

F = 0

Символи з матрицею 5x8 точок

D = 0

Відображення вимкнене

З = 0

Курсор у вигляді символу підкреслення вимкнений

B = 0

Курсор у вигляді мерехтливого знакомісця вимкнений

Список управляючих комбінацій бітів регістра команд і виконувані команди приведені в Табл. 2.5.

Оскільки на момент включення LCD нічого не відображає (прапор В = 0), то, для того, щоб вивести який-небудь текст, необхідно, як мінімум, включити відображення, встановивши прапор В = 1.

Таблиця 2.5. - Управляючі комбінації бітів регістра команд

Управляючі біти (код)

Опис команди

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

0

0

0

0

0

0

0

1

Очистити екран і встановити курсор в нульову позицію (лічильник адреси АС = 0), адресація АС на регістр даних (DDRAM)

0

0

0

0

0

0

1

Встановити курсор в нульову позицію (АС = 0). Установити дисплей щодо DDRAM в початкову позицію. Вміст DDRAM при цьому не міняється

0

0

0

0

0

1

I/D

S

Установити напрям здвигу курсору вправо (I/D = 1) або вліво (I/D = 0) при записі/читанні чергового коду в DDRAM. Дозволити (S = 1) або заборонити (S = 0) здвиг екрану разом із здвигом курсору

0

0

0

0

1

D

З

У

Включити (D = 1) або вимкнути (D = 0) екран. Запалити (С=1) або погасити (С=0) курсор. Зображення курсору зробити миготливим (У = 1) чи ні (У = 0)

0

0

0

1

S/C

R/L

Перемістити курсор (S/C = 0) або здвинути екран (S/C = 1) вправо (R/L = 1) або вліво (R/L = 0)

0

0

1

D/L

N

F

Встановити бітність шини даних 4 біти (D/L = 0) або 8 бітів (D/L = 1); кількість рядків дисплея — одна (N = 0) або дві (N = 1); розмір матриці символів — 5x7 точок (Р = 0) або 5х10 точок (F= 1)

0

1

Адреса CGRAM

Установка адреси ОЗП знакогенератору (CGRAM). Після цієї команди дані записуються/прочитуються у/з CGRAM

X

X

X

X

X

X

1

Адреса DDRAM

Установка адреси DDRAM. Після цієї команди дані записуються/прочитуються у/з DDRAM

X

X

X

X

X

X

X

Ось приклад широко поширеної послідовності команд (див. Табл. 2.5) для ініціалізації LCD: 0x38, 0х0С, 0x06 (знак «0х» перед числом указує на шістнадцятерічний код). 0x38 встановлює режим відображення 2 рядків з матрицею 5x8 точок і робота з 8-бітовою шиною даних; 0х0С включає відображення на екрані LCD без відображення курсору, 0x06 встановлює режим автоматичного переміщення курсору зліва направо після виводу кожного символу.

Вивід на екран символу виробляється записом його коду в регістр даних. При цьому символ розміщується у DDRAM за поточною адресою, вказаної лічильником адреси (АС) контролера LCD, а значення АС збільшується або зменшується на 1. Щоб здійснити встановлення заново курсору на потрібну позицію, необхідно привласнити АС відповідне значення (див. Табл. 2.5). Тут є одна тонкість. Коли здійснюється послідовний запис символів і в результаті заповнюється весь рядок, курсор автоматично переходить на другий рядок; але якщо необхідно примусово встановити курсор, скажімо, на початок другого рядка, то буде невірним привласнити АС, здавалося б, логічне значення 0x28 (40), правильним є значення 0x40 (64).

Значення адрес DDRAM у діапазоні 0x28...0x3F (а рівно і 0x68...0x7F) є невизначеними, і результати роботи з ними можуть бути непередбачуваними.

Слід також відзначити особливість виводу на LCD російського тексту. Перш за все знакогенератор LCD повинен мати російські букви (див. Табл. 2.2). Крім того, рядок, що призначений для виводу на LCD, містить англійський текст і цифри, в програмі Си можна записати декількома способами, оскільки їх коди Windows і коди англійського знакогенератора LCD-дисплея співпадають.

Приклад:

/* Еквівалентний запис визначення рядка «Text», що містить

англійські букви (див. Табл. 2.2)*/

char string[] = «Text»;

char string [] = { 'T1, 'e\ 'x1, ' t', '\0' };

char string[] = {0x54, 0x65, 0x78, 0x74, 0x00};

З російським текстом працювати необхідно інакше. Річ у тому, що схожі з англійськими російські букви беруться з англійського знакогенератору, а інше — з усіченого російського (див. Табл. 2.2). Крім того, коди Windows російських букв не СПІВПАДАЮТЬ з їх кодами знакогенератора LCD-дисплея. Тому рядок, що призначений для виводу на LCD, містить російський текст, в програмі Си можна записати тільки одним способом, а саме перерахувавши коди знакогенератора відповідних букв.

Приклад:

/* Запис визначення рядка "Текст", що містить росіяни букви (див. Табл. 2.2) */

char string[] = {0x54, 0x65, ОхВА, 0x63, OxBF, 0x00};

Нагадаємо, що кожен рядок повинен закінчуватися нульовим символом, тобто останнє значення 0x00 є символом кінця рядка, а не кодом символу, що виводиться.

LCD-функції для дисплеїв до 2x40 символів

Ці LCD-функції призначені для полегшення користувачу сполучення між програмами Сі і алфавітно-цифровими LCD-модулями з матрицею до 2x40 символів, з вбудованим чипом HD44780 від Hitachi або еквівалентним.

Перелік LCD-функцій для дисплеїв до 2x40 символів і їх дії приведені в Табл. 2.6.

Таблиця 2.6. - LCD-функції для дисплеїв до 2x40 символів

Функція

Дія

LCD-функції низького рівня

void _lcd_ready(void)

Ця функція чекає, поки модуль LCD не буде готовий прийняти дані. Ця функція повинна бути викликана до запису даних в LCD функцією _lcd_write_data

void _lcd_write_data (unsigned char data)

Ця функція записує байт data в регістр інструкцій LCD. Ця функція може бути використана для зміни конфігурації LCD

void lcd_write_byte (unsigned char addr, unsigned char data)

Ця функція записує байт data в ОЗП знакогенератору (CGRAM) або в DDRAM LCD. Змінна addr є кодом команди для установки адреси елементу пам'яті ОЗП знакогенератора (CGRAM) або DDRAM LCD (див. Табл. 2.5). Її значення для адресації CGRAM: addr=0x01 ХХХХХХ, де ХХХХХХ — адреса осередку CGRAM, в який слід записати байт data. Для адресації DDRAM: addr=OxlXXXXXXX, де ХХХХХХХ - адреса осередку DDRAM, в який слід записати байт data

unsigned char lcd_read_byte (unsigned char addr)

Ця функція читає байт з ОЗП знакогенератору (CGRAM) або з DDRAM LCD. Змінна addr є кодом команди для установки адреси елементу пау'яті ОЗП знакогенератора (CGRAM) або DDRAM LCD (див. Табл. 2.5). Її значення для адресації CGRAM: addr=0x01 ХХХХХХ, де ХХХХХХ — адреса осередку CGRAM, з якого слід прочитати байт. Для адресації DDRAM: addr=0xlХХХХХХХ, де ХХХХХХХ - адреса осередку DDRAM, з якого слід прочитати байт

LCD-функції високого рівня

void lcd_init (unsigned char lcd_columns)

Ця функція ініціалізує модуль LCD, очищає дисплей і встановлює позицію для виводу символу в ряд 0 стовпця 0. Повинна бути визначене кількість стовпців LCD (lcd_columns). Курсор не відображається. Ця функція повинна бути викликана першою, до використовування інших LCD-функцій високого рівня

void lcd_clear(void)

Ця функція очищає LCD і встановлює позицію для виводу символу в ряд 0 стовпця 0

void lcd_gotoxy (unsigned char x, unsigned char у)

Ця функція встановлює поточну позицію дисплея в стовпець х і ряду. Нумерація рядів і стовпців починається з 0

void lcd_putchar(char с)

Ця функція відображає символ с в поточній дисплейній позиції

void lcd_puts(char *str)

Ця функція відображає в поточній дисплейній позиції рядок str, розташований в SRAM

void lcd_putsf(char flash *str)

Ця функція відображає в поточній дисплейній позиції рядок str, розташований в FLASH

Прототипи цих функцій визначені у файлі lcd.h, розташованому в піддиректорії ..\INC. Перед використанням цих функцій директивою #include повинен бути підключений файл lcd.h.

До підключення файлу lcd.h необхідно оголосити, який порт мікроконтролеру буде використаний для зв'язку з модулем LCD.

Синтаксис:

#asm

.equ __lcd_port=aflpec_nopTa

#endasm

Адресу відповідного порту можна знайти у файлі .h, який відповідає використовуваному мікроконтролеру. Файли з розширенням .h розташовані в піддиректорії ..\INC.

У файлі lcd.h підтримуються наступні формати LCD: 1x8, 2x12, 3x12, 1x16, 2x16, 2x20, 4x20, 2x24 і 2x40 символів.

Приклад:

/* Використовування LCD-функцій для дисплеїв до 2x40 символів */

#include <90s2313.h> // підключаємо заголовний файл використовуваного

// мікроконтролера AVR

/* Перед підключенням файлу lcd.h оголосимо порт, використовуваний для підключення модуля LCD */

/* Використовуємо порт В мікроконтролера AT90S2313

Адресу порту знаходимо у файлі 90s2313.h в рядку: sfrb PORTB=0xl8; */

#asm

.equ __Icd_port=0xl8

#endasm

/* Тепер перед використовуванням LCD-функцій для дисплеїв

до 2x40 символів підключимо заголовний файл lcd.h */

#include <lcd.h>

Таблиця 2.7. - Підключення модуля LCD до порту мікроконтролера

Вивід LCD (сигнал)

Біт порту мікроконтролера

Вивід 4 (сигнал RS)

Битий 0

Вивід 5 (сигнал R/W)

Битий 1

Вивід 6 (сигнал Ј)

Битий 2

Вивід 11 (сигнал DB4)

Битий 4

Вивід 12 (сигнал DB5)

Битий 5

Вивід 13 (сигнал DB6)

Битий 6

Вивід 14 (сигнал DB7)

Битий 7

Зрозуміло, згідно опису на LCD, необхідно підключити живлення LCD і напругу для управління контрастністю. Приклад підключення LCD до Порту В мікроконтролера AT90S2313 показаний на рис.2.2. Ланцюг скидання, живлення і кварцовий резонатор мікроконтролера не показані (див. рис. 1.1).

Рисунок 2.2. - Приклад підключення LCD 2x16 до Порту В мікроконтролера AT90S2313.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]