AVR Урок 12. LCD индикатор 16×2. Часть 2



 

Урок 12

Часть 2

 

LCD индикатор 16×2

 

Сегодня мы продолжим изучение жидкокристаллического индикатора символьного, который способен выводить определённые символы в две строки по 16 символов в каждую.

Вернёмся в проект Atmel Studio и начнём думать, как нам начать писать инициализацию дисплея. По приведённой выше диаграмме из даташита мы видим, что мы через определённое время должны три раза дисплею передать двоичное число 11, и тогда контроллер дисплея «поймёт», что от него хотят именно того, чтобы он общался с нами в 4-х битном режиме и чтобы он в данный режим как-то переключился. Напишем функцию инициализации дисплея. Код данной функции мы разместим перед функцией main()

 

//—————————————-

void LCD_ini(void)

{

}

//—————————————-

 

 

Вызовем данную функцию также в функции main()

 

port_ini(); //Инициализируем порты

LCD_ini(); //Инициализируем дисплей

 

Теперь начнём писать код в теле данной функции. Начнём с того. что судя по диаграмме инициализации из технической докуметации мы должны подождать сначла не менее 15 милисекунд

 

void LCD_ini(void)

{

_delay_ms(15); //Ждем 15 мс

 

А дальше мы должны как-то передавать контроллеру дисплея байты. Но так как мы байты сразу передавать не можем, ибо у нас даже ножки данных половина не подключены, то передавать мы будем полубайты. Так как это не совсем простой процесс, предлагаю завести под это дело ещё одну функцию и назвать её sendhalfbyte. В качестве входного параметра мы ей будем передавать unsigned char, так как у нас 4-битных переменных не бывает, мы просто не будем использовать в данной переменной первые 4 бита. Разместим код данной функции над кодом функции LCD_ini

 

//—————————————-

void sendhalfbyte(unsigned char c)

{

 

}

//—————————————-

 

 

Сначала мы сдвинем наш входной аргумент влево на 4 бита, так как работаем мы со старшими разрядами шины (4-7). И не просто сдвинем, а этому же аргументу и присвоим, написав после операции сдвига знак равно.

 

void sendhalfbyte(unsigned char c)

{

  c<<=4;

 

Давайте ещё напишем несколько макроподстановок для удобства работы с линиями E и RS, то есть их включение и выключение. Зная, на каких ножках порта D данные линии находятся и используя багаж знаний предыдущих занятий нам будет это сделать очень легко

 

#include <util/delay.h>

//—————————————-

#define e1 PORTD|=0b00001000 // установка линии E в 1

#define e0 PORTD&=0b11110111 // установка линии E в 0

#define rs1 PORTD|=0b00000100 // установка линии RS в 1 (данные)

#define rs0 PORTD&=0b11111011 // установка линии RS в 0 (команда)

//—————————————-

 

Вернёмся в нашу функцию передачи полубайта, включим линию E, для того чтобы сказать дисплею, что мы будем передавать командуЗатем мы подождём 50 микросекунд, хотя достаточно судя по таймингам гораздо меньше, затем сотрём информацию на ножках 4-7 порта D, остальные ножки не трогаем, затем установим нужные биты на шине данных из переменной c, в которой находятся данные биты. Потом мы отключим линию E, вот тут как раз и получится отрицательный фронт, затем подождём ещё 50 микросекунд на всякий случай, хотя написано 38 для записи в DDRAM или в RAM

 

  c<<=4;

  e1; //включаем линию Е

  _delay_us(50);

  PORTD&=0b00001111; //стираем информацию на входах DB4-DB7, остальное не трогаем

  PORTD|=c;

  e0; //выключаем линию Е

  _delay_us(50);

}

 

Использовать данную функцию мы будем уже в следующей части занятия.

 

 

Предыдущая часть Программирование МК AVR Следующая часть

 

Техническая документация на дисплей

Техническая документация на контроллер дисплея HD44780

 

Программатор и дисплей можно приобрести здесь:

Программатор (продавец надёжный) USBASP USBISP 2.0

Дисплей LCD 16×2

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

AVR LCD индикатор 16×2

7 комментариев на “AVR Урок 12. LCD индикатор 16×2. Часть 2
  1. юрий:

    объясните зачем в фунции sendhalfbyte выключать линию е0 видь при стирании командой PORTD&=0b00001111 мы перезапишем байт который был установлен при помощи е1 или я что то не так понял

  2. Андрей:

    Задержка в 50 мкс откуда Вы взяли timing? Запутался.
    c<<=4;

    e1; //включаем линию Е

    _delay_us(50); ??????

    PORTD&=0b00001111;

  3. Qadir:

    Подскажите пожалуйста что значит это выражение PORTD&=0b11110111

  4. Влад:

    Интересная ситуация: если под управляющие ножки E и RS определены пины того же порта D, то каким образом из МК отправляются данные? Ведь при отправке данных эти биты установлены в состояние 1, а если число, которое отправляется из МК, не должно содержать единицы в этих битах?

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

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

*