Ошибка базы данных 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

1

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

  • 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.

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

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

admin

1 комментарий

  1. Ошибка базы данных 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

class="comment byuser comment-author-pepko007 even thread-even depth-1">

А как правильно выводить символы на русском ? а то как не запишу то не выходит

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *