Ошибка базы данных 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 (1) ORDER BY umeta_id ASC

Подключение LCD дисплея к микроконтроллеру AVR. — Меандр — занимательная электроника
Site icon Меандр — занимательная электроника

Подключение LCD дисплея к микроконтроллеру AVR.

Если в каком-либо проекте на микроконтроллере необходим 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. У этой либы есть следующие полезные подпрограммки:

Тут я привёл не все подпрограммы, так как остальные используются крайне редко. Теперь я расскажу о том, как подключить данную библиотеку к проекту, опушу команды, которые можно подавать контроллеру дисплея и приведу пример программы на ассемблере. Итак, прежде чем подключить данную библиотеку к проекту, нужно скопировать её в папку с проектом. Скачать библиотеку можете на сайте автора, а можете у меня. Я слил всю библиотеку в один файл и теперь к проекту её можно подключить одной строчкой кода. Для этого, где-нибудь в конце программы, в области подпрограмм нужно вписать вот такую строчку:

.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 – порт, регистр направления порта и пин того порта, к которому будут подключены выводы данных дисплея (я подключал к порту А), а все остальные определения – номера битов порта, к которым будут подключены конкретные выводы. Всё, теперь библиотека подключена к проекту и её можно использовать. Прежде чем написать пример программы, я, как и обещал, расскажу о командах, которые может исполнить контроллер дисплея и для чего эти команды нужны. Итак, вот список интересующих нас команд.

А ниже приведены команды, необходимые для настройки и инициализации дисплея:

Изменив эти команды в подпрограмме инициализации библиотеки, можно изменить настройки дисплея. Пример. Для этой статьи я написал небольшую программку – примерчик. Всё что она делает – выводит на дисплей две строчки символов. Используемый микроконтроллер – 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.

Этот код работает, естественно, только после инициализации дисплея. Выводит какое-то подобие молнии. Художник из меня никакой, так что извиняйте. Код в архиве, а также модель в Протеусе обновлена.

Скачать библиотеку + пример.

Exit mobile version