Если в каком-либо проекте на микроконтроллере необходим LCD дисплей, то проще всего применить символьные дисплеи на основе контроллера HD44780. О подключении таких дисплеев к микроконтроллеру AVR и пойдёт речь в этой статье. Дисплеев на основе контроллера HD44780 существует много. О том, какой контроллер стоит в том или ином дисплее можно посмотреть в даташите на дисплей. Я использую дисплеи фирмы Winstar. Различаются эти дисплеи в основном количеством символов в строке, количеством самих строк и наличием подсветки. Определить сколько строк и по сколько символов имеет дисплей можно по названию. Например, дисплей WH0802A имеет 2 строки по 8 символов, а WH1602 – 2 строки по 16 символов.
Подключение к микроконтроллеру.
Интерфейс у таких дисплеев параллельный, но есть возможность сократить количество используемых выводов микроконтроллера, подключив дисплей не по 8-ми битной, а по 4-х битной шине. При этом, кроме 4-х выводов данных нужно будет подключить ещё сигнал E и RS. Вывод RW нужен для того, чтобы контроллер дисплея мог определить, записываем или считываем мы с него данные. Если на нём 0 – значит запись, а 1 – чтение. Поскольку читать какие-либо данные из дисплея нам вряд ли придётся, его можно просто соединить с землёй. В общем, вот схема включения: Потенциометром R2 задаётся контрастность дисплея. Выводы А и К – Анод и Катод светодиодной подсветки соответственно. Катод нужно подключить к земле, а анод либо через резистор 100 Ом к питанию, либо подключить его к ШИМ выводу микроконтроллера – тогда можно будет менять яркость подсветки прямо из программы. Также нужно сказать, что подсветка есть не у всех дисплеев. О том, есть ли подсветка в дисплее и какая у него распиновка можно посмотреть в даташите на конкретный дисплей. Скачать его можно на сайте производителя – winstar.com.tw.
Софт.
Для работы с такими дисплеями я использую библиотеку от Radosław Kwiecień. Отличная библиотека! Работает с дисплеем по 4-х битной шине и, что очень хорошо, работает из Proteus’a. У этой либы есть следующие полезные подпрограммки:
- LCD_init – инициализация дисплея. Достаточно просто вызвать эту подпрограмму в начале проги и дисплей будет инициализирован.
- LCD_WriteCommand – отправить команду дисплею. Сам код команды загружается в регистр R16. Коды команд можно найти в даташите на дисплей. Вот, например, код очистки дисплея: 0×01
- LCD_WriteData – запись данных в дисплей. Данные – символы, которые выводятся на дисплей. Символы загружаются в R16 в виде ASCII кода, но тут есть небольшая проблема. Дело в том, что просто записать символ в ASCII можно только если он(символ) английский, либо это цифра. Если же символ русский, придётся записывать его шестнадцатеричный код. Получить его можно с помощью конвертеров, например, этого.
- LCD_SetAddressDD – установить адрес в памяти данных дисплея. Начиная с него будет производится запись символов на экран. Всего там 80 ячеек (по 40 на каждую строку). С нулевой ячейки начинается первая строка, а с 40-ой – вторая. После инициализации, либо очистки дисплея запись будет производится с 0-го адреса и после записи символа, адрес автоматически увеличивается на 1. Поскольку символов в строке всего 16, то дисплей можно “сдвигать” относительно ячеек памяти, делается это посредством специальной команды, о которых я расскажу чуть позже. Адрес записывается перед вызовом подпрограммы в регистр R16.
Тут я привёл не все подпрограммы, так как остальные используются крайне редко. Теперь я расскажу о том, как подключить данную библиотеку к проекту, опушу команды, которые можно подавать контроллеру дисплея и приведу пример программы на ассемблере. Итак, прежде чем подключить данную библиотеку к проекту, нужно скопировать её в папку с проектом. Скачать библиотеку можете на сайте автора, а можете у меня. Я слил всю библиотеку в один файл и теперь к проекту её можно подключить одной строчкой кода. Для этого, где-нибудь в конце программы, в области подпрограмм нужно вписать вот такую строчку:
.include “hd44780.asm”
А в начале проекта нужно добавить строку, где будет указана тактовая частота(это нужно для библиотеки задержек, используемой в библиотеке для работы с дисплеем). Выглядит она следующим образом:
#define F_CPU(8000000)
8000000 – тактовая частота микроконтроллера в Герцах. Также необходимо в начале библиотеки определить, на каких портах микроконтроллеру будут линии данных. Итак, открываем файл hd44780.asm и в начале там будут такие строчки:
.equ LCD_PORT = PORTA .equ LCD_DDR = DDRA .equ LCD_PIN = PINA .equ LCD_D4 = 0 .equ LCD_D5 = 1 .equ LCD_D6 = 2 .equ LCD_D7 = 3 .equ LCD_RS = 4 .equ LCD_EN = 5
LCD_PORT, LCD_DDR, LCD_PIN – порт, регистр направления порта и пин того порта, к которому будут подключены выводы данных дисплея (я подключал к порту А), а все остальные определения – номера битов порта, к которым будут подключены конкретные выводы. Всё, теперь библиотека подключена к проекту и её можно использовать. Прежде чем написать пример программы, я, как и обещал, расскажу о командах, которые может исполнить контроллер дисплея и для чего эти команды нужны. Итак, вот список интересующих нас команд.
- 00000001 – очистка дисплея. При подаче этой команды содержимое памяти данных зануляется.
- 0001xy00 – сдвиг курсора или экрана. Передав эту команду, мы сдвигаем курсор или экран на 1 ячейку памяти. Также у дисплея есть понятие курсора – ячейки, в которую будет произведена запись. Если немного изменить настройки инициализации дисплея, можно сделать так, чтобы на экране появился курсор (в виде мигающего квадратика). Так вот, бит x определяет что мы будем сдвигать – экран(1) или курсор(0), а бит y – направление – влево(0) или вправо(1).
- 00000010 – сброс сдвигов.
А ниже приведены команды, необходимые для настройки и инициализации дисплея:
- 000001xy – этой командой можно настроить сдвиг курсора и экрана. x – сдвиг курсора. 0 – влево, а 1 – вправо. Поскольку мы читаем слева направо, то нам нужно устанавливать здесь 1. y – если здесь установить 1, то при записи нового байта будет автоматически сдвигаться экран.
- 00001xyz – настройка режима отображения. Бит x отвечает за включение дисплея. Если туда записать 1 – дисплей включится, а если 0 – нет. Если установить бит y в 1, то на дисплее появится курсор в виде прочерка, а если установить в 1 бит z, то курсор будет в виде мигающего чёрного квадратика.
- 001xyz00 – с помощью этом команды можно настроить ширину линии данных(4 или 8 бит), размер символа и количество строк. Если бит x установить в 1, то ширина шины данных будет 8 бит, а если 0 – 4 бита. Бит y отвечает за число строк. Если поставить в 1, то будет активно 2 строки, а если в 0 – одна строка. Бит z, в свою очередь, отвечает за размер символа (0 – 5×8(используется чаще всего), 1 – 5×10).
Изменив эти команды в подпрограмме инициализации библиотеки, можно изменить настройки дисплея. Пример. Для этой статьи я написал небольшую программку – примерчик. Всё что она делает – выводит на дисплей две строчки символов. Используемый микроконтроллер – ATmega16. Скачать программку можно по ссылке в конце статьи. Текст программы хорошо прокомментирован, поэтому, думаю, всё в ней будет понятно. UPD #1 По просьбе Wixa выкладываю код для создания своих символов на дисплее. Всё прокомментировано, поэтому, я думаю, проблем возникнуть не должно.
ldi r16,0b01010000 rcall LCD_WriteCommand Первые два байта 01 - код команды, а последующие - Адрес в двоичке. К примеру, 000001 - означает 1. 000010 - 2. В данном случае адрес = 16(2-й символ) Всего у нас 64 байта памяти. Каждый байт кодирует содержимое одной строки точек Размер символа у нас 5Х8, пожтому строчек 8, то есть, для того, Чтобы кодировать один символ нам понадобится 8 сток = 8 байт памяти. Старшие три бита каждой строки не используются. А всего в памяти может быть 8 символов(64/8). При записи в память символа нужно указывать адрес последней строчки Символа(64-0), а при выводе - адрес символа. Он может быть от 0 до 8 Опять же - в двоичке. В данном случае адрес посл. строчки = 16, следовательно адрес символа = 2 После передачи команды нужно передать содержание строчек, вот оно: (Помним, что первые три бита не используются) ldi r16,0b00000001 rcall LCD_WriteData ldi r16,0b00000010 rcall LCD_WriteData ldi r16,0b00000100 rcall LCD_WriteData ldi r16,0b00001000 rcall LCD_WriteData ldi r16,0b00011111 rcall LCD_WriteData ldi r16,0b00000010 rcall LCD_WriteData ldi r16,0b00000100 rcall LCD_WriteData ldi r16,0b01000000 rcall LCD_WriteData ;Всё, запись содержания строчек закончена. Далее посылаем команду ; Установки адреса в DDRAM на 1 позицию. ldi r16,0b10000000 rcall LCD_WriteCommand ldi r16,14;Выводить символ будем на 14-ю позицию rcall Lcd_SetAddressDD ldi r16,0b00000010; А тут выводим символ на дисплей rcall LCD_WriteData Поскольку адрес конца строчек = 16, адрес символа = 2(10 в двоичке); Переводить символы из двоички в десятучку можно при помощи инженерного калькулятора в Windows.
Этот код работает, естественно, только после инициализации дисплея. Выводит какое-то подобие молнии. Художник из меня никакой, так что извиняйте. Код в архиве, а также модель в Протеусе обновлена.
Ошибка базы данных WordPress: [Table './meandr_base/anzpz_usermeta' is marked as crashed and last (automatic?) repair failed]
SELECT user_id, meta_key, meta_value FROM anzpz_usermeta WHERE user_id IN (6487) ORDER BY umeta_id ASC