Біблiотека для роботи з буквенно-цифровими LCD індикаторами на базі контролера KS 0066 |
Написав rostokus | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
П'ятниця, 29 липня 2011 00:00 Переглядів: 10129
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Близько 90% усіх буквенно-цифрових LCD індикаторів будуються на базі контроллерів HD44780 aбо SED1278. Ці дисплеї здатні відображувати літери англійского алфавіту, а також інших алфавітів, залежно від типу дисплею. Також користувач може створювати свої символи і різні графічні зображення. Програмування такого дисплею розглянемо на прикладі Raystar RC1602A-GHW-CSX. Екран містить два рядки з 16 символами в кожному з них. Букви “CS” в маркуванні звідчать, що дисплей підтримує англійську і українську абетки. Ця інформація буде корисною не тільки для диплеїв фірми Raystar, але і для дисплеїв інших фірм (майже усі функції будуть працювати з Winstar WH1602C-GTI-CT#). Структура LCD До основних складових елементів LCD відносяться: контролер (KS 0066 - аналог HD44780), матриця рідких кристалів з розмірністю 16х2 комірок. Кожна комірка матриці містить 5х8 крапок (5 по вертикалі і 8 по горизонталі). Призначення виводів дисплею:
Контроллер LCD дисплею містить два 8-бітні регістри: регістр команд (IR) і регістр даних (DR). Коли ми даємо команду контроллеру LCD очистити екран, змістити курсор і т.п. команди, коди цих команд записуються у регістр IR. Також сюди записується адреса у пам'яті DDRAM або CGRAM (дивись далі). Щоб пояснити контроллеру LCD, що саме йому передали (команду чи адресу) існує сигнал RS. Перед тим, як передавати команду потрібно встановити RS в “0” (якщо дані, то “1”). Display Data RAM (DDRAM) — память, в яку записують ASCII коди символів, які потрібно вивести на екран. Матриця рідких кристалів “не розуміє” ASCII коди символів, їй потрібно вказати крапки, які потрібно засвітити, тому для розшифрування ASCII кодів є память Character Generator ROM (CGROM). Вона містить таблицю ASCII символів (див.datasheet). Щоб пояснити призначення цієї пам'яті, розглянемо як вивести на дисплей букву, наприклад “ш”. Її код (згідно datasheet) — 110000012. Отже, коли ми записуємо в LCD 11000001 або C116 в шіснадцятковому коді, дані записується в DDRAM, а потім розшифровуються в CGROM. В результаті на екрані ми бачимо символ “ш”. Потрібно сказати, що при відсиланні даних на LCD вони не зразу попадають в DDRAM, а спочатку записуються в регістр DR. Аналогічно відбувається зчитування — спочатку дані з DDRAM поміщаються в регістр DR, а далі у мк. DDRAM містить 80 байтів, а отже може містити 80 символів. Але екран має 16 комірок в першому і 16 в другому рядках, тому решта символів будуть виведені в, так би мовити, “невидиму область”, звідки їх можна потім “вивести”спеціально командою. Кожна комірка DDRAM LCD має свою адресу: Наприклад, пята комірка першого рядку має адресу - 0416. Character Generator RAM (CGRAM) — память, яка містить символи, створені користувачем. Деколи потрібно вивести на екран символи, яких нема в CGROM. Це можуть бути різні графічні примітиви, смайлики і т.д. Також може бути ситуація, що ви придбали LCD без вбудованої кириличної таблиці ASCII кодів. Розробники дають вам можливість самим створити символи. Формування відбувається за таким принципом: з мк до LCD посилаються 8 байт, кожен з яких відповідає одному рядку комірки LCD. Розмір комірки дисплею 5х8 крапок (5 по ширині і 8 по висоті), тому ми можемо записати 8 рядків. Таким чином з 8 байт ми формуємо один символ. До речі в кожному байті задіяні тільки 5 бітів, 3 старші не використовуються. Пам'ять CGRАM складається з 64 байт (адреси — 0х00-0х3F). Відповідно ми можемо зразу записати 8 символів (8 символів по 8 байт). Але спочатку потрібно вказати контролеру LCD, що зараз ми будемо записувати дані в память CGRАM. Після того, як байти відіслані потрібно переключитись назад на память DDRAM (за адресою, яка відповідає номеру комірки дисплею, куди ми хочемо вивести символ) і записати в неї число, яке відповідає адресі CGRАM, в яку ми записали символ. Складно? Але на практиці стане зрозуміліше :) Таблицю CGRАM для свого LCD знайдете в datasheet. Наприклад, вам потрібно вивести на екран символ якого нема в CGROM — смайлик. Алгоритм дій такий: 1) Вказуємо контролеру LCD, що зараз буде вестись запис у память CGRАM. 01000000 — запис у CGRАM за адресою 0 (їх всього 0х3F). 2) Виводимо послідовно 8 байтів, які сформують наш символ. а) 00000000 б) 00000000 в) 00001010 г) 00000000 д) 00000000 е) 00010001 є) 00001110 ж) 00000000 Видно смайлик (виділено жирним)? 3) Вказуємо контролеру LCD, що наступний байт буде записаний у DDRAM. 10000000 — запис створеного символа буде в першу комірку LCD. 4) Вивидемо в память DDRAM число, яке відповідає адресі CGRАM, в яку ми записали символ. 00000000. Якби виводилось число в комірку CGRАM 0х08 (тобто початок другого символу), ми б записали в память DDRAM — 00000001. Курсивом виділено біти, які не впливають на формування символу.
Прапорець зайнятості Перед тим, як послати LCD дані потрібно перевірити чи він готовий їх обробити (можливо він ще не встиг обробити попередню інформацію). Для цього служить прапорець зайнятості. Якщо встановити лінію RS = 0, а R/W = 1 значення прапорця з'явиться на ніжці LCD DB7. Наступну команду можна виконувати, коли значення прапорця буде рівне 0. Перед роботою з LCD обов’язково потрібно його ініціалізувати, тобто записати початкові налаштування. Без них багато дисплеїв відмовляються працювати. Тут варто сказати, що існує три способи підключення дисплею до мікроконтроллера (мк): по 8 бітній шині, 4 бітній шині або як зовнішню пам'ять. Якщо використовується 4 бітне підключення, то до мк потрібно підключити ніжки DB7-DB4. Крім того потрібно задіяти ще три ніжки мк для сигналів RS, RW і E. При використанні 8 бітного режиму ми посилаємо контроллеру по байту (8 біт). В 4 бітному режимі спочатку відсилається старша тетрада (старші 4 біти), а потім молодша (молодші чотири біти). Останній режим повільніший, бо дані відсилаються два рази, зате потрібно вже не 11 ніжок мк (8 для даних + 3 для керуючих сигналів), а 7 (4 для даних + 3 для керуючих сигналів).
Таблиця команд
Примітка: I/D = “1” - При надсиланні LCD кожного наступного символу курсор буде зміщуватись вправо. Якщо “0” - то вліво. SH — зсув цілого дисплею. Процес ініціалізації детально розписаний у datasheet, тому тут я лише поясню як формувати команди. Наприклад, потрібно вказати LCD, що ми будемо використовувати 4 бітний режим роботи. Для цього існує команда Function Set. Лінії RS та RW встановлюємо в 0. Далі в порт виводимо старшу тетраду: 0010 далі молодшу: 1000 Цією командою ми встановили 4 бітний режим, вказали, що будемо використовувати два рядки LCD і що кожний рядок містить 16 символів. Жирним виділено, ті біти, які потрібно міняти. Після ініціалізації LCD готовий прймати дані. Код Для роботи з цими дисплеями розроблено багато коду. Тому, я вирішив взяти вже готовий проект, розібратись в ньому і налаштувати для своїх потреб. За основу взяв бібліотеку Procyon AVRlib. У цій бібліотеці є багато функцій для різних потреб. Раджу подивитись, та й самому не завадить частіше туди заглядати :) Бібліотека містить такі функції для роботи з LCD: // ініціалізація портів вводу/виводу, які підключені до екрану void lcdInitHW(void); // почекати, поки LCD не буде готовий сприймати наступну команду void lcdBusyWait(void); // записати дані в LCD. Якщо записуємо дані, то type = DATA, якщо // команду, то COMMAND (це макроси, які відповідно дорівнюють “1” і “0”) void lcdWrite(u08 type, u08 data); // зчитати дані з LCD u08 lcdRead(u08); // ініціалізація LCD дисплею void lcdInit(void); // встановити курсор у першу комірку LCD void lcdHome(void); // очистити LCD void lcdClear(void); // перемістити курсор у row рядок і col колонку void lcdGotoXY(u08 row, u08 col); // послати LCD масив символів void lcdPrintMass(u08 *data); // вивід рядка, який показує процес виконання завдання. length - довжина рядка. Це щось на подобі завантаження Windows :) void lcdProgressBar(u08 length); // вивід на екран символу, який створив користувач. LCD_address – номер // комірки LCD, CGRAM_address — адреса в CGRAM, куди ми записуємо // символ, mass[] - масив з 8 байт, які формють символ void LCDSymbolWrite(u08 mass[], u08 LCD_address, u08 CGRAM_address); До статті доданий проект у IAR Embedded Workbench в якому міститься приклад роботи з дисплеєм. За замовчуванням ввімкнений 4 бітний режим роботи, щоб увімкнути 8 бітний потрібно закоментувати рядок #define LCD_DATA_4BIT у файлі lcdconf.h. Також у цьому файлі потрібно вказати порт мк, до якого підключений LCD, а також кількість рядків у LCD і кількість символів у рядку. У файлі global.h задається тактова частота на якій працює мк. Прототипи функцій і визначення макросів знаходяться у файлі lcd.h, а самі функції у файлі lcd.c.
LCD_стаття.rar - файл з проектом.
Успіхів Вам! ( 18 Проголосувало ) Новіші матеріали:
3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved." |